Mybatis提供了9种动态sql标签:
trim | where | set | foreach | if | choose | when | otherwise | bind。
#{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?
Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。
Mybatis是如何进行分页的?分页插件的原理是什么?
总的来讲,mybatis使用pagehelper来进行分页。Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
一二级缓存
一级缓存:
Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。
Mybatis默认开启一级缓存。也就是同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中;第二次以后是直接去缓存中取。
当执行SQL查询中间发生了增删改的操作,MyBatis会把SqlSession的缓存清空。
一级缓存实现原理:
每个 SqlSession 对象包含一个 Executor 对象,Executor 对象中 localCache 属性使用 PerpetualCache 对象缓存查询数据;从源码中看 DefaultSqlSession 的 close、commit、rollback、insert、delete、update 相关的方法都会触发 BaseExecutor 对象清掉缓存。
一级缓存失效场景:
sqlsession不同、两次查询之间进行了插入操作、手动清除了一级缓存中的数据
二级缓存:
Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
二级缓存开启关闭可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。
<cache>标签
开启二级缓存的作用
映射语句文件中的所有 select 语句的结果将会被缓存。
映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。