MyBatis-Plus【踩坑记录01】

不要使用Mybatis原生的SqlSessionFactory,而应使用MybatisSqlSessionFactory。

原因

  1. 依赖关系如下

    因此会在使用Mybaits-Plus时默认的时Mybatis原生的SqlSessionFactory

  2. 因为MybatisPlus中自定义了MybatisSqlSessionFactoryBean这个类,而这个类是实现了FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent>这些接口,而在Mybatis中有一个SqlSessionFactoryBean类也实现了这些接口,所以在MybatisPlus的配置文件中配置SqlSessionFactoryBean时需要换成MybatisPlus中自定义的这个类MyBatisSqlSessionFactoryBean,否则使用原生的SqlSessionFactoryBean会产生很多问题,这也是官方文档出现-invalid-bound-statement-not-found-异常中的最后第4点特别说明并推荐的

解决方案

相应的配置类如下

package zeyfra.com.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import zeyfra.com.aspect.mybatis_plus.MyMetaObjectHandler;

import javax.sql.DataSource;

/**
 * MyBatis-Plus配置类
 * @author ZeyFra
 * @date 2021/2/16 13:27
 */
@Configuration
@EnableTransactionManagement
@MapperScan("zeyfra.com.modules.**.mapper")
public class MybatisPlusConfig {


    @Bean("sqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Autowired @Qualifier("dataSource") DataSource dataSource) throws Exception {

        // 未使用MyBatis-Plus的分页插件的小伙伴可忽略此部分
        // MybatisPlus内部拦截器
        // 为自动分页插件设置DB类型
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        // 可添加自定义拦截器,没有自定义拦截器的小伙伴可忽略此部分
        // MybatisConfiguration
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        mybatisConfiguration.addInterceptor(mybatisPlusInterceptor);

        // 开启缓存,可自行选择
        mybatisConfiguration.setCacheEnabled(true);

        // 使用MybatisSqlSessionFactoryBean
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();

        // 设置数据源
        sqlSessionFactoryBean.setDataSource(dataSource);

       // 添加MybatisConfiguration
        sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);


        // 设置mapper相应的xml路径
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:zeyfra/com/modules/**/*.xml"));

        // 返回MybatisSqlSessionFactoryBean从而替代原生的sqlSessionFactory
        return sqlSessionFactoryBean.getObject();
    }

}

注意:

1、使用MybatisSqlSessionFactory之后配置应重新在此注入相应的拦截器

2、在3.4.0过后已弃用PaginationInterceptor,应使用MybatisPlusInterceptor添加自动分页插件PaginationInnerInterceptor

3、应在自动分页插件设置DB类型,否则容易出现分页查询后total为0的问题

4、pageHelper依赖会与自动分页插件产生冲突,也会出现分页查询后total为0的问题

posted @ 2021-02-24 10:26  ZeyFra  阅读(491)  评论(2编辑  收藏  举报