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


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

    1. import com.baomidou.mybatisplus.annotation.DbType;
    2. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    3. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. /*
    7. 如果不注册分页插件,那么查询数据时,数据能正常查询,但是total是0
    8. * */
    9. @Configuration
    10. public class MyBatisPlusConfig {
    11. @Bean
    12. public MybatisPlusInterceptor mybatisPlusInterceptor() { //注册插件
    13. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //new一个mybatisplus插件对象,再下面注入各插件
    14. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); // 分页插件
    15. //interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件
    16. //乐观锁插件机制:Plus是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会+1。当事务A要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,会校验刚才读取到的 version 值与当前数据库中的 version 值相等
    17. return interceptor;
    18. }
    19. }

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

    2. 多数据源定义:

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

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

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

    1. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    2. import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    3. import org.apache.ibatis.plugin.Interceptor;
    4. import org.apache.ibatis.session.SqlSessionFactory;
    5. import org.mybatis.spring.SqlSessionTemplate;
    6. import org.mybatis.spring.annotation.MapperScan;
    7. import org.springframework.beans.factory.annotation.Qualifier;
    8. import org.springframework.boot.context.properties.ConfigurationProperties;
    9. import org.springframework.boot.jdbc.DataSourceBuilder;
    10. import org.springframework.context.annotation.Bean;
    11. import org.springframework.context.annotation.Configuration;
    12. import org.springframework.context.annotation.Primary;
    13. import org.springframework.jdbc.core.JdbcTemplate;
    14. import javax.sql.DataSource;
    15. /**
    16. * 数据源配置类
    17. */
    18. @Configuration
    19. @MapperScan(basePackages = {"com.epson.vipwp.dao", "com.epson.vipwp.config"}) //直接MyBatisPlusConfig定义
    20. public class DataSourceConfig {
    21. //以下四个DataSource不能定义在这,否则将循环引用,springboot无法启动
    22. // @Autowired private DataSource dataSourceAssy; // 装配ASSY数据源 ---//省略后面几个,反正也不能定义
    23. // 定义ASSY数据源相关的Bean
    24. // 使用@Primary注解表示当存在多个同类型的Bean时,优先选择该Bean
    25. @Primary
    26. @Bean(name = "dataSourceAssy")
    27. @ConfigurationProperties(prefix = "spring.datasource.assy")
    28. public DataSource dataSourceAssy() {
    29. return DataSourceBuilder.create().build();
    30. } // 使用DataSourceBuilder创建数据源
    31. @Primary
    32. @Bean(name = "jdbcTemplateAssy")
    33. public JdbcTemplate jdbcTemplateAssy(@Qualifier("dataSourceAssy") DataSource dataSource) {
    34. return new JdbcTemplate(dataSource); // 创建JdbcTemplate实例,用于执行SQL操作
    35. }
    36. @Primary // 指定为默认SqlSessionFactory
    37. @Bean(name = "sqlSessionFactory") //默认数据源不能乱起名字,必须叫sqlSessionFactory
    38. public SqlSessionFactory sqlSessionFactoryAssy(@Qualifier("dataSourceAssy") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
    39. MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
    40. factory.setDataSource(dataSource);// 设置数据源
    41. Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
    42. factory.setPlugins(interceptors);
    43. // 加载mybatis的相关配置文件,如果有的话
    44. // factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
    45. // 设置实体类别名包扫描
    46. factory.setTypeAliasesPackage("com.epson.vipwp.domain");
    47. // 添加 SqlSessionTemplate Bean 的定义
    48. return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    49. }
    50. //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    51. @Primary
    52. @Bean(name = "sqlSessionTemplate")
    53. public SqlSessionTemplate sqlSessionTemplateAssy(SqlSessionFactory sqlSessionFactoryAssy) {
    54. return new SqlSessionTemplate(sqlSessionFactoryAssy);
    55. }
    56. //POP
    57. @Bean(name = "dataSourcePop")
    58. @ConfigurationProperties(prefix = "spring.datasource.pop")
    59. public DataSource dataSourcePop() {
    60. return DataSourceBuilder.create().build();
    61. }// 使用DataSourceBuilder创建POP数据源
    62. @Bean(name = "jdbcTemplatePop")
    63. public JdbcTemplate jdbcTemplatePop(@Qualifier("dataSourcePop") DataSource dataSource) {
    64. return new JdbcTemplate(dataSource);// 创建POP JdbcTemplate实例,用于执行SQL操作
    65. }
    66. @Bean(name = "sqlSessionFactoryPop")
    67. public SqlSessionFactory sqlSessionFactoryPop(@Qualifier("dataSourcePop") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
    68. MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
    69. factory.setDataSource(dataSource);// 设置数据源
    70. factory.setTypeAliasesPackage("com.epson.vipwp.domain");
    71. Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
    72. factory.setPlugins(interceptors);
    73. // 添加 SqlSessionTemplate Bean 的定义
    74. return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    75. }
    76. //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    77. @Bean(name = "sqlSessionTemplatePop")
    78. public SqlSessionTemplate sqlSessionTemplatePop(SqlSessionFactory sqlSessionFactoryPop) {
    79. return new SqlSessionTemplate(sqlSessionFactoryPop);
    80. }
    81. //OQC
    82. @Bean(name = "dataSourceOqc")
    83. @ConfigurationProperties(prefix = "spring.datasource.oqc")
    84. public DataSource dataSourceOqc() {
    85. return DataSourceBuilder.create().build();
    86. }
    87. @Bean(name = "jdbcTemplateOqc")
    88. public JdbcTemplate jdbcTemplateOqc(@Qualifier("dataSourceOqc") DataSource dataSource) {
    89. return new JdbcTemplate(dataSource);
    90. }
    91. @Bean(name = "sqlSessionFactoryOqc")
    92. public SqlSessionFactory sqlSessionFactoryOqc(@Qualifier("dataSourceOqc") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
    93. MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
    94. factory.setDataSource(dataSource);// 设置数据源
    95. factory.setTypeAliasesPackage("com.epson.vipwp.domain");
    96. Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
    97. factory.setPlugins(interceptors);
    98. // 添加 SqlSessionTemplate Bean 的定义
    99. return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    100. }
    101. //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    102. @Bean(name = "sqlSessionTemplateOqc")
    103. public SqlSessionTemplate sqlSessionTemplateOqc(SqlSessionFactory sqlSessionFactoryOqc) {
    104. return new SqlSessionTemplate(sqlSessionFactoryOqc);
    105. }
    106. //qpost
    107. @Bean(name = "dataSourceQpost")
    108. @ConfigurationProperties(prefix = "spring.datasource.qpost")
    109. public DataSource dataSourceQpost() {
    110. return DataSourceBuilder.create().build();
    111. }
    112. @Bean(name = "jdbcTemplateQpost")
    113. public JdbcTemplate jdbcTemplateQpost(@Qualifier("dataSourceQpost") DataSource dataSource) {
    114. return new JdbcTemplate(dataSource);
    115. }
    116. @Bean(name = "sqlSessionFactoryQpost")
    117. public SqlSessionFactory sqlSessionFactoryQpost(@Qualifier("dataSourceQpost") DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
    118. MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean ();// 创建SqlSessionFactoryBean实例
    119. factory.setDataSource(dataSource);// 设置数据源
    120. factory.setTypeAliasesPackage("com.epson.vipwp.domain");
    121. Interceptor[] interceptors = new Interceptor[] { mybatisPlusInterceptor };
    122. factory.setPlugins(interceptors);
    123. // 添加 SqlSessionTemplate Bean 的定义
    124. return factory.getObject();// 返回SqlSessionFactory实例,用于创建SqlSession,使用SqlSession调用sql时不需要指定数据源,因为就在此处指定了
    125. }
    126. //如果要将 SqlSessionTemplate 作为单独的 Bean 注入,可以这样:
    127. @Bean(name = "sqlSessionTemplateQpost")
    128. public SqlSessionTemplate sqlSessionTemplateQpost(SqlSessionFactory sqlSessionFactoryQpost) {
    129. return new SqlSessionTemplate(sqlSessionFactoryQpost);
    130. }
    131. }

  • 相关阅读:
    【51单片机论流水灯的工作原理】2023-10-3
    区块链的发展才算是跳出了互联网式的发展怪圈,真正进入到一个全新的阶段
    OCR基本原理
    MIT 6.NULL The Missing Semester of Your CS Education(1)
    C语言重点突破(3)字符串函数与内存函数的介绍
    MAC苹果电脑关闭系统完整性保护SIP
    【每日一题】找到字符串中所有字母异位词
    9. React 高阶组件是什么, 和普通组件有什么区别, 适用什么场景?
    2:第一章:认识JVM规范1:JVM简介;
    新平台(基于Linux)导入BSP主要任务
  • 原文地址:https://blog.csdn.net/qq3892997/article/details/137955279