上一篇文章完成了一个项目连接数据库的实践,这章节主要是认识 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 过程的理解。
关注我的微信公众号,我在上面会分享我的日常所思所想。
参考地址: