前言
以前只知道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可以与这里有所不同。参考

&spm=1001.2101.3001.5002&articleId=122298978&d=1&t=3&u=f1a340f167d24fb18fe476d8a7e59ad7)
4855

被折叠的 条评论
为什么被折叠?



