Mybatis面试题小结
MyBatis与Hibernate有哪些不同?
Mybatis是半自动ORM框架,sql需要自己写在xml里面,灵活性高。Hibernate是全自动ORM框架,不需要自己写sql语句,代码简便,数据库可移植性高(换数据库影响小)。
#{}和${}的区别是什么?
#{}通过PreparedStatement预处理,sql语法结构已经编译好,#{}内的内容再替换不会发生sql注入。
${}是字符串直接替换,有sql注入的问题。
当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
1)别名 select xxx as xxx from ……
2)resultMap把对象属性名和数据库字段名一一对应
Mybatis动态标签?
if、choose、otherwise、when、where、set、foreach、trim、bind
具体参考:https://blog.csdn.net/qq_39623058/article/details/88779242
通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能
重载吗?
Dao层或者Mapper接口,每个方法都有一个MapperStatement与之一一对应,这个方法由XML中的namespace+id(接口的全限定名+方法名)确定。无关参数列表,因此也不能重载。
Mybatis是如何进行分页的?分页插件的原理是什么?
RowBounds,是基于ResultSet的结果的内存分页。也可以自己通过sql写物理分页。
插件是实现了MyBatis的分页接口,在插件的拦截器内进行SQL分页语句和分页参数的拼接,实现物理分页。
简述Mybatis的插件运行原理,以及如何编写一个插件
Mybatis提供四个插件接口,ParameterHandler、ResultSetHandler、StatementHandler、Executor。原理是JDK的动态代理,拦截方法进行增强。
编写:在配置文件中配置好自定义的插件,自定义实现上面四个接口之一后,注解标明要拦截的方法。
如何执行批量插入?·
1)MyBatis的动态标签,Collection和item进行sql拼接。
2)把sqlSession的ExecutorType设置为batch,在Mapper的Java代码中实现批量插入。
Mybatis推荐的官方实例为第二种。
嵌套查询和嵌套结果?
嵌套查询需要查询数据库N+1次,而嵌套结果只执行一条sql;嵌套查询是先通过一条sql返回多条结果集,再通过每条结果集进行关联查询,多表查询优先使用嵌套结果。
MyBatis实现一对一和一对多有几种方式?具体怎么操作的?
MyBatis一对一和一对多,都可以通过嵌套查询和嵌套结果实现。一对一的嵌套查询用到Association动态标签,一对多是Collection;嵌套结果是通过sql的多表关联查询。
Mybatis的一级、二级缓存?
Mybatis默认开启一级缓存,基于perpetualCache的HashMap保存,作用域为Session。要开启二级缓存,entity实体类序实现序列化接口,缓存机制和一级缓存相同,作用域为Mapper(namespace)。
Mybatis都有哪些Executor执行器?它们之间的区别是什么?
SimpleExecutor默认执行器,每次执行前开启statement,执行后关闭。
ReuseExecutor,每次执行前查询statement,如果存在则复用,不存在则创建,执行后不关闭对象。
BatchExecutor,把update(JDBC不支持Select)的statement依次addBatch,然后统一执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?