MyBatis 面试题 011 - 020

011、MyBatis 都有哪些 Executor 执行器?它们之间的区别是什么?

MyBatis 内部维护了一个 Executor 接口,我们所进行的一系列增删改查操作实际上都是在调用这个接口,该接口有两个实现类,分别是 BaseExecutorCachingExecutor,其中 BaseExecutor 是一个抽象类,它有三个实现 SimpleExecutorReuseExecutorBatchExecutor,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 生命周期范围内。

参考文章:MyBatis四大接口之 Executor

012、MyBatis 中如何执行批处理?

使用 BatchExecutor 完成批处理。

013、MyBatis 中如何指定使用哪一种 Executor 执行器?

在 MyBatis 配置文件中,可以指定默认的 ExecutorType 执行器类型,也可以手动给 DefaultSqlSessionFactory 的创建 SqlSession 的方法传递 ExecutorType 类型参数。

014、MyBatis 是否可以映射 Enum 枚举类?

MyBatis 可以映射枚举类,不单可以映射枚举类,MyBatis 可以映射任何对象到表的一列上。映射方式为自定义一个 TypeHandler,实现 TypeHandlersetParameter()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 映射工具。

018、未完待续

019、

020、

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值