MyBatis执行流程与缓存机制详解

发布于:2025-07-12 ⋅ 阅读:(33) ⋅ 点赞:(0)

执行流程

  1. 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件
  2. 构造会话工厂SqlSessionfactory
  3. 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)
  4. 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
  5. Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
  6. 输入参数映射
  7. 输出结果映射

延迟加载

当需要数据时才查询加载数据,不需要用到数据时就不加载

原理

一级缓存

二级缓存

注意事项:

  1. 对于缓存数据更新机制。当某一个作用域(一级缓存session/二级缓存namespaces的进行了新增,修改,删除操作后,默认该作用域下所有 select 中的缓存将被 clear
  2. 二级缓存需要缓存的数据实现serializable接口
  3. 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

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>

网站公告

今日签到

点亮在社区的每一天
去签到