mybatis 原理图如下所示:
二、工作原理解析
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)来构建SqlSessionFactory(SqlSessionFactory是线程安全的);
然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。
说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。
详细流程如下:
1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
mybatis层次图:
1、映射文件概述
创建映射文件时一定要给映射文件添加约束头,约束头相对固定,可以直接复制:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
在映射文件只有mapper这一个根元素,在这个元素下有几个顶级元素:
cache:该命名空间的缓存配置。
cache-ref:引用其它命名空间的缓存配置。
resultMap : 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
sql : 可被其它语句引用的可重用语句块。
insert :映射插入语句。
update : 映射更新语句。
delete: 映射删除语句。
select :映射查询语句
2、插入数据操作 ——select
select元素是 MyBatis 中最常用的元素之一,因此 MyBatis 在查询和结果映射做了相当多的改进。一个简单查询的select元素是非常简单的.
<!-- 查询 User 表的全部内容 -->
<!-- id 表示唯一标识符,parameterType 表示查询返回结果全限定名或别名 -->
<select id="selectPerson" resultType="com.itlong.domain.User">
SELECT * FROM USER
</select>
select元素的一些比较常见属性:
id:在命名空间中唯一的标识符。
parameterType:传入这条语句的参数的类型。
resultType:语句中返回结果的类全限定名或别名。
resultMap:对外部 resultMap 的命名引用。
resultOrdered:该属性仅仅针对嵌套结果 select 语句,默认值为 false。
resultSets:将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔,仅适用于多结果集的情况。
timeout:在抛出异常之前,驱动程序等待数据库返回请求结果的秒数,默认没设置。
statementType:可选STATEMENT,PREPARED 或 CALLABLE,默认值:PREPARED。
上述属性可以分为三类:查询设置、查询参数和结果映射
3、增删改操作数据操作 ——insert, update 和 delete
insert, update和 delete三个元素的共有常用属