java面试-mybatis篇

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。

posted @   WXY_WXY  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示