求职技巧:广州Java就业技术面试问答分享

257 阅读3分钟

MyBatis

是一款优秀的持久层框架,它支持定制化
SQL
、存储过程以及高级映射。
MyBatis
避免了几乎所有的
JDBC
代码和手动设置参数以及获取结果集,是
Java
程序员工作的好帮手,也是企业选拔人才时的常选题。接下来的广州
Java
就业面试就给大家介绍
MyBatis
相关问题及答案。

1

Mybatis
是如何进行分页的?分页插件的原理是什么?

答:
Mybatis
使用
RowBounds
对象进行分页,它是针对
ResultSet
结果集执行的内存分页,而非物理分页,可以在
SQL
内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用
Mybatis
提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的
SQL
,然后重写
SQL
,根据
dialect
方言,添加对应的物理分页语句和物理分页参数。

举例:
select * from student
,拦截
SQL
后重写为:
select t.* from
select * from student
t limit 0
10

2

Mybatis
动态
SQL
是做什么的?都有哪些动态
SQL
?能简述一下动态
SQL
的执行原理不?

答:
Mybatis
动态
SQL
可以让我们在
XML
映射文件内,以标签的形式编写动态
SQL
,完成逻辑判断和动态拼接
SQL
的功能,
Mybatis
提供了
9
种动态
SQL
标签:
trim|where|set|foreach|if|choose|when|otherwise|bind

其执行原理为,使用
OGNL
SQL
参数对象中计算表达式的值,根据表达式的值动态拼接
SQL
,以此来完成动态
SQL
的功能。

3

Mybatis
是如何将
SQL
执行结果封装为目标对象并返回的?都有哪些映射形式?

答:第一种是使用
<resultMap>
标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用
SQL
列的别名功能,将列别名书写为对象属性名,比如
T_NAME AS NAME
,对象属性名一般是
name
,小写,但是列名不区分大小写,
Mybatis
会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成
T_NAME AS NaMe
Mybatis
一样可以正常工作。

有了列名与属性名的映射关系后,
Mybatis
通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

5

Mybatis
是否支持延迟加载?如果支持,它的实现原理是什么?

答:
Mybatis
仅支持
association
关联对象和
collection
关联集合对象的延迟加载,
association
指的就是一对一,
collection
指的就是一对多查询。在
Mybatis
配置文件中,可以配置是否启用延迟加载
lazyLoadingEnabled=true|false

它的原理是,使用
CGLIB
创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用
a.getB().getName()
,拦截器
invoke()
方法发现
a.getB()
null
值,那么就会单独发送事先保存好的查询关联
B
对象的
sql
,把
B
查询上来,然后调用
a.setB(b)
,于是
a
的对象
b
属性就有值了,接着完成
a.getB().getName()
方法的调用。这就是延迟加载的基本原理。

当然不光是
Mybatis
,几乎所有的包括
Hibernate
,支持延迟加载的原理都是一样的。

6

Mybatis
XML
映射文件和
Mybatis
内部数据结构之间的映射关系?

答:
Mybatis
将所有
XML
配置信息都封装到
All-In-One
重量级对象
Configuration
内部。在
XML
映射文件中,
<parameterMap>
标签会被解析为
ParameterMap
对象,其每个子元素会被解析为
ParameterMapping
对象。

<resultMap>

标签会被解析为
ResultMap
对象,其每个子元素会被解析为
ResultMapping
对象。每一个
<select>
<insert>
<update>
<delete>
标签均会被解析为
MappedStatement
对象,标签内的
SQL
会被解析为
BoundSql
对象。