【MyBatis】 MyBatis入门

摘要:
所以2010年之后,MyBatis框架逐渐成为主流,比Hibernate发展更快。IBatis和MyBatis两者的操作原理是相同的。IBatis变为了MyBatis之后,核心操作没有改变,但是配置部分有部分变化。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis的性能优于Hibernate。MyBatis官网:http://www.mybatis.org/mybatis-3/2、第一个MyBatis程序本次使用Eclipse的Maven进行项目的构建,在pom.xml文件中添加如下代码;如果使用普通Java项目按需添加Jar包即可。

1、MyBatis简介

【MyBatis】 MyBatis入门第1张

MyBatis是这个框架现在的名字,而此框架最早的名字是IBatis,其名字的含义是“internet”、“abatis”两个单词的组合,是在2002年的时候开始的一个开源项目,在2010年6月16日Apache将项目交与Google进行管理,更名MyBatis。所以2010年之后,MyBatis框架逐渐成为主流,比Hibernate发展更快。

IBatis和MyBatis两者的操作原理是相同的。IBatis变为了MyBatis之后,核心操作没有改变,但是配置部分有部分变化。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

持久层发展:实体Bean的设计思想 → JDO → Hibernate → MyBatis → JPA标准。MyBatis的性能优于Hibernate。

MyBatis官网:http://www.mybatis.org/mybatis-3/

2、第一个MyBatis程序

本次使用Eclipse的Maven进行项目的构建,在pom.xml文件中添加如下代码;如果使用普通Java项目按需添加Jar包即可。

<dependency>
    <groupId>org.mybatis</groupId>                
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

在项目下新建目录:config,将config目录添加到classpath中(Build Path)。

范例:配置数据库信息config/dbconfig.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF8
username=root
password=mysqladmin

范例:MyBatis核心配置文件config/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!--资源文件 --> 
  <properties resource="dbconfig.properties"/>
  <environments default="development">     <!--定义数据库连接池 -->
    <environment id="development">         <!--一个数据库的资源配置 -->
      <transactionManager type="JDBC"/>    <!--进行事务管理 -->
      <dataSource type="POOLED">           <!--配置数据源 -->
          <!--数据库的驱动程序路径,配置的mysql驱动包中的类名称 -->
        <property name="driver"value="${driver}"/>
        <!--数据库的连接地址 -->
        <property name="url"value="${url}"/>
        <!--数据库连接的用户名 -->
        <property name="username"value="${username}"/>
        <!--数据库的连接密码 -->
        <property name="password"value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!--配置的是每一张表的映射文件 -->
  <mappers>
    <!--映射文件路径, 与POJO类同包 -->
    <mapper resource="com/github/logsave/pojo/EmpMapper.xml"/> 
  </mappers>
</configuration>

对于一些配置做如下解释:

  1. 关于“<transactionManagertype="jdbc"/> ”配置
    此处表示进行事务的配置,但是在MyBatis中有两种事务配置方式:
    • JDBC :表示使用 JDBC 这种比较简单的方式进行事务的提交或回滚,同时它依赖于从数据源得到的连接来管理事务形式;
    • MANAGED:此配置几乎没有什么用处,它即不提交事务也不回滚事务,而是让容器来管理整个生命周期(例如:Spring 就是一个容器,负责所有对象的生命周期的控制) 。
  2. 关于“<dataSourcetype="POOLED"> ”配置
    dataSource 主要使用基本的 JDBC 数据源接口来配置 JDBC 连接对象。而在 MyBatis 之中提供有三种可用的数据源配置类型:
    • UNPOOLED:这个数据源的实现是每次请求时简单打开和关闭连接操作。不过它的性能有一些慢,如果是一些简单的应用程序可以适用,因为它不需要及时取得可用连接。不过不同的数据库对此操作的表现也有所不同,所以对某些数据库来说配置数据源不重要,那么使用的机会也就少了,几乎不用;
    • POOLED :是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间,速度会快一些,这个是现在开发之中主要使用的形式;
    • JNDI:使用一些容器里面配置的数据库连接池,此处就是配置一个名称引用。
  3. 关于“<mappers> ”配置
    这块为 MyBatis 的核心配置,主要是利用它来决定操作的数据表。

建立一张emp表,创建对应的简单Java类也是Emp类。

范例:建立数据库脚本

--创建'mybatis'数据库
CREATE DATABASE mybatis CHARACTER SETUTF8;
--创建'emp'数据表
CREATE TABLEemp (
        empno         INT(4),
        ename         VARCHAR(10) NOT NULL,
        job          VARCHAR(9) ,
        mgr          INT(4) ,
        hiredate      DATE ,
        sal          DOUBLE(7,2) ,
        PRIMARY KEY(empno)
);

范例:定义简单Java类--Emp.java

packagecom.github.logsave.pojo;
importjava.util.Date;
public classEmp {
    privateInteger empno;
    privateString ename;
    privateString job;
    privateInteger mgr;
    privateDate hiredate;
    private doublesal;
    publicInteger getEmpno() {
        returnempno;
    }
    public voidsetEmpno(Integer empno) {
        this.empno =empno;
    }
    publicString getEname() {
        returnename;
    }
    public voidsetEname(String ename) {
        this.ename =ename;
    }
    publicString getJob() {
        returnjob;
    }
    public voidsetJob(String job) {
        this.job =job;
    }
    publicInteger getMgr() {
        returnmgr;
    }
    public voidsetMgr(Integer mgr) {
        this.mgr =mgr;
    }
    publicDate getHiredate() {
        returnhiredate;
    }
    public voidsetHiredate(Date hiredate) {
        this.hiredate =hiredate;
    }
    public doublegetSal() {
        returnsal;
    }
    public void setSal(doublesal) {
        this.sal =sal;
    }
    @Override
    publicString toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", job=" +job
                + ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal=" 
                + sal + "]";
    }
}

此时虽然建立了Java类,但是简单Java类一定需要一个与它配合的映射文件。数据库Emp表对应的简单Java类是Emp.java,与Java类同一路径下新建EmpMapper.xml文件。

范例:定义EmpMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!--每个POJO都对应MyBatis的一个命名空间,不能重复。
设置命名空间,可以与不同表的同类型操作进行区分,使用时以“namespace.id”的方式调用。
命名空间任意命名,均可正常调用,确保唯一性,一般按表名称实体类或表名称。 resultType使用全路径。
--> <mapper namespace="com.github.logsave.pojo.EmpMapper"> <select id="selOne"resultType="com.github.logsave.pojo.Emp"> SELECT * FROM emp WHERE empno = #{empno} </select> <insert id="creatOne"parameterType="com.github.logsave.pojo.Emp"> INSERT INTO emp(empno,ename,job,mgr,hiredate,sal) VALUES (#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal}) </insert> </mapper>

增加操作之中是针对于简单Java类之中的内容进行取出并填充,所以在访问属性的时候使用“#{属性名称}”,编写SQL语句时最后一定不要加“;”。

多个XML配置文件及POJO之间相互引用,初学MyBatis容易出错。配置文件之间的引用关系如下图:

【MyBatis】 MyBatis入门第2张

范例:编写程序完成数据增加操作

packagecom.github.logsave.test;
importjava.io.IOException;
importjava.io.Reader;
importjava.util.Date;
importorg.apache.ibatis.io.Resources;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
importcom.github.logsave.pojo.Emp;
public classTest01 {
    public static voidcreat(SqlSession sqlSession) {
        Emp emp = newEmp();
        /**
         *  测试时运行第二次会报错:Duplicate entry '7499' for key 'PRIMARY'
         *  原因是主键冲突了,修改Empno即可。
         */
        emp.setEmpno(7499); 
        emp.setEname("ALLEN");
        emp.setJob("SALESMAN");
        emp.setMgr(7695);
        emp.setHiredate(newDate());
        emp.setSal(1600.00);
        System.out.println("数据更新行数:" 
                + sqlSession.insert("com.github.logsave.pojo.EmpMapper.creatOne",emp));
        sqlSession.commit();            //事务提交
}
    public static void selectByEmpNo(SqlSession sqlSession,intempno) {
        System.out.println(sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.selOne",empno));
    }
        public static voidmain(String[] args) {
        try{
            //1、取得操作的SqlSession对象
            String resource = "mybatis-config.xml";                  //MyBatis配置文件路径
            Reader reader = Resources.getResourceAsReader(resource); //当前配置文件输入流
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //数据库会话工厂
            SqlSession sqlSession = sqlSessionFactory.openSession(); //取得连接
            //2、操作简单Java类    
//creat(sqlSession);                     //增加数据
            selectByEmpNo(sqlSession,7499);          //按empno查询数据

            sqlSession.close();        //关闭连接
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

此时数据库之中已经正常保存了我们添加的数据。

总结一下MyBatis操作的步骤:

  • 通过 Resources 取得配置文件(mybatis-config.xml )的信息,通过 Resource 取得一个 Reader 对象路径;
  • 通过此 Reader对象肯定要读取配置,读取的配置用于实例化 SqlSessionFactoryBuilder 类对象,通过 SqlSessionBuilder 来建立 SqlSessionFactory 类对象;
  • 利用 SqlSessionFactory 打开 SqlSession 对象;
  • 利用 SqlSession 来实现数据的 CRUD 操作;
  • 如果是更新则提交事务后关闭连接。

程序源码

免责声明:文章转载自《【MyBatis】 MyBatis入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux之awk命令FFMPEG高级编程第一篇:环境搭建及编译下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mac安装Mysql

目录 一、安装 二、环境变量 2.1 MySQL服务的启停和状态的查看 三、启动 四、初始化设置 4.1 退出sql界面 五、配置 5.1 检测修改结果 一、安装 第一步:打开网址,https://www.mysql.com ,点击downloads之后跳转到https://www.mysql.com/downloads 选择Community选...

plsql导出导入 表结构、表数据、存储过程等

导出:首先点击   TOOLS,选择  EXPORT TABLES  选中你需要导出的表,   勾选  “Create tables” 是因为在导入的数据库中没有此表 如果勾选"Drop tables" 而没有勾选 “Create tables” ,而数据库中没有此表,会报表和视图不存在 Output file 为导出的路径   如果你想导的表  数据记录...

Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务

在连接数据库的时候,有时会遇到一个“ORA12514:监听程序当前无法识别连接描述符中请求的服务”的错误,这个错误其实就是数据库动态注册(关于动态注册会在稍后讲解)不生效,导致监听器无法识别客户端连接符中提供的服务名,从而拒绝建立数据库连接时报的错误信息,所以就需要对监听器配置做修改。 在这里,还需对问题进行细化,有时候可能会发现,在刚开启监听器的时候会发...

10条技巧优化数据库速度

  大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。   1、小心设计数据库   第一个技巧也许看来理所当然,但事实上大部分数据库的问题都来自于设计不好的数据库结构。   譬如我曾经遇见过将客户端信息和支付信息储存在同一个数据库...

如何通过外部表做数据一致性检查和配平

背景 随着微服务和分布式架构的兴起及用户对数据高可用的重视。现在系统中的数据会通过程序定时同步、抽数工具、复制工具等在多个数据库中存在多份。但因为程序异常、网络异常、数据异常等各种原因,会出现数据不一致的情况。如何能简单快速检测出数据不一致并且配平呢?本文通过PostgreSQL的fdw机制,介绍一种简单的配平方法。 环境准备 源数据库 IP:xx....

在平台中使用JNDI 数据源

有些情况下为了系统的安全性考虑,可以将数据源配置成JNDI,在程序中只需要使用 容器的JNDI路径就可以了。 配置方法 1.在容器中配置数据源 <Context path="/" docBase="E:work edxunhunanjdsrcmainwebapp" > <Resource name="jdbc/...