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,然后统⼀执⾏。
因篇幅问题不能全部显示,请点此查看更多更全内容