1.MyBatis中#{}和${}有什么区别?{}是预编译处理,${}是字符替换。在使用#{}时,MyBatis会将SQL中的#{}替换为“?”,配合PreparedStatement的set方法进行赋值,可以有效的防止SQL注入,保证程序的安全运行。2、MyBatis中的两种分页方式是什么?逻辑分页:使用MyBatis自带的RowBounds进行分页。它一次查询很多数据,然后在数据中检索。物理分页:手写SQL分页或者使用分页插件PageHelper查询数据库指定数量的分页数据。3、RowBounds是一次性查询所有结果吗?为什么?不。从表面上看,RowBounds从“所有”数据中检索数据,但它不会一次性查询所有数据。因为MyBatis是对jdbc的封装,所以在jdbc驱动中有一个FetchSize的配置,指定一次可以从数据库中查询多少条数据。如果你想查询更多的数据,在你执行next()的时候就会执行,查询更多的数据。就好比你去ATM机取1万元,但是ATM机每次最多可以取2500元,所以你要取4次才能把钱全部取完。只是对于jdbc来说,当你调用next()时,它会自动帮你完成查询工作。这样做的好处是可以有效防止内存溢出。4.MyBatis是否支持延迟加载?懒加载的原理是什么?MyBatis支持延迟加载,只需设置lazyLoadingEnabled=true即可。懒加载的原理是在调用的时候触发加载,而不是在初始化的时候加载信息。例如,调用a.getB().getName()。这时发现a.getB()的值为null。这时会单独触发预先保存的与B对象相关的SQL,先查询B,再调用a。setB(b),此时调用a.getB().getName()就会有值。这就是懒加载的基本原理。当然,不仅仅是Mybatis,包括Hibernate在内的几乎所有的都支持同样的懒加载原理。5、说说MyBatis的一级缓存和二级缓存?一级缓存:基于PerpetualCache的HashMap本地缓存。它的生命周期与SQLSession是一致的。如果分布式环境下有多个SQLSession或数据库操作,可能会出现脏数据。当Session被刷新或关闭时,Session中的所有Cache都会被清空,默认启用一级缓存。二级缓存:也是在PerpetualCache基础上的HashMap本地缓存,不同的是它的存储范围是在Mapper级别。如果多个SQLSession需要共享缓存,则需要使用二级缓存,二级缓存可以自定义存储源,比如Ehcache。默认情况下不启用二级缓存。启用二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可以用来保存对象的状态)。启动二级缓存数据查询流程:二级缓存->一级缓存->数据库。缓存更新机制:当一个作用域(一级缓存Session/二级缓存Mapper)进行C/U/D操作时,默认清除该作用域下select中的所有缓存。6.MyBatis有哪些Executor?MyBatis有3个基本的Executor:SimpleExecutor:每次执行update或select时打开一个Statement对象,用完立即关闭Statement对象;ReuseExecutor:执行update或select,以SQL为key查找Statement对象,存在则使用。如果存在则创建,Statement对象在使用后不会关闭,而是放在Map中供下次使用。简而言之,就是重用Statement对象;BatchExecutor:执行update(没有select,jdbc批处理不支持select),将所有SQL加入批处理(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象等待addBatch()完成后,逐条执行executeBatch()批处理,与jdbc批处理相同。作用范围:Executor的这些特性被严格限制在SqlSession生命周期的范围内。7、Mybatis的四大对象是什么?Executor、ParameterHandler、StatementHandler、ResultSetHandler8、MyBatis分页插件的实现原理是什么?分页插件的基本原理是利用MyBatis提供的插件接口实现自定义插件,在插件拦截方法中拦截要执行的SQL,然后重写SQL,添加根据方言方言对应物理分页语句和物理分页参数。9.什么是MyBatis接口绑定?有哪些实现?接口绑定就是在MyBatis中任意定义接口,然后将接口中的方法绑定到SQL语句中。我们可以直接调用接口方法,这样我们就可以比原来SqlSession提供的方法有更灵活的选择和设置。.接口绑定的实现方式有两种:一种是注解绑定,就是在接口方法上加上@Select、@Update等注解,其中包含Sql语句进行绑定;通过xml写SQL来绑定,在这种情况下,指定xml映射文件中的命名空间必须是接口的全路径名。当Sql语句比较简单时,用注解绑定。当SQL语句比较复杂时,与xml绑定。一般都是用xml来绑定的。10、Mybatis动态sql是做什么的?有哪些动态sql?能简单介绍一下动态sql的执行原理吗?Mybatis动态sql允许我们在Xml映射文件中以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。Mybatis提供了9种动态sql标签:trim、where、set、foreach|、if、choose、when、otherwise、bind。它的执行原理是利用OGNL从sql参数对象中计算出表达式的值,根据表达式的值动态拼接sql,从而完成动态sql的功能。学习更多JAVA知识和技能,关注和私信博主(666),最重要的是增加自己的知识储备,做好准备。最后给大家分享Spring系列学习笔记和面试题,包括spring面试题、springcloud面试题、springboot面试题、spring教程笔记、springboot教程笔记、最新阿里巴巴开发手册(63页)PDF摘要),2022年Java面试手册。共整理出1184页PDF文档。私信博主(666)收到,祝大家更上一层楼!!!
