mybatis实现原理

116 阅读3分钟

文章目录

mybatis结构和流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ztjjxR2-1605862409667)(en-resource://database/720:1)]

简单流程

1.读取mybatis配置

将mybatis配置文件读取成input输入流

2.创建SqlSessionFactory

执行SqlSessionFactoryBuilder的builde方法参数为第一步中的输入流,得到SqlSessionFactory对象
初始化配置文件信息的本质就是创建Configuration对象,将解析的xml数据封装到Configuration内部的属性中。

  • XMLConfigBuilder解析配置中的参数获取数据库源
  • XMLMapperBuilder读取mapper配置文件

3.执行sql

  • 当需要执行sql时,获取到相应的sqlsession,
  • 根据传入的Statement Id和参数由excutor进行sql装配和解析
  • 最后调用jdbc执行sql,再有excutor封装返回结果

重点知识

有几种创建mapper方式?优先级由高到底是什么?

<configuration>  
    <mappers>  
        <package name="com.test.mapper"/>  
    </mappers>  
</configuration>  
  • package目录
<configuration>  
    <mappers>  
        <!-- 使用这个方案,可以单独指定Mapper的位置 -->  
        <mapper resource="mybatis/mappings/UserMapper.xml"/>  
    </mappers>  
</configuration> 
  • resource相对位置
<configuration>  
    <mappers>  
        <!-- 使用这个方案,可以单独指定Mapper的位置 -->  
        <mapper url="file://详细地址"/>  
    </mappers>  
</configuration>
  • url绝对位置
<configuration>  
    <mappers>       
        <mapper class="com.test.mapper.UseMapper"/>  
    </mappers>  
</configuration> 

class工程包名+路径

mybatis 事务管理机制

MyBatis将事务抽象成了Transaction接口
该接口定义了创建(create)、提交(commit)、回滚(rollback)、关闭(close)

配置

<environment>
	<transactionManager type="JDBC"/>
</environment>

mybatis config中其子节点 的type 会决定我们用什么类型的事务管理机制。

创建

通过指定的Connection对象创建Transaction或者通过数据源DataSource来创建Transaction

使用JDBC的事务管理机制:

即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等
使用jdbc事务会创建JdbcTransactionFactory,JdbcTransaction直接使用JDBC的提交和回滚事务管理机制 。

使用MANAGED的事务管理机制:

这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(spring)来实现对事务的管理。
使用MANAGED事务会创建MangedTransactionFactory,ManagedTransaction完全由容器来实现。

mybatis缓存机制

一级缓存

在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession中完全相同的sql语句不再执行第二次,及一次会话执行两次同一个操作。

二级缓存

二级缓存默认是不开启的,需要在mapper中加入cache标签开启,但二级缓存sql语句返回对象必须是序列化之后的才可以正常使用。
二级缓存在同一个sqlsession中select语句会缓存数据,但sqlsession执行insert update delete会刷新缓存
ps:也可以增加标记Statement是否使用缓存

会话机制

在没有加事务的情况下,确实是Mapper的每次请求数据库,都会创建一个SqlSession与数据库交互,加了事务就会共用一个sqlsession

名词解释

executor 执行器组装sql设置参数,并且负责将jdbc的结果集转化为class实例
Statement 相当于某个java class中的查询方法、mapper文件中的某个sql语句
SqlSession相当于java中的class,、mapper文件
SqlSessionFactory一个mybatis服务只有一个工厂是线程安全的它相当于一个容器把所有的mapper从xml转换成了bean

参考文章

blog.csdn.net/luanlouis/a…
www.bilibili.com/video/BV14K…
blog.csdn.net/weixin_4318…