Mybatis底层原理总结(一) 转

协变冰川
• 阅读 123

本文适合对Mybatis有一定了解的。

1. Mybatis 读取XML配置文件后会将内容放在一个Configuration类中,Configuration类会存在整个Mybatis生命周期,以便重复读取。SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory。

2. Mybatis中SqlSessionFactiory、SqlSession等都为接口,Mybatis默认使用的实现类为DefaultSqlSessionFactory和DefaultSqlSession类。

3. SqlSession用途主要有两种

①. 获取对应的Mapper,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。

②. 直接使用SqlSession,通过命名信息去执行SQL返回结果,该方式是IBatis版本留下的,SqlSession通过Update、Select、Insert、Delete等方法操作。

针对Mapper方式,Mybatis底层利用JDK动态代理技术实现该接口,底层最后还是使用的IBatis中SqlSession通过Update、Select、Insert、Delete等方法操作。

4.关于对象的生命周期:

①. SqlSessionFactoryBuilder的作用是创建SqlSessionFactiory,在创建完成后就会被回收,所以它的生命周期只存在于局部方法。

②.SqlSessionFactiory是单例的,作用就是创建SqlSession,每次访问数据库都需要一个SqlSession,所以SqlSessionFactiory的生命周期是贯穿整个Mybatis生命周期的,SqlSessionFactiory采用单例的原因是减少数据库连接资源。

③. SqlSession是一个会话,类似于jdbc的connection,它的生命周期是在请求数据库处理事务过程中,他是一个线程不安全的对象。多线程操作时因多注意他的隔离级别和数据库锁等。SqlSession使用需及时关闭。

④. Mapper是一个接口,它的作用是发送SQL,返回结果,因此他的生命周期不会大于SqlSession

5. 关于SqlSessionFactory的创建,Mybatis采用构造模式来完成创建。

第一步:XMLConfigBuilder解析XML配置,读出配置参数,存入Configuration类中。

第二步:Configuration类创建SqlSessionFactory。(DefaultSqlSessionFactory的构造函数传入Configuration类)

SqlSessionFactoryBuilder.builder(inputStream) inputStream为读取配置文件的流;该方法.builder中的主要内容:

XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);

SqlSessionFactory localSqlSessionFactory = build(parser.parse());

build(parser.parse())方法实则为:

public SqlSessionFactory build(Configuration config) {

   return new DefaultSqlSessionFactory(config);

}

6. 映射器由MappedStatement、SqlSource、BoundSql三部分组成。

①. MappedStatement,它保存着映射器的一个节点(select|update|insert|delete)。包括许多我们配置的SQL、SQL的ID、缓存信息、resultMap、parameterType、resultType等配置内容。

②. SqlSource,它提供BoundSql对象。是MappedStatement的一个属性。、

③. BoundSql,它是建立SQL和参数的地方,常用的三个属性:SQL、parameterObject、parameterMappings;

parameterObject就是我们传入的参数;

parameterMappings实则是List<ParameterMapping>,ParameterMapping描述了我们的参数,包括属性、名称、表达式、javaType、jdbcType、typeHandler等重要信息,通过它实现参数和SQL的结合,以便PreparedStatement能够通过它找到parameterObject对象的属性并设置参数。

SQL则为我们写的SQL语句。

---------------------

作者:Tomoya2009

来源:CSDN

原文:https://blog.csdn.net/wuke929...

点赞
收藏
评论区
推荐文章
Mybatis源码解析之执行SQL语句
作者:郑志杰mybatis操作数据库的过程//第一步:读取mybatisconfig.xml配置文件InputStreaminputStreamResources.getResourceAsStream("mybatisconfig.xml");//第二步
Element 'configuration' cannot have character [children], because the type's content type is element-only.
整合springbootmybatis时copy网上的配置,然后报错了。<configuration       <!mybatis用于生成代码的配置文件  <configurationFilesrc/main/resources/gener
zdd小小菜鸟 zdd小小菜鸟
3年前
MyBatis面试
MyBatis面试1.MyBatis中{}和${}的区别是什么?tex\{}是预编译处理,${}是字符替换。在使用{}时,MyBatis会将SQL中的{}替换成“?”,配合P
Stella981 Stella981
4年前
MyBatis基于Maven的入门
主要内容如下: 1.myBatis在maven中的配置 2.myBatis在工程中的config配置文件3.myBatis为Bean和表的映射文件4.myBatis基本的使用 myBatis在maven中的配置,在pom.xml中增加内容       1.增加依赖 ,mybatis的,还有mysql的驱动的
Stella981 Stella981
4年前
MyBatis 面试题(附答案解析)
目录MyBatis的实现逻辑MyBatis的缓存实现逻辑{}和${}的区别是什么?MyBatis中自定义标签的执行原理简述Mapper接口的工作原理在Spring中Mapper接口是如何被注入的?在Mapper接口中是否可以有重载方法?当实体类中的属性名和表中的字
Stella981 Stella981
4年前
Mybatis工作原理
引言在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹(参考:《MyBatis————基础知识》)。本片博客针对Mybatis内部工作原理进行阐述。一、Mybatis工作原理图mybatis原理图如下所示:二、工作原理解析mybatis应用程序通过SqlSessionFactoryBuilder从myb
Stella981 Stella981
4年前
MybatisPlus知识详解以及用十数个例子完成MybatisPlus的入门到进阶
1\.MybatisPlus1.1业务需求Mybatis缺点:1.Mybatis操作数据库的过程中,需要编辑大量的sql语句.无论该sql是否复杂或者简单.2.Mybatis操作时在xml配置文件中需要额外记忆单独的标签.需求:能否实现单表操作的CRUD的全自动的实现.能否实现
Stella981 Stella981
4年前
Mybatis useGeneratedKeys 填充自增主键值(使用Mysql)的原理分析
一、Mybatis配置<insertid"insert"parameterType"com.test.TestDO"keyProperty"id"useGeneratedKeys"true"useGeneratedKeys“true”时,mybatis会将自增ID值填充到TestDO对象中的id(
Stella981 Stella981
4年前
Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析
在上一篇文章Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fzhangchengzi%2Fp%2F9674527.html)
Stella981 Stella981
4年前
Mybatis之加载mybatis
概述每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的。SqlSessionFactory都是通过SqlSessionFactoryBuilder来创建的,SqlSessionFactoryBuilder需要通过Configuration对象来构建SqlSessionFactory。一个
Stella981 Stella981
4年前
MyBatis整合Spring的实现(18)
例子同一个命名空间,但是有2个配置文件,A配置文件依赖于B配置文件信息,但是在加载时,先加载B配置文件的话,那么就会报错,前面章节已经捕获了此异常并把相应的配置添加到Configuration(全局配置类)中,这里就是在加载A配置文件后,再次加载B配置文件,也就把B配置信息添加到Configuration(全局配置类)里,下面就来看一下代码吧。