您的当前位置:首页正文

Mybatis面试题小结

来源:一二三四网
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

通常⼀个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,然后统⼀执⾏。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top