若依框架集成Mybatisplus 遇到的坑

项目要用到若依框架,之前用惯了mybatisplus,就想着集成到项目要用的ruoyi框架升级下,遇到的问题顺便记录下。
用的最新版3.4.1版本,配置完依赖,官网说引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。
所以需要移除若依框架里的mybatis依赖。看了下maven依赖关系,发现pagehelper 分页插件里依赖了mybatis,这里直接排除掉。

 <!-- pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
<!--                    去除mybatis依赖-->
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

   
   

    就这么简单?写了一个测试类,执行MP注入的BaseMapper.getById方法,果不其然报错了。

    1、Invalid bound statement (not found):

    Invalid bound statement (not found):

    报错没有方法绑定,这里我没有写xml,直接用的MP提供的注入方法,按理不会出现没绑定的错。
    最后发现,若依自己配置了SqlSessionFactory ,里面创建的是一个SqlSessionFactoryBean ,而mybaitplus需要的是MybatisSqlSessionFactoryBean ,所以这里直接将对象修改为MybatisSqlSessionFactoryBean。

        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
        {
            String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
            String mapperLocations = env.getProperty("mybatis.mapperLocations");
            String configLocation = env.getProperty("mybatis.configLocation");
            typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
            VFS.addImplClass(SpringBootVFS.class);
    //        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
    
        sessionFactory<span class="token punctuation">.</span><span class="token function">setDataSource</span><span class="token punctuation">(</span>dataSource<span class="token punctuation">)</span><span class="token punctuation">;</span>
        sessionFactory<span class="token punctuation">.</span><span class="token function">setTypeAliasesPackage</span><span class="token punctuation">(</span>typeAliasesPackage<span class="token punctuation">)</span><span class="token punctuation">;</span>
        sessionFactory<span class="token punctuation">.</span><span class="token function">setMapperLocations</span><span class="token punctuation">(</span><span class="token function">resolveMapperLocations</span><span class="token punctuation">(</span>StringUtils<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span>mapperLocations<span class="token punctuation">,</span> <span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        sessionFactory<span class="token punctuation">.</span><span class="token function">setConfigLocation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DefaultResourceLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getResource</span><span class="token punctuation">(</span>configLocation<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> sessionFactory<span class="token punctuation">.</span><span class="token function">getObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    

      2、插件不生效
      按照最新的插件配置方法,配置了分页和乐观锁的插件,单元测试结果不正确,跟踪代码发现注入的插件配置不生效。
      配置如下。

      @Configuration
      public class MybatisPlusConfig {
      
      <span class="token comment">/**
       * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
       */</span>
      <span class="token annotation punctuation">@Bean</span>
      <span class="token keyword">public</span> MybatisPlusInterceptor <span class="token function">mybatisPlusInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
          MybatisPlusInterceptor interceptor <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MybatisPlusInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token comment">//分页</span>
          interceptor<span class="token punctuation">.</span><span class="token function">addInnerInterceptor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">PaginationInnerInterceptor</span><span class="token punctuation">(</span>DbType<span class="token punctuation">.</span>MYSQL<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token comment">//乐观锁</span>
          interceptor<span class="token punctuation">.</span><span class="token function">addInnerInterceptor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">OptimisticLockerInnerInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token keyword">return</span> interceptor<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      

      }

        根据第一个问题,猜测我手动注入了MybatisSqlSessionFactoryBean 之后,导致mybaisplus没有正确的装入插件。然后看了下MybatisSqlSessionFactoryBean对象的方法,发现有一个setPlugins方法,修改代码如下

            @Bean
            public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
            {
                String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
                String mapperLocations = env.getProperty("mybatis.mapperLocations");
                String configLocation = env.getProperty("mybatis.configLocation");
                typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
                VFS.addImplClass(SpringBootVFS.class);
        //        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
                final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        
            MybatisPlusInterceptor interceptor <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MybatisPlusInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token comment">//乐观锁</span>
            interceptor<span class="token punctuation">.</span><span class="token function">addInnerInterceptor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">OptimisticLockerInnerInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token comment">//分页插件</span>
            interceptor<span class="token punctuation">.</span><span class="token function">addInnerInterceptor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">PaginationInnerInterceptor</span><span class="token punctuation">(</span>DbType<span class="token punctuation">.</span>MYSQL<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            sessionFactory<span class="token punctuation">.</span><span class="token function">setPlugins</span><span class="token punctuation">(</span>interceptor<span class="token punctuation">)</span><span class="token punctuation">;</span>
            sessionFactory<span class="token punctuation">.</span><span class="token function">setDataSource</span><span class="token punctuation">(</span>dataSource<span class="token punctuation">)</span><span class="token punctuation">;</span>
            sessionFactory<span class="token punctuation">.</span><span class="token function">setTypeAliasesPackage</span><span class="token punctuation">(</span>typeAliasesPackage<span class="token punctuation">)</span><span class="token punctuation">;</span>
            sessionFactory<span class="token punctuation">.</span><span class="token function">setMapperLocations</span><span class="token punctuation">(</span><span class="token function">resolveMapperLocations</span><span class="token punctuation">(</span>StringUtils<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span>mapperLocations<span class="token punctuation">,</span> <span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            sessionFactory<span class="token punctuation">.</span><span class="token function">setConfigLocation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DefaultResourceLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getResource</span><span class="token punctuation">(</span>configLocation<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span> sessionFactory<span class="token punctuation">.</span><span class="token function">getObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        

          重新启动,问题解决。

          还有一个小坑若依框架集成进去之后,mybatisplus自身的分页插件不会生效,需要把mybatis自身的分页插件,改为mybatisplus的分页插件

          • 2
            点赞
          • 16
            收藏
            觉得还不错? 一键收藏
          • 4
            评论
          评论 4
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

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

          抵扣说明:

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

          余额充值