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

这篇具有很好参考价值的文章主要介绍了单个数据源与多数据源使用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个数据源的完整定义:文章来源地址https://www.toymoban.com/news/detail-857784.html

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);
    }

}

到了这里,关于单个数据源与多数据源使用mybatisplus分页插件total一直为0的解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于MyBatis拦截器失效问题的解决(多数据源、分页插件)

    最近做了一个备份被delete语句删除的数据的小插件,是用MyBatis的拦截器去做的。 但是发现在一个项目中会失效,没有去备份删除的数据,查看日志发现请求并没有进入到拦截器中,换句话说就是拦截器失效了。 百度了一下(哎,百度)发现说的最多的就是分页插件导致的,

    2024年02月14日
    浏览(30)
  • 若依分离版——解决配置双数据源oracle,mysql分页错误问题

    1. 按照若依的手册配置双数据源mysql,oracle   2. 在service指定 数据源 @DataSource(value = DataSourceType.MASTER) 或者@DataSource(value = DataSourceType.SLAVE) 3. 发现出现使用分页的情况下报错,不使用分页时正常。 4.  最后找到解决办法,是application.yml文件的pagehelper分页配置有误,正确配置如

    2024年02月15日
    浏览(38)
  • Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

    在Android笔记(二十二):Paging3分页加载库结合Compose的实现网络单一数据源访问一文中,实现了单一数据源的访问。在实际运行中,往往希望不是单纯地访问网络数据,更希望将访问的网络数据保存到移动终端的SQLite数据库中,使得移动应用在离线的状态下也可以从数据库中

    2024年01月16日
    浏览(31)
  • 数据源使用问题记录

     \\\"Zero date value prohibited\\\"  url上拼接 zeroDateTimeBehavior=convertToNull com.alibaba.druid.pool.DruidDataSource : create connection Error java.lang.ExceptionInInitializerError: null at com.mysql.jdbc.Util.stackTraceToString(Util.java:378) at com.mysql.jdbc.Util.(Util.java:121) at com.mysql.jdbc.NonRegisteringDriver.parseURL(NonRegistering

    2024年02月20日
    浏览(30)
  • springboot多数据源使用

    在工作上有一个新项目,现在需要获取旧项目的用户信息、积分的操作等等,所以需要调用另外一个项目的数据库,所以我们可以配置多数据源。 yml版本  properties版本 在impl类上加注解@DS(\\\"master\\\"),master为配置的master名字 调用方法  获取结果  在impl类上加注解@DS(\\\"slave_1\\\"),

    2024年02月11日
    浏览(30)
  • Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理

    在软件开发中, 多数据源 的应用越来越普遍,特别是在 微服务架构 和 业务模块化 的场景下。多数据源能够让不同的业务模块和微服务拥有各自独立的数据存储,大大提高了系统的灵活性和可维护性。本文将深入探讨多数据源的配置和实施,以及在 Spring Boot 环境下,如何通

    2024年02月07日
    浏览(51)
  • qml使用QAbstractListModel作为数据源

    在日常开发中界面为了快速并且炫酷,大家可能会选择qml作为主体。但是后台数据的提供还是用qt c++的实现,MVC中即可用Model进行。例如:QAbstractListModel 一般的使用只实现下面三个函数即可支撑qml中的交互: 但是想要一些其他的功能,就需要自己去实现了! 一、例如想进行

    2024年02月11日
    浏览(28)
  • dolphinscheduler 3.0.1 数据源中心及使用

    🔼上一集:dolphinscheduler 3.0.1数据质量 *️⃣主目录:dolphinscheduler 3.0.1功能梳理及源码解读 🔽下一集:dolphinscheduler 3.0.1 监控中心(上):服务管理 2.0常见数据库都支持,MySQL、PostgreSQL、Oracle、SQLServer、Hive,这样都验证过,都支持,Spark是不支持的,2.0没开发spark数据库组件,

    2023年04月08日
    浏览(30)
  • springboot使用DynamicDataSource来动态切换数据源

    DynamicDataSource是一个数据源路由器,可以根据上下文动态选择数据源。可以在每个请求或线程中将数据源设置为当前需要使用的数据. 创建一个 DynamicDataSource 类,它继承自 AbstractRoutingDataSource 。在该类中重写**determineCurrentLookupKey()**方法,该方法返回一个字符串,用于指示当前

    2024年02月05日
    浏览(33)
  • docker版jxTMS使用指南:数据源简述

    本文讲解4.2版jxTMS的数据源,整个系列的文章请查看:docker版jxTMS使用指南:4.2版升级内容 docker版本的使用,请参考docker版jxTMS使用指南 4.0版jxTMS的说明,请查看:4.0版升级内容 4.0版jxTMS主要是通过MQTT进行采集。这种采集模式是前端主动的、定时的向接口机进行推送,但对于

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包