MyBatis源码分析

1.首先我们先了解一下Mybatis是什么

MyBatis 是一个开源、轻量级的数据持久化框架,是 JDBC 和 Hibernate 的替代方案。MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。

2.工作原理和示例代码:(如图所示)

这里是一个查询总行数的 Test类:

总体步骤为:

1、加载核心配置文件到Configuration

2、构建SqlSessionFactory

3、打开SqlSession会话

4、Executor开始处理请求

5、SqlSource解析SQL语句

6、StatementHandler执行SQL语句

7、ParameterHandler设置参数

8、StatementHandler执行SQL语句

9、ResultSetHandler处理结果集

3.Configuration:

Configuration类,是框架的核心配置类,保存了包括映射器、别名、映射方法等信息(保存着Mybatis的重要信息)

4.build()原理:

build()实际上是一个初始化的工作:

当我们点进build()看时会看到build()会调用自己的方法,

 点开这个方法,就可以看到她真正的面目:

使用debug可以查看他的返回值:

 这样子不难看出:XMLConfigBuilder用来解析Mybatis核心配置的解析器,parse()方 法返回Configuration。

如何得到Configuration的呢?我们继续往下看:

4.1 parse():

发现parse()方法使用XPath语法找到Configuration配置的根节点:

 得到Configuration根节点之后,解析核心配置:

5. mapperE lement:

XML MapperBuilder用来解析Mybatis的映射文件( Mapper)

Configuration.typeHandlerRegistry属性
TypeHandlerRegistry.<init>()注册各种java->数据库的类型处理器Configuration.typeAliasRegistry属性
TypeAliasRegistry.<init>()注册各种基本类型的别名
Configuration.typeHandlerRegistry属性
TypeHandlerRegistry.<init>()注册各种java->数据库的类型处理器Configuration.typeAliasRegistry属性
TypeAliasRgistry.<init>()注册各种基本类型的别名

 

6.创建SqlSession:

sqlSessionFactory.openSession();打开会话连接

DefaultSqlSessionFactory.openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)创建Executor执行器,是Mybatis内的核心对象,负责执行SQL语句(总负责人)
Mybatis默认用的是Simple执行器这个实现类

sqlSession.getMapper(UserMapper.class);

获取Mapper接口代理类实例

使用JDK代理创建Mapper接口代理

InvocationHandler是MapperProxy,MapperProxy是各种XxxMapper的代理类

定位到Mapper中具体的增删改查方法,得到MappedStatement对象,Executor负 责执行

在开启二级缓存的情况下,执行查询会用CachingExecutor缓存执行,如果缓存中没有数据,委托给SimpleExecutor

mapperMethod.execute(sqlSession, args);
执行Sql语句查询,由于我的返回结果是一个 User对象,所以会走到
result = sqlSession.selectOne(command.getName(), param);这一行,查询一条记录
实际走到 DefaultSqlSession.selectOne()

7.未完待续......
 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值