Skip to content

springboot 集成mybatis

引入依赖

xml
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis-spring-boot-starter.version}</version>
</dependency>

在springboot 集成mybatis时 一级缓存不生效

java
    @GetMapping("test1Cache")
//    @Transactional(rollbackFor = Exception.class)
    public void test1Cache() {
        User user = userMapper.findById(1);
        log.info("user:{}",user);
        user = userMapper.findById(1);
        log.info("user:{}",user);
    }

加上事务才会生效

java
    @Transactional(rollbackFor = Exception.class)

因为一级缓存是会话级别的,要生效的话,必须要在同一个 SqlSession 中。但是与 springboot 集成的 mybatis, 默认每次执行sql语句时,都会创建一个新的 SqlSession!所以一级缓存才没有生效

源码

当调用 mapper 的方法时,最终会执行到SqlSessionUtils的getSqlSession方法

尝试从 Spring 当前线程的事务中获取一个已存在的 SqlSessionHolder,如果没有,就会新建一个sqlSession img.png