【Mybatis源码解析】深入了解<select>等标签的实现流程(一)

前言

以前只知道select标签的个别属性用法,并不了解其实现流程与原理,正巧,最近在学习Cache一二级缓存,看到与select标签相关的属性,就借此机会把这篇文章写了出来。

此外,之所以以select为视角,是因为其他几个标签的源码流程与select大致相当,而且select在实际开发中使用更为频繁。

本文思路:

1. 先了解select标签各个属性作用

2. 从mapper.xml中加载select标签的过程

3. 加载sql操作标签的重要类---MappedStatement

4. 以select为例,解析select在执行时的流程,以及哪些属性将会影响执行中的select查询

5. 什么情况下会创建新的SqlSession,以及何时共用同一SqlSession。

6. SqlSession执行select操作的事务提交操作

涉及注解:

@Select

@Results

@Result

@CacheNamespace

@TypeDiscriminator


select标签属性

属性作用

Mybatis官网中展示了如下属性

<select
  id="selectPerson"
  parameterType="int"
  parameterMap="deprecated"
  resultType="hashmap"
  resultMap="personResultMap"
  flushCache="false"
  useCache="true"
  timeout="10"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">

每个属性的作用(版本mybatis3)

Attribute Description
id 当前namespace中代表该条语句的唯一id。
parameterType 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap 弃用
resultType 期望从这条语句中返回结果的类全限定名或别名。如果需要返回集合,那么这里的类型应该是集合的元素的类型,而不是集合本身的类型。resultType 和 resultMap 之间只能同时使用一个。
resultMap 引用外部resultMap标签(结果映射)的id。
flushCache 为true时将会在调用此语句时清空一级缓存(本地缓存)和二级缓存。默认false。
useCache 为true时将查询语句的结果缓存在二级缓存中。默认true。
timeout 设置数据库连接超时等待时间。默认未设置(由驱动driver程序控制超时时间)。
fetchSize 这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
statementType 执行SQL语句的类型。默认值:PREPARED。可选项:STATEMENT、PREPARED、CALLABLE。依据上述顺序MyBatis分别使用Statement(执行静态SQL语句)PreparedStatement(执行预编译SQL语句)CallableStatement(执行SQL存储过程)来进行语句操作
resultSetType 可选项:FORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE、DEFAULT(与未设置相同)。默认未设置。
databaseId 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
resultOrdered 这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回一个主结果行时,就不会产生对前面结果集的引用。 这就使得在获取嵌套结果集的时候不至于内存不够用。默认值:false
resultSets 这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。

上面就是select标签中所有的属性,在后面的加载流程中将只会涉及常用的属性。

那么在mybatis源码中,执行xml<select>语句需要经过什么样的流程呢?

从总体上看,大约有两个步骤:

1. 创建MappedStatement

2. 创建会话(SqlSession)并执行SQL。

下面我会主要围绕这两个大步骤来学习Mybatis框架。


MappedStatement的生成过程

XML文件生成MappedStatement流程

在mybatis代码中,每个xml操作数据库的标签(<select><insert><update><delete>),会生成对应的MappedStatement类。这个类对于Mybatis框架来说,非常的重要,也是理解整个框架的重要参考。

在Mybatis提交SQL语句到数据库时,MappedStatement类就包含了执行操作所需要的预编译SQL语句、参数配置、状态信息、缓存等信息。

生成MappedStatement流程图:

注意:这里的SqlSessionFactoryBean类,是Spring集成mybatis的包,用于Spring管理mybatis生成的bean,其他集成框架如mybatis-plus可以与这里有所不同。参考

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值