Mybatis入门

1,791 阅读4分钟

入门

安装

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

配置文件

XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)
示例(mybatisConfig.xml):

<!--文档类型声明,表明这是mybatis的配置文件-->
<?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>
  <!--配置数据库的环境,包括事务管理器和数据源-->
  <environments default="development">
    <environment id="development">
      <!--事务管理器,type可选为JDBC/MANAGED -->
      <transactionManager type="JDBC"/>
      <!--type为数据源类型,可选为POOLED/UNPOOLED/JNDI-->
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!--映射器,告诉mybatis去哪找映射文件,resource的值是XML映射文件的路径-->
  <mappers>
    <mapper resource="com/ncusoft/mybatisdemos/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

关于更多配置及用法,详见官方文档(翻译中文版的)XML映射配置文件

Mapper映射器

创建一个user表

CREATE TABLE `users` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  `sex` char(2) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

创建一个实体类Users

public class Users {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    // 这里省略了Getter/Setter方法
    @Override
    public String toString() {
        return super.toString() + "users = " + this.id + " | "+ this.username + " | "
                + this.birthday + " | " + this.sex + " | " + this.address;
    }
}

写一个接口来描述方法的接口

最后SQL语句的执行也是通过调用这个方法,再通过代理执行。

package com.ncusoft.mybatisdemos.mapper;
public interface UserMapper {
    /**
     * 根据用户id获取数据
     * @param id 用户id
     * @return Users
     */
    Users findById(Integer id);
}

编写XML映射文件(UsersMapper.xml)

它能直接映射到刚刚定义的接口中的方法,并在XML中定义要执行的SQL语句(有个要注意的是,Mapper接口和XML映射文件的路径一定要一模一样,不然就无法映射了)。
更多详细用法见Mapper XML 文件

<!--文档类型声明,表明这是mybatis的映射文件-->
<?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">
<!--namespace是对应mapper接口的全限定名-->
<mapper namespace="com.ncusoft.mybatisdemos.mapper.UsersMapper">
    <!--id是对应接口中定义的方法名,resultType是返回的类型,parameterType是参数的类型,里面包含的内容就是要执行的SQL语句,这里用到了OGNL表达式-->
    <!--这里的#{id}其实是调用了Users类的getId()方法,具体见OGNL表达式-->
    <select id="findById" resultType="com.ncusoft.mybatisdemos.entity.Users" parameterType="Integer">
        select * from users where id = #{id}
    </select>
</mapper>

使用

执行流程:

image.png

下面是一个使用示例,把这个代码放在测试代码中执行。

// 从配置文件中获取字节流(通过类加载器的方法) 配置文件应该放在项目资源的根路径下
InputStream in = Resources.getResourceAsStream("mybatisConfig.xml");
// 创建一个工厂的构建器
SqlSessionFactoryBuilder bulider = new SqlSessionFactoryBuilder();
// 构建器通过传入字节流来构建一个SqlSessionFactory,
SqlSessionFactory factory = bulider.build(in);
// 通过工厂来创建一个SqlSession实例
SqlSession session = factory.openSession();
// 通过SqlSession对象来获取Mapper接口的代理对象,用来实现Mapper接口的操作
UserMapper userMapper = session.getMapper(UserMapper.class);
// 通过刚刚创建的代理对象来执行Mapper接口中的方法
Users users = userMapper.findById(1);
System.out.println(users);

来看一下执行的结果日志并分析一下:

// 打开一个数据库连接
16:35:24.478 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
// 连接池中没有空闲连接,于是新建了一个连接
16:35:25.197 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1832532108.
// 由于factory.openSession()使用的是默认方法,所以autocommit的值将会被设置为false,也就是关闭了数据库的自动事务提交
16:35:25.197 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]
// 要执行的语句,这里使用了SQL预处理,用?做占位符
16:35:25.204 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==>  Preparing: select * from users where id = ? 
// 传入的参数, Integer类型的1
16:35:25.263 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==> Parameters: 1(Integer)
// 查询到的结果总数为1
16:35:25.348 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - <==      Total: 1
// 打印查出来的结果
com.ncusoft.mybatisdemos.entity.Users@5ba3f27ausers = 1 | 小熊 | Mon Dec 16 08:00:00 GMT+08:00 2019 | 男 | 江西九江
// SQL操作完毕,将autocommit重置为true
16:35:25.382 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]
// 关闭当前数据库连接
16:35:25.382 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]
// 连接空闲,则放回连接池中
16:35:25.383 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1832532108 to pool.