Mybatis缓存
- 一级缓存
默认开启,只有在同一个session中有效,在Spring的service层中,使用事务标识,则处于Mybatis的同一个session中。因为第二次调用service,sqlSession就已经关闭。 如果sqlSession执行了commint(insert,update,delete),就会清空sqlSession中的一级缓存,避免脏读。注意:两次查询必须在同一个sqlSession中,否则不会走一级缓存
- 二级缓存
默认关闭,存储作用域Mapper(nameSpace),可自定义存储原,作用域为nameSpace是指,该Mapper文件下的所有select语句都有缓存,这样不同线程之间就公用二级缓存
注意:Mybatis-plus默认开启Mybatis的二级缓存 在yaml配置总开关,在各个mapper配置缓存 开启二级缓存步骤
- 在yaml中配置总开关
- 在各个mapper配置开启cache
为什么关闭二级缓存
如果启动多个应用,二级缓存会出现数据不一致性 二级缓存:本地缓存?连表有脏读?
${}与#{}的区别
${}是一个变量占位符,静态文本替换,存在sql注入风险,
#{}是sql参数占位符,Mybatis会将#{}替换为?,在执行前使用preparedStatment设置参数,
xml映射文件常见标签
| 标题 | |
|---|---|
| 增删改查 | insert,delete,update,select |
| 条件 | where,if,case,trim,choose,otherwise |
| 入参 | parameterType,parameterMap |
| 返回结果 | resultMap,resultType,result |
| 其他 | include,binding,sql,set |
Dao接口工作原理是什么?Dao接口方法入参不同,方法可以重载吗?
工作原理:通过动态代理生产对应的sql进行查询
不可以重载,Mybatis通过Dao接口及方法名唯一确定对应的sql
Mybatis是如何分页?分页原理是什么?
简述一下Mybatis插件运行原理,及如何编写一个插件
Mybatis批量插入,能返回主键列表吗?
能