若依集成mybatisplus遇到的问题

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

 
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelper-spring-boot-starterartifactId>
            <exclusions>
                <exclusion>

                    <groupId>org.mybatisgroupId>
                    <artifactId>mybatisartifactId>
                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.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        return sessionFactory.getObject();
    }

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

@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //分页
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //乐观锁
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

   
}

根据第一个问题,猜测我手动注入了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 = new MybatisPlusInterceptor();
        //乐观锁
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        //分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        sessionFactory.setPlugins(interceptor);
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        return sessionFactory.getObject();
    }

重新启动,问题解决。

你可能感兴趣的:(mybatisplus,java,mybatis,spring)