『千锋武汉』Java程序员面试之MyBatis相关问题及答案整理

MyBatis是一款优秀的持久层框架 , 它支持定制化SQL、存储过程以及高级映射 。 MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集 , 是Java程序员工作的好帮手 , 也是企业选拔人才时的常选题 。 接下来千锋武汉小编就给大家介绍MyBatis相关问题及答案 。
『千锋武汉』Java程序员面试之MyBatis相关问题及答案整理
文章图片
【『千锋武汉』Java程序员面试之MyBatis相关问题及答案整理】1、Mybatis是如何进行分页的?分页插件的原理是什么?
答:Mybatis使用RowBounds对象进行分页 , 它是针对ResultSet结果集执行的内存分页 , 而非物理分页 , 可以在SQL内直接书写带有物理分页的参数来完成物理分页功能 , 也可以使用分页插件来完成物理分页 。
分页插件的基本原理是使用Mybatis提供的插件接口 , 实现自定义插件 , 在插件的拦截方法内拦截待执行的SQL , 然后重写SQL , 根据dialect方言 , 添加对应的物理分页语句和物理分页参数 。
举例:select*fromstudent , 拦截SQL后重写为:selectt.*from(select*fromstudent)tlimit0 , 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_NAMEASNAME , 对象属性名一般是name , 小写 , 但是列名不区分大小写 , Mybatis会忽略列名大小写 , 智能找到与之对应对象属性名 , 你甚至可以写成T_NAMEASNaMe , Mybatis一样可以正常工作 。
有了列名与属性名的映射关系后 , Mybatis通过反射创建对象 , 同时使用反射给对象的属性逐一赋值并返回 , 那些找不到映射关系的属性 , 是无法完成赋值的 。
4、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 , 支持延迟加载的原理都是一样的 。
5、Mybatis的XML映射文件和Mybatis内部数据结构之间的映射关系?
答:Mybatis将所有XML配置信息都封装到All-In-One重量级对象Configuration内部 。 在XML映射文件中 , <parameterMap>标签会被解析为ParameterMap对象 , 其每个子元素会被解析为ParameterMapping对象 。
<resultMap>标签会被解析为ResultMap对象 , 其每个子元素会被解析为ResultMapping对象 。 每一个<select>、<insert>、<update>、<delete>标签均会被解析为MappedStatement对象 , 标签内的SQL会被解析为BoundSql对象 。


推荐阅读