单个数据源与多数据源使用mybatisplus分页插件total一直为0的解决办法

1. 注册分页插件(不注册分页插件total也是0)

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/*
如果不注册分页插件,那么查询数据时,数据能正常查询,但是total是0
* */

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() { //注册插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //new一个mybatisplus插件对象,再下面注入各插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); // 分页插件
        //interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件
        //乐观锁插件机制:Plus是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会+1。当事务A要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,会校验刚才读取到的 version 值与当前数据库中的 version 值相等
        return interceptor;
    }
}

注意:如果是单数据源此时分页插件能正常使用,而如果是多数据源,那么就必须添加以下内容,否则分页时查询总数total还是0

2. 多数据源定义:

 @Bean(name = "sqlSessionFactoryPop")
    public SqlSessionFactory sqlSessionFactoryPop(@Qualifier("dataSourcePop") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
        MybatisSqlSessionFactoryBean  factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
        factory.setDataSource(dataSource);// 设置数据源
        factory.setTypeAliasesPackage("com.epson.vipwp.domain");
        Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
        factory.setPlugins(interceptors);
        // 添加 SqlSessionTemplate Bean 的定义
        return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    }

重点就是以下两行: 
Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
 factory.setPlugins(interceptors);  //也就是多数据源必须在定义数据源时添加以上2句,否则分页插件无效

 我自己4个数据源的完整定义:

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * 数据源配置类
 */
@Configuration
@MapperScan(basePackages = {"com.epson.vipwp.dao", "com.epson.vipwp.config"})  //直接MyBatisPlusConfig定义
public class DataSourceConfig {
//以下四个DataSource不能定义在这,否则将循环引用,springboot无法启动
//  @Autowired  private DataSource dataSourceAssy; // 装配ASSY数据源  ---//省略后面几个,反正也不能定义

    // 定义ASSY数据源相关的Bean
    // 使用@Primary注解表示当存在多个同类型的Bean时,优先选择该Bean
    @Primary
    @Bean(name = "dataSourceAssy")
    @ConfigurationProperties(prefix = "spring.datasource.assy")
    public DataSource dataSourceAssy() {
        return DataSourceBuilder.create().build();
    } // 使用DataSourceBuilder创建数据源

    @Primary
    @Bean(name = "jdbcTemplateAssy")
    public JdbcTemplate jdbcTemplateAssy(@Qualifier("dataSourceAssy") DataSource dataSource) {
        return new JdbcTemplate(dataSource); // 创建JdbcTemplate实例,用于执行SQL操作
    }
    @Primary // 指定为默认SqlSessionFactory
    @Bean(name = "sqlSessionFactory") //默认数据源不能乱起名字,必须叫sqlSessionFactory
    public SqlSessionFactory sqlSessionFactoryAssy(@Qualifier("dataSourceAssy") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
        factory.setDataSource(dataSource);// 设置数据源
        Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
        factory.setPlugins(interceptors);
        // 加载mybatis的相关配置文件,如果有的话
        // factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        // 设置实体类别名包扫描
        factory.setTypeAliasesPackage("com.epson.vipwp.domain");
        // 添加 SqlSessionTemplate Bean 的定义
        return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    }
    //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
     @Primary
     @Bean(name = "sqlSessionTemplate")
     public SqlSessionTemplate sqlSessionTemplateAssy(SqlSessionFactory sqlSessionFactoryAssy) {
         return new SqlSessionTemplate(sqlSessionFactoryAssy);
     }

    //POP
    @Bean(name = "dataSourcePop")
    @ConfigurationProperties(prefix = "spring.datasource.pop")
    public DataSource dataSourcePop() {
        return DataSourceBuilder.create().build();
    }// 使用DataSourceBuilder创建POP数据源
    @Bean(name = "jdbcTemplatePop")
    public JdbcTemplate jdbcTemplatePop(@Qualifier("dataSourcePop") DataSource dataSource) {
        return new JdbcTemplate(dataSource);// 创建POP JdbcTemplate实例,用于执行SQL操作
    }

    @Bean(name = "sqlSessionFactoryPop")
    public SqlSessionFactory sqlSessionFactoryPop(@Qualifier("dataSourcePop") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
        MybatisSqlSessionFactoryBean  factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
        factory.setDataSource(dataSource);// 设置数据源
        factory.setTypeAliasesPackage("com.epson.vipwp.domain");
        Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
        factory.setPlugins(interceptors);
        // 添加 SqlSessionTemplate Bean 的定义
        return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    }
    //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    @Bean(name = "sqlSessionTemplatePop")
    public SqlSessionTemplate sqlSessionTemplatePop(SqlSessionFactory sqlSessionFactoryPop) {
        return new SqlSessionTemplate(sqlSessionFactoryPop);
    }

    //OQC
    @Bean(name = "dataSourceOqc")
    @ConfigurationProperties(prefix = "spring.datasource.oqc")
    public DataSource dataSourceOqc() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "jdbcTemplateOqc")
    public JdbcTemplate jdbcTemplateOqc(@Qualifier("dataSourceOqc") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "sqlSessionFactoryOqc")
    public SqlSessionFactory sqlSessionFactoryOqc(@Qualifier("dataSourceOqc") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
        MybatisSqlSessionFactoryBean  factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
        factory.setDataSource(dataSource);// 设置数据源
        factory.setTypeAliasesPackage("com.epson.vipwp.domain");
        Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
        factory.setPlugins(interceptors);
        // 添加 SqlSessionTemplate Bean 的定义
        return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    }
    //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    @Bean(name = "sqlSessionTemplateOqc")
    public SqlSessionTemplate sqlSessionTemplateOqc(SqlSessionFactory sqlSessionFactoryOqc) {
        return new SqlSessionTemplate(sqlSessionFactoryOqc);
    }

    //qpost
    @Bean(name = "dataSourceQpost")
    @ConfigurationProperties(prefix = "spring.datasource.qpost")
    public DataSource dataSourceQpost() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "jdbcTemplateQpost")
    public JdbcTemplate jdbcTemplateQpost(@Qualifier("dataSourceQpost") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
    @Bean(name = "sqlSessionFactoryQpost")
    public SqlSessionFactory sqlSessionFactoryQpost(@Qualifier("dataSourceQpost") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
        MybatisSqlSessionFactoryBean  factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
        factory.setDataSource(dataSource);// 设置数据源
        factory.setTypeAliasesPackage("com.epson.vipwp.domain");
        Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
        factory.setPlugins(interceptors);
        // 添加 SqlSessionTemplate Bean 的定义
        return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    }
    //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    @Bean(name = "sqlSessionTemplateQpost")
    public SqlSessionTemplate sqlSessionTemplateQpost(SqlSessionFactory sqlSessionFactoryQpost) {
        return new SqlSessionTemplate(sqlSessionFactoryQpost);
    }

}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事不堪回首..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值