后端学习笔记-认识 MyBatis

上一篇文章完成了一个项目连接数据库的实践,这章节主要是认识 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),或类名和包名等。

我们这里使用的是「相对于类路径的资源引用」,引用方式如图

Untitled

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 来执行命令,获取映射器实例和管理事务。
  • 我们通过调用 SqlSessionselectList 方法来对应数据列表。
  • 通过调用 sqlSession 实例的 close 方法来关闭数据库会话。对于打开的任何 session,都要保证它们被妥善关闭,这很重要。

更多的 MyBatis 相关的 Java API 介绍在这里 (opens new window)

以上就是对上一篇文章中配置 MyBatis 过程的理解。


关注我的微信公众号,我在上面会分享我的日常所思所想。

参考地址:

  1. MyBatis官网-什么是 MyBatis? (opens new window)