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 | <dependencies> |
在上述代码中,我们添加两个依赖,每项依赖使用三个字段进行描述,分别表示如下含义
<groupid>:指定工程组,一个工程组包含一类相关联的项目<artifactid>:制品ID,用于指定唯一的依赖名(项目名称)<version>:指定依赖版本
配置MyBatis
在resources文件夹下添加MyBatis配置文件mybatis-config.xml,在该文件中我们对本项目使用到的MyBatis进行全局配置。该文件中,我们将设置本项目对数据库的连接实例(DataSource)和决定事务范围和控制方式的事务管理器
事务:在数据库管理系统中,事务(Transaction)是一组逻辑上相关的操作单元,其要么成功执行,要么执行失败并回滚,从而保证数据的一致性和完整性
1 |
|
- 头部黑体部分XML声明,用于验证XML文档的正确性。
DOCTYPE用于指定XML文件类型,DTD为文档类型定义,用于约束XML文件的编写规范 enviroment元素中指定事务管理/transactionManager和连接池/dataSource的配置mappers元素指定一组mapper映射器
在本项目中,对dataSource元素的属性需要进行如下设置
1 | <--! 第一个属性设置MySQL的JDBC驱动 --> |
SQL高级映射
每个MyBatis应用程序基本都满足一下使用流程

会话连接
能够获取mysql数据库的连接池,关键在于使用sqlSessionFactoryBuilder函数工具构建sqlSessionFactory对象实例,而sqlSessionFactoryBuilder函数的逻辑则从资源配置文件mybatis-config.xml文件中获取,以下是创建sqlSessionFactory实例的标准代码
1 | String resource = "mybatis-config.xml"; |
注意在上述创建实例的流程中,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 |
|
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类型,并对其进行语法检查和标注
