Mybatis面试题
1.Spring和Mybatis整合之后为什么一级缓存会失效?
- 如果我们没有添加@Transactional注解,Spring认为我的每一次查询都都是相互独立的,便开启了三次不同的事务也即是创建了三个不同的sqlSession对象。即无法使用到MyBatis的一级缓存。
- 如果我们添加了@Transactional注解,Spring在执行了第一次查询后,会将当前线程的事务情况存储到synchronizations 的集合中,当第二次再执行查询的时候,能够在缓存中直接获取到当前的事务情况(包含sqlSession对象),即不会再去调用openSession方法,继而创建一个新的sqlSession对象,而是使用缓存中的sqlSession对象。这就保证了在添加@Transactional注解的情况下,能够走MyBatis的一级缓存
答:即在没有添加@Transactional注解的情况下,每调用一次查询SQL,就会通过SqlSessionTemplate去创建新的sqlSession,即相当于新创建一次连接,故而每次查询在调试结果看来就是一级缓存失效
2.二级缓存中要注意的点
2.1:二级缓存里面的数据不能存那种一直累加到很大的,缓存是拿来存储少量或者存在周期不长,但是经常需要操作的数据
2.2:二级缓存是基于命名空间(nameSpace)来的 表级缓存
3: ResultMap和ResultType的差别
ResultType是标签中的属性,一般是直接指定返回值与java对象的映射,比如:Map ,String 自定义对象(注意:自定义对象的属性名和数据库列名要相同)
ResultMap是标签,自己指定返回值与对象以及对象内部属性名和数据库列名的绑定
4: #()和$()的区别
#会把传入的数据都当成一个字符串来处理,会在传入的数据上面加一个双引号来处理,#可以避免sql注入。
$则是把传入的数据直接显示在sql语句中,不会添加双引号。
5: MyBatis与Hibernate有哪些不同?
1、Mybatis 和 Hibernate 不同,它不完全是一个全自动 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,而Hibernate 只需要操作java对象就等于操作数据。
2、Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发。但是灵活的前提是 mybatis 无法做到数据库无关性, 如果需要实现支持多种数据库的软件,则需要自定义多套 sql 映射文件,工作量大。
3、Hibernate ORM映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 hibernate 开发可以节省很多代码,提高效率。
6:Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
没有顺序,第一遍解析xml会把所有报错的节点存储在一个map当中继续解析别的节点,再解析玩能解析的节点之后再循环解析map里面解析失败的节点
7:Mybatis 动态sql是做什么的?都有哪些动态sql?能简述一下动态 sql的执行原理不?
底层会判断是否是动态sql当是动态sq|的时候会调用OGNL表达式里面的包去替换掉里面的动态sq|节点
动态sql是指sql语句可动态的变化
Mybatis动态SQL中支持:OGNL
动态sql标签:
- if标签:主要用于基本的if判断
- where标签 :解决where关键字以及出现的第一个and或者or关键字导致sql语句错误
-
trim标签:可以在条件判断完的SQL语句前后添加或者去掉指定的字符
-
prefix: 添加前缀
-
prefixOverrides: 去掉前缀
-
suffix: 添加后缀
-
suffixOverrides: 去掉后缀
-
- choose标签:主要用于分支判断 单条件 类似于java中的if-else 或者 Switch-case 只会满足所有分支中的一个
- set标签:去除修改语句中的{,}逗号的问题
- foreach标签:类似于java中的增强for循环
- collection: 要迭代的集合
- item: 当前从集合中迭代出的元素
- open: 开始字符
-
index:
-
迭代的是List集合: index表示的当前元素的下标
-
迭代的Map集合: index表示的当前元素的key
-
-
separator: 元素与元素之间的分隔符
-
close:结束字符
8:@mapper的声明方式
@mapper注解声明在DAO接口上,使用@mapper注解可以不再使用mapper.xml映射文件,配合@select、@insert注解实现定义SQL语句,同时也要再mybatis-config.xml文件中使用<Mappers>标签引入DAO层接口包。
使用XML映射文件,不是用@mapper注解:
使用@mappe注解:
XML映射文件和@mapper注解都不用:
9: Mybatis是如何进行分页的?分页插件的原理是什么?
-
使用 RowBounds 对象进行分页,它是对 ResultSet 结果集进行内存分页
-
在 xml 或者 注解的 SQL 中传递分页参数
-
使用分页插件 PageHelper实现分页的
其中分页插件的原理是,使用 MyBatis 提供的插件接口,底层通过拦截器,进行拦截,然后根据传入的参数拼接sql中的limit,达到分页的效果。
10:MyBatis 的好处是什么?
1. MyBatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的
维护带来了很大便利。
2. MyBatis 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象,
大大简化了 Java 数据库编程的重复工作。
3. MyBatis 手动编写 sql 语句,灵活控制 sql 语句,因此能够实现比 Hibernate 等全自动 ORM框架更高的查询效率,能够完成复杂查询。
什么是 MyBatis 的接口绑定,有什么好处 ?
接口绑定:将mapper映射文件和DAO层接口绑定,将mapper映射文件中sql语句和DAO接口方法绑定
我们直接调用接口方法就可以,这样比原来的SqlSession提高的方法我们可以有更加灵活的选择和设置。
接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,在接口上加@mapper,方法上面加@select,@update等注解里面包含Sql语句来绑定,
另外一种就是通过xml里面写sql来绑定,在这种情况下,要指定xml文件里面的namespace必须为接口的全路径名字。
什么情景下使用注解绑定,什么情况下使用xml绑定?当 Sql 语句比较简单时候,用注解绑定;当 SQL 语句比较复杂时候,用 xml 绑定,一般用xml 绑定的比较多
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术