执行流程
- 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件
- 构造会话工厂SqlSessionfactory
- 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)
- 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
- Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
- 输入参数映射
- 输出结果映射
延迟加载
当需要数据时才查询加载数据,不需要用到数据时就不加载
原理
一级缓存
二级缓存
注意事项:
- 对于缓存数据更新机制。当某一个作用域(一级缓存session/二级缓存namespaces的进行了新增,修改,删除操作后,默认该作用域下所有 select 中的缓存将被 clear
- 二级缓存需要缓存的数据实现serializable接口
- 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
mybatis使用list参数
前端发来参数使用
控制类接收前端传来的列表参数
//用户点赞博客 统一更新
@GetMapping("/star")
public Result star(@RequestParam int user_id, @RequestHeader String token,
@RequestBody Map<String,Object> starlist) {
//先校验token
if (!checktoken(token, user_id)) {
return Result.error("token不合法");
}
//获取前端返回的点赞博客列表
List<Integer> starlist = (List<Integer>) map.get("starlist");
}
xml中 使用foreach对列表进行遍历
<!-- 根据点赞博客id 插入点赞记录-->
<insert id="star">
delete from star where blog_id in
<foreach collection="starlist" item="id" index="index" open="(" close=")" separator=",">
#{id};
</foreach>
insert into star(user_id,blog_id,star_time) values
<foreach collection="starlist" item="id" index="index" open="(" close=")" separator=",">
(#{user_id},#{id},now());
</foreach>
</insert>