Mybatis 总结

125、MyBatis中的#{} 和 ${} 的区别是什么?

#{} 是预编译处理, ${} 是字符替换

在使用#{ }时,MyBatis会将SQL中的#{ }替换成"?",配合PreparedStatements的set方法赋值,这样可以有效的防止SQL注入,保证程序的运行安全。

 ${}是字符替换,它会将${}替换为变量的值。它的应用场景是需要传入表名或列名试使用。

126、MyBatis有几种分页方式?

逻辑分页和物理分页

逻辑分页: 使用MyBatis自带的RowBounds进行分页,它是一次性检查很多数据,然后在数据中再进行检索。

物理分页: 自己手写SQL分页或者使用分页插件PageHelper,去数据库查询指定条数的分页数据的形式。

127、RowBounds是一次性查询全部结果吗? 为什么?

RowBounds表面是在“所有”数据中检索数据,其实并非一次性查询所有数据。因为MyBatis是对jdbc的分装,在jdbc驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多的数据,它会在你执行next()的时候,去查询更多数据。就好比你去取款机取10000元,但是取款机每次最多取2500元,所以你要取4次才能把钱取完。只是对于jdbc来说,当你调用next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。

Fetch Size官方相关文档: http://t.cn/EfSE2g3

128、Mybatis逻辑分页和物理分页的区别

逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。

物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。

129、MyBatis是否支持延迟加载? 延迟加载的原理是什么?

MyBatis支持延迟加载,设置lazyLoadingEnabled=true即可。

延迟加载的原理是调用的时候触发加载,而不是在初始化的时候加载信息。比如调用a.getB().getName(),  这个时候发现a.getB()的值为null, 此时会单独触发事先保存好的关联B对象的SQL,先查询出来B,然后再调用a.setB(b), 而这时候再调用a.getB().getName()就有值了,这就是延迟加载的基本原理。

130 说一下MyBatis的一级缓存和二级缓存?

一级缓存: 基于PerpetualCache的HashMap本地缓存,它的声明周期和SQLSession一致的,有多个SQLSession或者分布式的环境中数据库操作,可能会出现脏数据。当Session flush或close之后,该Session中的所有Cache就将清空。默认一级缓存是开启的。

二级缓存: 也是基于PerpetualCache的HashMap本地缓存,不同在于其存储作用域为Mapper级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态)

开启二级缓存数据查询流程: 二级缓存-> 一级缓存-> 数据库

缓存更新机制: 当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行C/U/D操作后,默认该作用域下所有select中的缓存将被clear。

131: MyBatis和Hibernate的区别有哪些?

灵活性: MyBatis更加灵活,自己可以写SQL语句,使用起来比较方便

可移植性: MyBatis有很多自己写的SQL, 因为每个数据库SQL可以不相同,所以可移植性差

学习和使用门槛: MyBatis入门比较简单,使用门槛也更低。

二级缓存:Hibernate拥有更好的二级缓存,它的二级缓存可以自动更换为第三方的二级缓存。 

133、MyBatis分页插件的实现原理是什么?

分页插件的基本原理是使用MyBatis提供插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,然后重写SQL,根据dialect方言,添加对应的物理分页语句和物理分页参数。

 134 MyBatis如何编写一个自定义插件?

原文地址:https://www.cnblogs.com/linlf03/p/10774856.html