mybatis-面试问题

1、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?

  • mybatis的动态sql主要针对参数的,在参数可能为空,或者指定值,或者根据集合动态拼接参数,或者分支执行等等情况下,动态的去完成sql的拼接
  • mybatis的动态sql有:if、choose(when,otherwse)、where、trim、set、foreach等
  • 动态sql的执行原理:根据配置文件解析sql语句,解析动态sql,根据不同动态sql创建相应的SqlNode (不同动态Sql各自的SqlNode处理自己的逻辑),最后得到一个SqlNode的集合 ,然后创建SqlSource。将SqlSource封装进MappedStatement,再存入Configureation。 在执行对数据库的操作时,在Executor中,获取BoundSql过程中,会创建 DynamicContext 对象(将参数传入),将会根据参数值,对SqlSource的SqlNode执行条件判断与sql拼接,最后得的数据库执行的sql语句

2、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

  • mybatis 支持延迟加载
  • 实现原理:mybatis的延迟加载主要应用在ResultMap中的association 和collection,即关联其他的对象时,才会有延迟加载。在mybatis配置中开启延迟加载,解析配置文件时,设置ResultMapping的懒加载属性为true,在处理ResultSet结果时,里面关联的对象不会立即被加载,而是在真正需要用到的时候才会加载

3、Mybatis都有哪些Executor执行器?它们之间的区别是什么?

  • mybatis提供的Executor执行器有:BatchExecutor、ReuseExecutor、SimpleExecutor
  • SimpleExecutor 在执行query和update后,都会关闭Statement,每次使用都会新创建一个
  • BatchExecutor 在执行update操作时,将执行任务都添加到batch 中,等待统一处理,不会关闭Statement,并缓存了Statement对象
  • ReuseExecutor 重用Statement,使用Map保存了Statement(sql作为key),每次使用先查找本地有没有,没有就创建

  

4、简述下Mybatis的一级、二级缓存(分别从存储结构、范围、失效场景。三个方面来作答)?

  • 一级缓存,使用内置的Cache实现PerpetualCache基于 Map存储数据,在sqlSession内有效,在执行update操作(insert,update,delete)操作时,会清空缓存
  • 二级缓存,可以地使用内置的实现PerpetualCache,也可以使用 redis 等第三方软件存储数据;二级缓存与Sqlsession无关,分布式的缓存;需要调用方法使它失效,通过调用SqlSession的 commit方法或者是close方法可以清空缓存
posted on 2020-07-26 20:57  未知不知  阅读(193)  评论(0)    收藏  举报