Mybatis常见面试题

什么是Mybatis
mybatis是一个基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

Mybatis与Hibernate区别

Mybatis是轻量级封装,Hibernate是重量级封装
Mybatis 以SQL语句得到对象,hibernate是以对象得到SQL语句
Mybatis#与$区别
优先使用 #{}。
因为 ${} 会导致 sql 注入的问题

Mybatis 的编程步骤是

1、创建 SqlSessionFactory
2、通过 SqlSessionFactory 创建 Sql
3、通过 sqlsession 执行数据库操作
4、调用 session.commit()提交事务
5、调用 session.close()
6.关闭会话

JDBC 编程有哪些不足之处,MyBatis 是如何解决这些问题的?

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

  1. Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。

  1. 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决: Mybatis 自动将 java 对象映射至 sql 语句。

  1. 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解

析比较方便。
解决:Mybatis 自动将 sql 执行结果映射至 java 对象

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

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

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

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

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

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

Mybatis动态sql有什么用?执行原理?有哪些动态sql?

Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:
trim | where | set | foreach | if | choose | when | otherwise | bind

 

Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

答:<resultMap><parameterMap><sql><include><selectKey>,加上动态sql的9个标签,其中为sql片段标签,通过标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签。

 

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;

原因就是namespace+id是作为Map<String, MapperStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

 

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

 

Last modification:November 13th, 2019 at 02:30 pm
如果觉得这篇技术文章对你有用,请随意赞赏

Leave a Comment