MyBatis面试题总结

主页置顶的博客有更多免费学习资源,欢迎下载~~~~~

MyBatis面试题总结

1、Dao 接口里的方法,参数不同时,方法能重载吗?
Mapper 接口里的方法,是不能重载的,因为是使用全限名+方法名的保存和寻找策略。
Mapper 接口的工作原理是 JDK 动态代理,Mybatis 运行时会使用 JDK动态代理为 Mapper 接口生成代理对象 proxy,
代理对象会拦截接口方法,转而执行 MapperStatement 所代表的 sql,然后将 sql 执行结果返回。
2、MyBatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
使用resultMap标签,定义数据库列名和对象属性名之间的映射关系。
使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,MyBatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回。
3、MyBatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,id可以重复。如果没有配置namespace,id不能重复。
原因是namespace+id是作为Map<String,MapperStatement>的key使用的,
如果没有namespace,id重复会导致数据互相覆盖。有了namespace,id就可以重复,
namespace不同,namespace+id自然也就不同。
4、#{}和${}的区别是什么?
#是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 19: …串替换。 
Mybatis在处理#̲时,会将sql中的#{}替换为…时,就是把$替换成变量的值。
使用#可以有效的防止SQL注入,提高系统安全性。
5、当实体类中的属性名和表中的字段名不一样 ,怎么办?
通过resultMap标签来映射字段名和实体类属性名的一一对应的关系。
6、MyBats中的 一对一、一对多的关联查询 ?
定义一个resultMap,使用association属性实现一对一的关联查询;使用collection属性实现一对多的关联查询。
7、讲一下MyBatis的一级、二级缓存(说说MyBatis的缓存)?
MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有。
二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口,
可在它的映射文件中配置cache标签
8、MyBatis在mapper中如何传递多个参数?
使用@param注解或者多个参数封装成 map
9、Xml 映射文件中,除了常见的 select、insert、updae、delete标签之外,还有哪些标签?
resultMap、parameterMap、sql、include、selectKey,加上动态sql的9个标签,
其中sql为sql片段标签,通过include标签标签引入sql片段,selectKey标签为不支持自增的主键生成策略标签。
10、什么是MyBatis的接口绑定?有哪些实现方式?
接口绑定有两种实现方式:
通过注解绑定,在接口的方法上面加上@Select、@Update等注解,里面包含Sql语句来绑定;
通过xml里面写SQL来绑定,要指定xml映射文件里面的namespace必须为接口的全路径名。
当Sql语句比较简单时候,用注解绑定;当SQL语句比较复杂时候,用xml绑定,一般用 xml 绑定的比较多。
11、使用MyBatis的mapper接口调用时有哪些要求?
Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的parameterType 的类型相同;
Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的resultType 的类型相同;
Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。
12、MyBatis 动态sql有什么用?执行原理?有哪些动态sql?
执行原理是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。
MyBatis提供了9种动态sql标签:trim、where、set、foreach、if、choose、when、otherwise、bind。
13、JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

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

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

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

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

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

4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象。
14、请说说MyBatis的工作原理

在这里插入图片描述

1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。

4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。

8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
15、Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,
可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

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

举例:select * from student,
拦截sql后重写为:select t.* from (select * from student) t limit 0, 10
16、Mybatis的一级、二级缓存
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,
当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,
不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),
可在它的映射文件中配置<cache/> ;

3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,
默认该作用域下所有 select 中的缓存将被 clear。
17、简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。
在Xml映射文件中,<parameterMap>标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。
<resultMap>标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。
每一个<select>、<insert>、<update>、<delete>标签均会被解析为MappedStatement对象,
标签内的sql会被解析为BoundSql对象。
18、ORM是什么
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)
的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,
将程序中的对象自动持久化到关系型数据库中。
19、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,
所以它是全自动的。

而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
20、传统JDBC开发存在的问题
-频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池解决这个问题。
但是使用	jdbc需要自己实现连接池。
-sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大,一旦发生变化,
需要修	改java代码,系统需要重新编译,重新发布。不好维护。
-使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,	
修改sql还要修改代码,系统不易维护。
-结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

添砖#Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值