MyBatis源码分析——使用SqlSession操作数据库

9 篇文章 0 订阅
6 篇文章 0 订阅

MyBatis源码分析

使用SqlSession操作数据库

MyBatis执行数据库操作主要分为三种:使用SqlSession自带方法调用Mapper接口方法执行SQL使用注解执行SQL

SqlSession自带方法

在示例代码中使用了SqlSession.selectOne()方法来查询一条记录,参数为自定义Mapper接口路径(用于查询MappedStatement)和查询SQL的参数。接下来对SqlSession.selectOne()进行源码分析。

在DefaultSqlSession.selectOne()方法中,可以看到selectOne()方法实际是调用在DefaultSqlSession的selectList()方法,如果返回的列表大小大于1则抛出TooManyResultsException异常。
在这里插入图片描述
继续往下查看selectList(),在DefaultSqlSession.selectList()方法中可以看到,首先从Configuration对象中获取MappedStatement,而MappedStatement在Configuration中以Map<String, MappedStatement> mappedStatements形式存储,因此可以看出,在解析MappedStatement对象时,是以Mapper.xml配置文件的namespace加上下面具体SQL的id作为键存储的
在这里插入图片描述
获取到MappedStatement对象之后,调用Executor.query()方法执行查询,由于MyBatis默认开启一级缓存,所以此时实际调用的是CachingExecutor.query()。再更进一步的query()方法中,调用BaseExecutor.query(),BaseExecutor.query()方法源码如下
在这里插入图片描述
在query()方法中会创建缓存的key,通过查看CacheKey对象可知,cache的key组成为:hashcode+checksum+自定义Mapper路径+方法名+offset+查询SQL+limit+Configuration中Environment的id,示例代码中的cachekey:

-2016638596:1630768115:com.sk.test.mapper.UserMapper.selectUser:0:2147483647:select * from user where id = ?:1:development

在图中方框部分框可以看出,在执行查询时会先去本地缓存中查找,如果有则获取对象返回,非则执行queryFromDatabase()获取结果list并返回

queryFromDatabase()源码如下,在queryFromDatabase()中通过doQuery()方法进行实际查询并返回list,然后再将结果存入缓存中,这里在查询之前会首先加入缓存并占位,在查询结束后再清除该缓存。
在这里插入图片描述
在doQuery()中首先通过Configuration获取StatementHandler对象,再调用StatementHandler实现类SimpleStatementHandler.query()执行sql并使用ResultSetHandler对结果进行处理并返回。

整体操作流程

整体执行流程如下:
在这里插入图片描述

相关参考

MyBatis源码分析——MyBatis核心组件和开启SqlSession
MyBatis源码分析——使用SqlSession操作数据库
MyBatis源码分析——调用Mapper接口方法执行SQL
MyBatis源码分析——使用注解执行SQL

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值