1.#{}和${}的区别是什么
#{}是预编译处理,在mybatis处理#{}时,会将其转换为?,这种方式可以有效避免sql注入。
${}是字符串替换,在mybatis处理${}时,会将其替换成变量的值。
2.通常一个xml映射文件,都会有一个对应的dao接口。请问这个dao接口原理是什么,dao接口的方法参数不同时,支持重载吗?
Dao接口就是mapper接口。接口的全限名就是映射文件的namespace的值。接口的方法名就是映射文件的id值,接口方法内的参数就是传递给sql的参数。
mapper接口是通过“全限名+方法名”作为key进行保存的,唯一对应一个mapperStatement对象。
mapper接口的工作原理是通过jdk动态代理,为mapper生成代理对象proxy,然后执行对应的mapperStatement对象所代表的sql,然后将sql执行结果返回。
3.mybatis的三级缓存
一级缓存默认是开启的,作用域是SqlSession 级别的,所以命中率极低。相同SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。
二级缓存是多个 SqlSession 共享的,其作用域是 mapper 的同一个 namespace,不同 的 sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同即最终执行 相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从 缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis 默认没有开启二级缓存 需要在 setting 全局参数中配置开启二级缓存。
三级缓存基于SessionFactory级别的缓存,由于一级缓存二级缓存的命中率极低,都是在单个进程之类进行缓存,多进程缓存就不好使,mybatis默认提供了接口可以自定义缓存。需要借助redis。
标签:mapper,缓存,java,接口,面试,二级缓存,sql,mybatis From: https://www.cnblogs.com/wxynb/p/18173604