011、MyBatis 都有哪些 Executor 执行器?它们之间的区别是什么?
MyBatis 内部维护了一个 Executor 接口,我们所进行的一系列增删改查操作实际上都是在调用这个接口,该接口有两个实现类,分别是 BaseExecutor
和 CachingExecutor
,其中 BaseExecutor
是一个抽象类,它有三个实现 SimpleExecutor
、ReuseExecutor
、BatchExecutor
,Executor 的继承结构如下图所示。
SimpleExecutor
:默认执行器,每执行一次操作,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。
ReuseExecutor
:在执行操作前,会先以 sql 作为 key 查找 Statement 对象,如果存在就使用,不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map<String, Statement>内,供下一次使用。简而言之,就是重复使用 Statement 对象。
BatchExecutor
:执行批量处理操作(不支持批量查询,因为 JDBC 批处理不支持查询),将所有 sql 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),BatchExecutor 缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch() 完毕后,等待逐一执行 executeBatch() 批处理。与 JDBC 批处理相同。
BaseExecutor
:默认支持一级缓存,即 MyBatis 默认开启一级缓存。
CachingExecutor
:用于二级缓存。
作用范围:Executor 的这些特点,都严格限制在 SqlSession 生命周期范围内。
012、MyBatis 中如何执行批处理?
使用 BatchExecutor 完成批处理。
013、MyBatis 中如何指定使用哪一种 Executor 执行器?
在 MyBatis 配置文件中,可以指定默认的 ExecutorType 执行器类型,也可以手动给 DefaultSqlSessionFactory
的创建 SqlSession 的方法传递 ExecutorType 类型参数。
014、MyBatis 是否可以映射 Enum 枚举类?
MyBatis 可以映射枚举类,不单可以映射枚举类,MyBatis 可以映射任何对象到表的一列上。映射方式为自定义一个 TypeHandler
,实现 TypeHandler
的 setParameter()
和 getResult()
接口方法。TypeHandler
有两个作用,一是完成从 javaType 至 jdbcType 的转换,二是完成 jdbcType 至 javaType 的转换,体现为 setParameter()
和 getResult()
两个方法,分别代表设置 sql 问号占位符参数和获取列查询结果。
015、MyBatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?
虽然 MyBatis 解析 xml 映射文件是按照顺序解析的,但是被引用的 B 标签仍然可以定义在任何地方。
实现原理:MyBatis 解析 A 标签,发现 A 标签引用了 B 标签,但是 B 标签尚未解析到,尚不存在,此时,MyBatis 会将 A 标签标记为未解析状态,然后继续解析剩余的标签,包含 B 标签,待所有标签解析完毕后,MyBatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签已经存在,A 标签也就可以正常解析了。
016、简述 MyBatis 的 xml 映射文件和 MyBatis 内部数据结构之间的映射关系?
MyBatis 将所有 xml 配置信息都封装到 All-In-One 重量级对象 Configuration
内部。
<parameterMap>
标签会被解析为 ParameterMap
对象,其每个子元素会被解析为 ParameterMapping
对象。
<resultMap>
标签会被解析为 ResultMap
对象,其每个子元素会被解析为 ResultMapping
对象。
每一个 <select>、<insert>、<update>、<delete>
标签均会被解析为 MappedStatement
对象,标签内的 sql 会被解析为 BoundSql
对象。
017、为什么说 MyBatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 MyBatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以称之为半自动 ORM 映射工具。