MyBatis源码解读2(2.1、核心对象)

二、MyBatis的核心对象

2.1、核心对象

2.1、MappedStatement

MyBatis其实是对JDBC的进一步封装,我们都知道JDBC有几个重要的对象:

  1. Statement
  2. Prepared Statement
  3. Callable Statement
  4. ResultSet

image-20230618182852840Statement、Prepared Statement、Callable Statement分别与数据与进行交互,最终执行返回的结果由ResultSet进行封装。而SqlSession是对上述步骤进行进一步的封装。

mybatis-config.xml最终被封装成了Configuration对象。我们点啊看iabatis的Configuration类可以发现,environment标签都封装在了Configuration这个类的Environment属性当中,而mapper.xml文件中的一个一个的标签一般会被封装在MappedStatement这个对象中,这就注定了一个Mybatis应用中会有N个MappedStatement对象。

image-20230618194011980

还有一个我们很常见的二级缓存的配置在Configuration类中也有对应的属性。我们可以发现他的默认值为true,所以这个属性我们写不写都可以,因为是默认开启的。

image-20230618194226910

而我们写别名的<typeAlioases>标签被mybatis封装成的对象是TypeAliasRegistry

image-20230618223437255

对于mapper.xml文件的注册,我们可以封装在<mappers>这个标签里面,而被mybatis封装的对象是loadedResources。

image-20230618223622443

而最重要的是写sql语句的mapper.xml文件,在Configuration对象中也做了汇总进行封装。

image-20230618223739810

那么此时问题来了,我们写在标签里面的sql语句最终会被封装到哪里了呢?因为sql语句是写在标签里面的,每一个标签都被封装成了一个个的MappedStatement对象,所以我们需要在MappedStatement对象里面去找。我们往下翻会发现一个getBoundSql方法。

image-20230622115532337

我们会发现他的返回值是叫一个BoundSql的对象,这个对象其实就是MyBatis对sql语句的封装。我们点进去看看这个对象,他有这么几个属性。我们来挨个分析一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. private final String sql:用于封装我们写的sql
  2. 其他的用于封装各种参数。

2.2、Executor

Executor是MyBatis中处理功能的核心,对应增删改Executor提供了对应的方法来执行这些操作。

我们打开源码可以发现,Executor是一个接口(一般涉及到操作相关的类型,尽量设计成接口),我们点住alt+7可以打开大纲,看看所有的方法。

image-20230622143227566

我们可以看到他主要有两类方法:

  1. update:对应的是sql中的增删改,只要是对于数据库有改动的操作都统一归为update
  2. query:对应的是sql中的查询操作。
  3. commit、rollback、getTransaction:与事务相关的操作,包括提交、回滚等。
  4. createCacheKey、isCached:与缓存相关的操作。

Executor接口有3个比较重要的实现:

  1. BatchExecutor:批处理操作,一次链接,执行多条sql。
  2. ReuseExecutor:复用Statement,只要你的sql一样,用的Statement就是一样的。这个Executor比较少用,因为我们很少执行同样的sql,同类型的sql哪怕参数不同都不叫一样的sql
  3. SimpleExecutor:最常用的Executor,也是MyBatis默认的Executor。

image-20230622153251883

2.3、StatementHandler

StatementHandler是MyBatis封装的JDBC的Statement,MyBatis访问数据库操作真正的核心。我们来看一下StatementHandler的源码。

image-20230622165215901

可以看到都是一些简单的增删改查操作。

2.4、ParamentHandler

ParamentHandlerd的作用是把处理参数,把MyBatis的参数替换成底层JDBC的参数。

2.5、ResultSetHandler

ResultSetHandler封装的是JDBC的ResultSet。他的作用是对JDBC中查询结果集ResultSet进行封装。

image-20230622170924560

2.6、TypeHandler

用于处理数据库类型与Java类型之间转换的过程。

2.7、总结

作为总结,我们就来简单的跟一下insert的源码。

SqlSession的insert方法。

image-20230622174401502

DefaultSqlSessionSession的insert方法,我们可以发现insert方法调用的其实是update方法。

image-20230622174442331

还是在DefaultSqlSessionSession同一个类中的update方法。

image-20230622174528602

接着走到了Executor的update方法,注意这个Executor是默认的SimpleExecutor

image-20230622174614909

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五岁小孩新之助

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值