Mybatis底层源码分析

MyBatis 流程图

 

Configuration.xml 

该配置文件是 MyBatis 的全局配置文件,在这个文件中可以配置诸多项目。常用的内容是别名设置,拦截器设置等。

 

Properties(属性) :

将数据库连接参数单独配置在 db.properties 中,放在类路径下。这样只需要在SqlMapConfig.xml 中加载 db.properties 的属性值。这样在 SqlMapConfig.xml 中就不需要对数据库连接参数硬编码。

将数据库连接参数只配置在 db.properties 中,原因:方便对参数进行统一管理.
 
Settings (全局配置参数):
Mybatis 全局配置参数,全局参数将会影响 mybatis 的运行行为。比如:开启二级缓存、开启延迟加载。
 
TypeAliases (类型别名):
类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关 , 只用来减少类完全限定名的多余部分。
 
Plugins (插件):
MyBatis 允许你在某一点拦截已映射语句执行的调用。默认情况下 ,MyBatis 允许使用插件来拦截方法调用
 
Environments (环境集合属性对象):
MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。但是要记得一个很重要的问题:你可以配置多种环境,但每个数据库对应一个 SqlSessionFactory
所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。
 
Environment (环境子属性对象)
    TransactionManager (事务管理) :在 MyBatis 中有两种事务管理器类型 ( 也就是 type= [JDBC|MANAGED] )
     DataSource(数据源): UNPOOLED|POOLED|JNDI

 

Mappers(映射器)
指定映射配置文件位置
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<package name="org.mybatis.builder"/>

 

Mapper.xml
Mapper.xml 映射文件中定义了操作数据库的 sql ,每个 sql 是一个 statement ,映射文件是 mybatis 的核心

    ResultMap Mybatis 中可以使用 resultMap 完成高级输出结果映射。如果查询出来的列名和定义的pojo 属性名不一致,就可 以通过定义一个 resultMap 对列名和 pojo 属性名之间作一个映射关系。

   Cache:开启二级缓存

   Sql:可以重用的 SQL ,也可以被其他语句引用

 

Resources
Resources 工具类会从路径中加载资源,并返回一个输入流对象,对于资源文件的加载提供了简易的使用方法。
加载一个资源有很多方式:
对于简单的只读文本数据,加载为 Reader
对于简单的只读二进制或文本数据,加载为 Stream
对于可读写的二进制或文本文件,加载为 File
对于只读的配置属性文件,加载为 Properties
对于只读的通用资源,加载为 URL
按以上的顺序, Resources 类加载资源的方法如下:
Reader getResourceAsReader(String resource);
Stream getResourceAsStream(String resource);
File getResourceAsFile(String resource);
Properties getResourceAsProperties(String resource);
Url getResourceAsUrl(String resource);
 
 
SqlSessionFactoryBuilder:
该类是 SqlSessionFactory (会话工厂)的构建者类,之前描述的操作其实全是从这里面开启的,首先就是调用 XMLConfigBuilder 类的构造器来创建一个 XML 配置构建器对象, 利用这个构建器对象来调用其 解析方法 parse() 来完成 Configuration 对象的创建 ,之后以这 个配置对象为参数调用会话工厂构建者类中的 build(Configuration config) 方法来完成 SqlSessionFactory (会话工厂)对象的构建。

 

XMLConfigBuilder:
该类是 XML 配置构建者类,是用来通过 XML 配置文件来 构建 Configuration 对象实例 ,构建的过程就是 解析 Configuration.xml 配置文件 的过程,期间会将从配置文件中获取到的指 定标签的值 逐个添加到之前创建好的默认 Configuration 对象实例中
 
 
Configuration
该对象是 Mybatis 的上下文对象,实例化这个类的目的就是为了使用其对象作为项目全局配置对象,这样通过配置文件配置的信息可以保存在这个配置对象中,而这个配置对象在 创建好之后是保存在 JVM Heap 内存中的,方便随时读取。不然每次需要配置信息的时 候都要临时从磁盘配置文件中获取,代码复用性差的同时,也不利于开发

 

DefaultSqlSessionFactory :
SqlsessionFactory 该接口是会话工厂,是用来生产会话的工厂接口,DefaultSqlSessionFactory 是其实现类,是真正生产会话的工厂类, 这个类的实例的生命周期 是全局的,它只会在首次调用时生成一个实例(单例模式) ,就一直存在直到服务器关闭。

 

Executor
执行器接口, SqlSession 会话是面向程序员的,而内部真正执行数据库操作的却是Executor 执行器,可以将 Executor 看作是面向 MyBatis 执行环境的, SqlSession 就是门面货, Executor 才是实干家。通过 SqlSession 产生的数据库操作,全部是通过调用 Executor 执行器 来完成的。 Executor 是跟 SqlSession 绑定在一起的,每一个 SqlSession 都拥有一个新的 Executor 象,由 Configuration 创建。
 
   Executor 继承结构 :

 

BaseExecutor:
SimpleExecutor :每执行一次 update select ,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。(可以是 Statement PrepareStatement 对象)
 
ReuseExecutor :执行 update select ,以 sql 作为 key 查找 Statement 对象,存在就使用, 不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map<String, Statement> 内,供 下一次使用。(可以是 Statement PrepareStatement 对象)
 
BatchExecutor :执行 update (没有 select JDBC 批处理不支持 select ),将所有 sql 添加到批处理中( addBatch() ),等待统一执行( executeBatch() ),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch() 完毕后,等待逐一执行
 
CachingExecutor: 先从缓存中获取查询结果,存在就返回,不存在,再委托给 Executor delegate 去数据库 取, delegate 可以是上面任一的 SimpleExecutor ReuseExecutor BatchExecutor
 
 
StatementHandler
该类是 Statement 处理器,封装了 Statement 的各种数据库操作方法 execute() ,可见MyBatis 其实就是将操作数据库的 JDBC 操作封装起来的一个框架,同时还实现了 ORM 了。 RoutingStatementHandler ,这是一个封装类,它不提供具体的实现,只是根据 Executor 的类型,创建不同的类型 StatementHandler

 

ResultSetHandler
结果集处理器,如果是查询操作,必定会有返回结果,针对返回结果的操作,就要使用ResultSetHandler 来进行处理,这个是由 StatementHandler 来进行调用的。这个处理器的作用 就是对返回结果进行处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一款优秀的Java持久层框架,它封装了JDBC,使开发者无需关注繁琐的连接、驱动加载等细节,只需关注SQL语句本身。它采用ORM思想解决了实体和数据库映射的问题。MyBatis通过XML或注解配置要执行的SQL语句,并将Java对象和SQL的动态参数进行映射生成最终的SQL语句。最后,MyBatis执行SQL并将结果映射为Java对象返回。 总体执行流程如下: 1. 通过getResourceAsReader(String resource)方法读取mybatis.xml配置文件,生成Reader对象。 2. 使用SqlSessionFactoryBuilder的build()方法,通过构建者模式创建SqlSessionFactory对象。 3. 通过openSession()方法获取DefaultSqlSession对象,用于执行数据库操作。 4. 在进行数据库的insert、update、delete、select等操作后,通过sqlSession.commit()提交事务。 5. 最后使用sqlSession.close()关闭连接,释放资源。 解析mapper节点时,首先获取命名空间并将其放入builderAssistant对象中。然后解析cache-ref、cache、parameterMap、resultMap和Sql片段等内容。接下来是解析增删改查的地方,通过上下文构建statement对象。真正解析增删改查的方法是buildStatementFromContext(list, null)。通过构建者模式生成一个statementParser对象,用于解析增删改查标签。通过parseStatementNode()方法解析和设置各个标签的属性。最后使用构建者模式将解析得到的statement对象添加到builderAssistant对象中,用于构建statement对象。重要的是使用addMappedStatement()方法判断是否为select方法,如果是,则构建一个statement对象并将其添加到MappedStatement类型的statement变量中。最终将statement对象放入configuration对象中,将所有增删改查的标签解析为一个statement对象并放入configuration对象中。 在MyBatis底层源码中,使用了build(Reader reader, String environment, Properties properties)方法来构建SqlSessionFactory对象。实际上,该方法内部调用了build(Reader reader)方法。在build(Reader reader, String environment, Properties properties)方法中,声明了一个XMLConfigBuilder对象parser,通过parser.parse()方法解析XML配置文件,最终返回一个builde对象[3]。 总体来说,MyBatis底层源码分析涉及到读取配置文件、创建SqlSessionFactory对象、解析mapper节点、构建statement对象等过程。这些过程都有各自的细节和步骤,用于实现MyBatis的功能和特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值