springboot集成mybatis-plus源码分析

本文详细介绍了SpringBoot集成Mybatis-Plus时的配置加载过程,从SqlSessionFactory的创建到Mapper接口的代理类生成,再到CachingExecutor的查询执行。文中通过代码分析了事务对一级缓存的影响,展示了在有事务和无事务情况下一级缓存的行为差异。此外,还提及了Mybatis的Executor执行查询的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍springboot-集成mybatis-plus,(又出现很多以Mybatis开头的配置类),启动时如何加载各个类,解析配置文件,生成接口代理类。sql执行器。

自定配置入口

1.找到自动配置类MybatisPlusAutoConfiguration,会看到

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {}

这里给出了,如果自己没有配置SqlSessionFactory,这个配置就会生效。断点调试。

这个方法配置MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(),里面设置dataSource,加载配置类信息MybatisPlusProperties,最后一行的factory.getObject(),方法,判断SqlSessionFactory==null ,会调用初始化方法afterPropertiesSet(),这个方法会构建SqlSessionFactory,

this.sqlSessionFactory = buildSqlSessionFactory();

进入方法,会看到这里解析xml,构建

MybatisConfiguration
MybatisXMLConfigBuilder

new DefaultSqlSessionFactory()

XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(..)

解析mapper.xml
xmlMapperBuilder.parse();

SqlSessionFactory创建完毕,执行sql查询的时候进入MybatisMapperProxy类,找到invoke方法

会执行MybatisMapperMethod的excute方法。执行查询的时候,会执行


CachingExecutor类

  @Override
  public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
    BoundSql boundSql = ms.getBoundSql(parameterObject);

//key==1862739912:3384727830:com.example.demo2.mybatisdemo.UserMapper.getUser:0:2147483647:SELECT COUNT(1) FROM t_user WHERE id > ?:1:MybatisSqlSessionFactoryBean

    CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
    return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
  }

我自己代码是这样写的,里面有事务,在同一个session里查询2次,一级缓存才生效。否则在sqlSession提交的时候会清空一级缓存。

@Transactional
    public int getUser() {
        userMapper.getUser(1);
        return userMapper.getUser(1);
    }

 

 

 

 

 

 

 

 

 把事务去掉之后代码,一级缓存,在每次查询之后就被清空,一级缓存也没有用了。


    public int getUser() {
        userMapper.getUser(1);
        return userMapper.getUser(1);
    }

 

 

 

mybatis的Executor这里没有介绍,可以查看其他文章。到这里就完毕了。 

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入:Mybatis-PlusMybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作 预防Sql注入:内置Sql注入剥离器,有效预防Sql注入攻击 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!) 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere ) 支持关键词自动转义:支持数据库关键词(order、key……)自动转义,还可自定义关键词 内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值