mybatis update 返回影响条数_Mybatis 底层源码分析

本文深入探讨了MyBatis的源码,分析了update操作返回影响条数的机制。从Configuration.xml配置文件开始,讲解了数据源、事务管理、环境配置、映射器等核心组件。特别提到了Executor执行器在处理update操作时的角色,以及如何通过StatementHandler和ResultSetHandler处理数据库交互。通过对MyBatis框架的深入了解,有助于优化数据库操作和提升开发效率。
摘要由CSDN通过智能技术生成

MyBatis 流程图

47decedcea2395e6da7038647a0a7a7d.png

MyBatis 源码分析

Configuration.xml

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

Properties (属性)

  • 将数据库连接参数单独配置在 db.properties 中,放在类路径下。这样只需要在SqlMapConfig.xml 中加载 db.properties 的属性值。这样在 SqlMapConfig.xml 中就不需要对数据库连接参数硬编码。
  • 将数据库连接参数只配置在 db.properties 中,原因:方便对参数进行统一管理

Settings (全局配置参数)

  • Mybatis 全局配置参数,全局参数将会影响 mybatis 的运行行为。比如:开启二级缓存、开启延迟加载

TypeAliases (类型别名)

  • 类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关, 只用来减少类完全限定名的多余部分

Plugins (插件)

  • MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。但是要记得一个很重要的问题:你可以配置多种环境,但每个数据库对应一个 SqlSessionFactory。所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。

Environments (环境集合属性对象)

dc35941420a7be78ee4b4b1db1431cc8.png
  • MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。但是要记得一个很重要的问题:你可以配置多种环境,但每个数据库对应一个 SqlSessionFactory。所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。

Environment (环境子属性对象)

TransactionManager (事务管理)

在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”)

DataSource (数据源)

UNPOOLED|POOLED|JNDI

Mappers (映射器)

7d8431f549adb808a6aae2e4e177922e.png

指定映射配置文件位置

  • <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 的核心

Mapper.xml文件夹中的标签ResultMap

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

Mapper.xml文件夹中的标签Cache

开启二级缓存

Mapper.xml文件夹中的标签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

312b31e1c1caa3dfad9168843c19e48a.png

8e39f416cfeea5cb8342d02924305bbc.png

b5b686bc9bb4a1408a5f4ce0bd52ce3d.png
  • 该类是 SqlSessionFactory(会话工厂)的构建者类,之前描述的操作其实全是从这里面开启的,首先就是调用 XMLConfigBuilder 类的构造器来创建一个 XML 配置构建器对象,利用这个构建器对象来调用其解析方法 parse()来完成 Configuration 对象的创建,之后以这个配置对象为参数调用会话工厂构建者类中的 build(Configuration config)方法来完成SqlSessionFactory(会话工厂)对象的构建。

XMLConfigBuilder

ac7640e5c054622a9bde5aba34612186.png

dcb2d8dfb3d21f84a1c9ec286f6979a3.png

80ec5869eb72f3d852822cdef99698b6.png

29a4593edd9b2f61668df5f03231c84f.png
  • 该类是 XML 配置构建者类,是用来通过 XML 配置文件来构建 Configuration 对象实例,构建的过程就是解析 Configuration.xml 配置文件的过程,期间会将从配置文件中获取到的指定标签的值逐个添加到之前创建好的默认 Configuration 对象实例中。

Configuration

  • 该对象是 Mybatis 的上下文对象,实例化这个类的目的就是为了使用其对象作为项目全局配置对象,这样通过配置文件配置的信息可以保存在这个配置对象中,而这个配置对象在创建好之后是保存在 JVM 的 Heap 内存中的,方便随时读取。不然每次需要配置信息的时候都要临时从磁盘配置文件中获取,代码复用性差的同时,也不利于开发.

DefaultSqlSessionFactory

e1bc16a73fa0682238c913d957fcb056.png

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

Executor

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

Executor 继承结构

0368539a3b62ece5ec56b05336db2ad0.png

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 来进行调用的。
  • 这个处理器的作用就是对返回结果进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值