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

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接口的方法相同,参数不同时可以重载么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值