概述

MyBatis是一个支持自定义SQL、存储过程和高级映射的持久层框架。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官网 Github Releases (jar文件下载) 官方文档 - 入门

简单入门

  • 编写MyBatis核心配置文件

    mybatis-config.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?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">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    </dataSource>
    </environment>
    </environments>
    <mappers>

    </mappers>
    </configuration>
  • 定义Dao层接口

    com.coderxi.dao.StudentDao
    1
    2
    3
    public interface StudentDao {
    List<Student> selectAll();
    }
  • 使用XML定义语句

    StudentDao.xml
    1
    2
    3
    4
    5
    6
    7
    <?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">
    <mapper namespace="com.coderxi.dao.StudentDao">
    <select id="selectAll" resultType="com.coderxi.bean.Student">
    SELECT * FROM student
    </select>
    </mapper>

    命名空间(namespace)的作用有两个,一个是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。

  • 在核心配置文件的mappers标签中添加一个mapper子标签

    mybatis-config.xml
    1
    2
    3
    <mappers>
    <mapper resource="com/coderxi/dao/StudentDao.xml"/>
    </mappers>
  • 从XML中构建SqlSessionFactory
    从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径(src/)下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。
    MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

    1
    2
    3
    4
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    inputStream.close();
  • 从 SqlSessionFactory中获取SqlSession并执行

    1
    2
    3
    4
    try (SqlSession session = sqlSessionFactory.openSession()) {
    StudentDao mapper = session.getMapper(StudentDao.class);
    List<Student> students = mapper.selectAll();
    }

核心配置文件

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

properties

  • 直接在配置文件中设置属性,然后在本文件内使用
    mybatis-config.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <properties>
    <property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/test" />
    <property name="jdbc.username" value="root" />
    <property name="jdbc.password" value="root" />
    </properties>
    ...
    <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    </dataSource>
  • 链接外部properties文件以此实现配置文件分离
    mybatis-config.xml
    1
    2
    3
    4
    5
    6
    7
    8
    <properties resource="jdbc.properties"/>
    ...
    <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </dataSource>
    jdbc.properties
    1
    2
    3
    4
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.username=root
    jdbc.password=root
    jdbc.url=jdbc:mysql://localhost:3306/test

typeAliases(类型别名)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

  • mybatis-config.xml
    1
    2
    3
    4
    <typeAliases>
    <typeAlias alias="user" type="com.coderxi.pojo.User"/>
    <typeAlias alias="item" type="com.coderxi.pojo.Item"/>
    </typeAliases>
    当这样配置时,user 可以用在任何使用 com.coderxi.pojo.User 的地方。
  • 也可以指定一个包名,MyBatis 会在包名下面搜索需要的实体类
    mybatis-config.xml
    1
    2
    3
    <typeAliases>
    <package name="com.coderxi.pojo"/>
    </typeAliases>
    每一个在包 com.coderxi.pojo 中的类,在没有注解的情况下,会使用 类名的首字母小写 的非限定类名来作为它的别名。也就是和上方一致。 若有注解,则别名为其注解值。
    com.coderxi.pojo.User
    1
    2
    3
    4
    @Alias("user")
    public class User {
    ...
    }
  • mybatis内置的别名可以在官网中查看

mappers(映射器)

MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。

1
2
3
4
<mappers>
<mapper resource="com/coderxi/mappers/UserMapper.xml"/>
<mapper resource="com/coderxi/mappers/ItemMapper.xml"/>
</mappers>
1
2
3
4
<mappers>
<mapper url="file://.../mappers/UserMapper.xml"/>
<mapper url="file://.../mappers/ItemMapper.xml"/>
</mappers>

适用于接口注解开发

1
2
3
4
<mappers>
<mapper class="com.coderxi.dao.UserDao"/>
<mapper class="com.coderxi.dao.ItemDao"/>
</mappers>
1
2
3
4
public interface UserDao {
@Select("select * from user where id=#{id}")
public User getUserById(int id);
}

同接口名用法,适用于接口注解开发

1
2
3
<mappers>
<package name="com.coderxi.dao"/>
</mappers>

缓存

一级缓存

一级缓存是SqlSession级别的缓存(作用于一次会话),默认开启
刷新方式:

  • 执行增删改时候会强制刷新缓存
  • sqlSession.clearCache()

二级缓存

二级缓存是namespace级别的缓存,需要在Mapper映射文件中手动开启

  • 使用二级缓存之前,最好在mybatis-config.xml中声明一下
    1
    2
    3
    <settings>
    <setting name="cacheEnabled" value="true">
    </setting>
    来告诉别人这个项目使用了二级缓存(默认是开启的不好识别
  • 在Mapper映射文件中使用<cache/>
  • 实体类需要实现序列化接口implements SerializeAble
  • 官网更详细的使用