上一篇文章完成了一个项目连接数据库的实践,这章节主要是认识 MyBatis 以及梳理它在工程中的相关配置。
回顾一下 MyBatis 的定义
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
安装 MyBatis 的过程上一章也有具体的实践,其实就是在 Maven 的 pom.xml 文件中添加依赖就好了。
# 两个XML 配置
最开始让我困惑的其实两个 XML 的关系,即 MyBatisConfig.xml 以及 Mapper.xml。下面介绍一下
# MyBatisConfig.xml
这个是 MyBatis 的配置文件,用于配置和定制化 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">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/fanthus?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="mysql_333"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/fanthus/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
关于环境(environments)配置。 MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;上面的 XML 中,将 environments 默认设置为了 development 环境。
但是实际公司的项目中,并不是这么做的…
关于事物管理器(transactionManager)。 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"),这里用的 JDBC 类型的配置,这个配置直接使用了 JDBC 的提交和回滚功能。
关于数据源(dataSource)。 dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。具体的类型使用的事 POOLED, 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
在数据原理设置了数据源的相关属性,这里用到的是四个属性,如下
driver– 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。url– 这是数据库的 JDBC URL 地址。username– 登录数据库的用户名。password– 登录数据库的密码。
以上是数据库连接侧的相关配置,想要让数据库和我们实际开发中的类结合起来就需要映射器(mappers)。
首先,我们需要告诉 MyBatis 到哪里去找到 SQL 映射语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。
我们这里使用的是「相对于类路径的资源引用」,引用方式如图

Mybatis 的更多配置在这里 (opens new window)。
# Mapper.xml
这 Mapper.XML 就是上面所说的映射文件,即上图中的 StudentMapper.xml 文件。
<mapper namespace="com.fanthus.mapper">
<select id="listAllStudents" resultType="com.fanthus.springpractice.model.Student">
select * from Student;
</select>
</mapper>
XML 文件中 mapper 根节点指定了命名空间,每个映射文件可以起唯一的命名空间,即如果不同映射文件的 SQL 语句 id 一样也不会产生冲突。
我们对数据库的操作,目前只使用了 select 语句,我们这里的语句名为 listAllStudents,没有接收参数,返回一个 Student 类型的对象。
id表示在命名空间中唯一的标识符,可以被用来引用这条语句。resultType表示期望从这条语句中返回结果的类全限定名或别名。
映射文件的更多配置在这里 (opens new window)。
# MyBatis 使用
以上基本上是从配置层面说明了 MyBatis 应该如何配置,接下来就是 MyBatis 使用,上篇文章是通过写一个单元测试的方式来验证,我们对 MyBatis 的操作。我们也就通过这个单元测试来熟悉一下 MyBatis 在代码层面的使用。
代码如下
//获得核心配置文件
InputStream in = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 打开一个新的SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得会话对象
List<Student> students = sqlSession.selectList("com.fanthus.mapper.listAllStudents");
System.out.println(students);
sqlSession.close(); //关闭
代码解释
- 从 MyBatis 配置文件中读取文件内容
SqlSessionFactoryBuilder通过配置文件内容来创建SqlSessionFactory类SqlSessionFactory创建SqlSession类实例。SqlSession是使用 MyBatis 的最主要 Java 接口。 我们可以通过SqlSession来执行命令,获取映射器实例和管理事务。- 我们通过调用
SqlSession的selectList方法来对应数据列表。 - 通过调用
sqlSession实例的close方法来关闭数据库会话。对于打开的任何 session,都要保证它们被妥善关闭,这很重要。
更多的 MyBatis 相关的 Java API 介绍在这里 (opens new window)。
以上就是对上一篇文章中配置 MyBatis 过程的理解。
关注我的微信公众号,我在上面会分享我的日常所思所想。

参考地址: