0%

MyBatis

MyBatis简介:MyBatis是支持定制化SQL、存储过程以及高级映射的持久层框架,该框架几乎避开了所有JDBC代码。Mybatis可以对其自身配置和原生Map映射使用xml注解,并且可以将java中的接口POJOs(Plain Old Java Object)映射为数据库中的记录

添加依赖

我们将在Maven项目配置文件pom.xml中添加本项目对MyBatis的依赖

pom.xml (Project Object Model)项目对象文件,是Maven工程的基本单元。在POM文件中,我们一般指定以下配置

  • 项目依赖 <dependencies> </dependencies>
  • 插件 <plugin> </plugin> 插件是Maven构建项目过程中扩展功能的组件
  • 项目版本

等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
</dependencies>

在上述代码中,我们添加两个依赖,每项依赖使用三个字段进行描述,分别表示如下含义

  • <groupid>:指定工程组,一个工程组包含一类相关联的项目
  • <artifactid>制品ID,用于指定唯一的依赖名(项目名称)
  • <version>:指定依赖版本

配置MyBatis

resources文件夹下添加MyBatis配置文件mybatis-config.xml,在该文件中我们对本项目使用到的MyBatis进行全局配置。该文件中,我们将设置本项目对数据库的连接实例(DataSource)和决定事务范围和控制方式的事务管理器

事务:在数据库管理系统中,事务(Transaction)是一组逻辑上相关的操作单元,其要么成功执行,要么执行失败并回滚,从而保证数据的一致性和完整性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
  • 头部黑体部分XML声明,用于验证XML文档的正确性。DOCTYPE用于指定XML文件类型,DTD为文档类型定义,用于约束XML文件的编写规范
  • enviroment元素中指定事务管理/transactionManager连接池/dataSource的配置
  • mappers元素指定一组mapper映射器

在本项目中,对dataSource元素的属性需要进行如下设置

1
2
3
4
5
6
<--! 第一个属性设置MySQL的JDBC驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<--! 第二个属性设置数据库连接的URL,其中?后设置连接参数 -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ben?useUnicode=true&amp;characterEncodeing=utf8"/>
<property name="username" value="root"/>
<property name="password" value="zhoubecheng123@"/>

SQL高级映射

每个MyBatis应用程序基本都满足一下使用流程

会话连接

能够获取mysql数据库的连接池,关键在于使用sqlSessionFactoryBuilder函数工具构建sqlSessionFactory对象实例,而sqlSessionFactoryBuilder函数的逻辑则从资源配置文件mybatis-config.xml文件中获取,以下是创建sqlSessionFactory实例的标准代码

1
2
3
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

注意在上述创建实例的流程中,getResourceAsStream函数会抛出一个异常我们必须处理——当resource指向的资源配置文件查询不到时,会抛出IOException错误,在测试函数中我们使用throws关键字将异常抛出,将由上一次处理

获取会话实例

MyBatis中,sqlSession是其核心数据结构,它代表和数据库的一次会话,通过如下方法构建一个sqlSession对象

1
SqlSession sqlSession = sqlSessionFactory.openSession(true);

openSession创建函数的参数true的含义是开启自动提交,意味着在执行完SQL语句后,事务会自动提交,不需要手动调用sqlSession.commit()方法

关于事务事务提交

  • 事务具有ACID四个重要的属性
    • Atom原子性:事务是不可分割的工作过程,事务中的操作要么全部完成,要么全部不完成
    • Consistency一致性:事务必须使数据库从一个状态转化到另一个状态
    • Isolation隔离性:一个事务的执行不会受到其他事务的影响
    • Durability持久性:一旦事务完成,其执行结果会永久的保存在数据库中
  • 事务提交,指的是将事务的操作结果永久的保存在数据库中,如果事务提交成功,那么事务的所有结果都会永久的反映在数据库中;如果提交事务之前发生了任何错误,那么事务中的所有更改都会被撤销,数据库回到事务开始之前的状态

Mapper接口实现

注意:

  • 在定义接口Mapper时,该接口的名称就对应于等会儿.xml映射实现文件的名称,两者同名
  • 每一个为接口实现映射逻辑的xml文件都需要在MyBatis全局配置文件中注册,注册地点是mappers标签

以下是一个SQL单记录查询的实现

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ben.mapper.ClazzMapper">
<select id="selectById" resultType="com.ben.entity.ClazzBean">
select * from test where id = #{id}
</select>
</mapper>

Tips:

  • 每一个mapper元素对应的命名空间即接口的类包路径,给定命名空间后,该mapper元素将为该指定接口实现所有SQL逻辑映射
  • select元素中的id属性用于执行实现接口中的相应成员函数,而resultType属性指定SQL语句执行后的返回类型,注意该返回类型需要使用绝对类型名
  • 在标签体中,使用#{}表达式获取具体的函数参数,可通过函数参数名参数下标两种方法指定参数

获取Mapper接口实例

通过selSession实例中的getMapper(Mapper.class)函数,我们将获得该Mapper映射接口的实现,从此便可以调用该接口中的具体函数

1
ClazzMapper clazzMapper = sqlSession.getMapper(ClazzMapper.class);

类型的class属性

在java中,每一个类型都有一个对应的Class对象,该对象包含关于这个类型的元数据,即这个类的名称、父类、构造函数、成员方法、实现的接口等等,在getMapper函数中通过获取Mapper映射接口的Class对象,我们可以获取该接口的具体逻辑实现

IDE Note

Idea Note:在项目结构设置中,我们可以在文件 -> 项目框架 -> 模块中对项目各文件夹进行设置,不同性质的文件夹在其中新建文件时选项不同

  • 设置src文件夹为普通文件夹(不设置任何特殊属性)
  • src/main/resourecs为资源文件夹
  • target为排除文件夹
  • src/main/java为源文件夹,源代码所在处

注意在源文件夹中,如果右键选择创建一个.java文件,并试图在空文件中编辑一个新的类型时,Idea并不会认为这是一个java类型,并且避免对该类型代码的静态语法检查。区别于使用右键 -> 创建java类型得到的文件,虽然和前者一样都是.java后缀的文件,但是Idea会显式发现这是一个java类型,并对其进行语法检查和标注