Mybatis整体框架,源码,面试热点问题汇总(待更新)

    技术2023-07-22  80

    1,Mybatis源码系统框架图

    2,MyBatis手写源码框架(简易版)

    mybatis手写简易版代码地址 mybatis源码中文翻译版地址推荐阅读

    3, MyBatis缓存

    一级缓存 : 1,在同一个sqlSession中,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和结果存放在一个Map中,如果后序键值一样,则直接从Map里获取数据 2,不同的sqlSession之间缓存是相互隔离的 3,用一个sqlSession,可以通过配置使得在查询前清空缓存(flushCache=true) 4,任何的update,insert,delete语句都将清空缓存 二级缓存: 操作步骤:1,创建一个pojo并且序列化 2,在映射文件中开启二级缓存 <cache/> 3,myabtis-config.xml中开启二级缓存<setting name="cacheEnable" value = "true"/> 4,在同一sqlSessionFactory共享缓存 二级缓存失效条件:第一个sqlsession未提交 更新 多表联查容易获得脏数据(解决方案:使用<cache-ref> 多个mapper共用同一个cache缓存对象) 如果使用了二级缓存:查询顺序是 二级缓存-》一级缓存-》数据库

    4,MyBatis插件原理

    原理:代理模式+责任链模式 MyBatis插件可以介入对象: Excutor、PrameterHandler、ResultSetHandler、StatementHandler 例如:分页插件拦截mybatis的excutor 的query方法,分页插件里面用到了ThreadLocal保证线程安全

    5, 常见问题

    #{} 是预编译指令 ,${} 是字符串替换指令 | Mybatis 在处理 #{} 时 ,将其替换为?,使用preparedStatement的 set 方法为其进行赋值,而处理 ${} 时 直接使用变量名称赋值 | 使用#{}能有效的避免sql注入

    xml映射文件中除了 select/insert/delete/delete 标签 还存在哪些标签?

    resultMap ,paramterMap, sql ,selectKey,加上动态sql的九个标签,trim|where|foreach|if|choose|when|otherWise|bind,sql 为 sql片段标签,include为引入sql片段的标签,selectKey标签可帮助获取新增主键

    最佳实践中,通常一个xml文件都会编写一个dao接口与之对应,dao接口的工作原理是什么,dao接口的方法相同,参数不同时可以重载么?
    Processed: 0.011, SQL: 10