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)。

  具体可以参考文章:https://i.cnblogs.com/posts?cateId=2111477&page=1https://blog.csdn.net/weixin_37139197/article/details/82908377

Mybatis都有哪些Executor执行器?它们之间的区别是什么?

  SimpleExecutor默认执行器,每次执行前开启statement,执行后关闭。

  ReuseExecutor,每次执行前查询statement,如果存在则复用,不存在则创建,执行后不关闭对象。

  BatchExecutor,把update(JDBC不支持Select)的statement依次addBatch,然后统一执行。

posted @   小皮睡不醒  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示