SpringBoot配置数据源及MyBatis分页的要点

背景SpringBoot 整合 MyBatisPlus 分页时 , 如果分页插件配置不正确 , 容易出现分页无效的问题 , 这种情况常见于自定义数据源的情况 。
MyBatis 的分页有两种 , 一种是用 MyBatisPlus 的分页 , 另一种是使用 PageHelper 分页插件 。 无论哪一种 , 都需要为数据源设置分页插件配置 。
如果使用 SpringBoot 自带的数据源 , 则不需要手动设置分页插件 , 只需要提供分页插件配置类即可;如果是自定义的数据源 , 则必须为其配置分页插件 。
分页插件配置首先 , 为项目添加一项分页插件配置类 MyBatisPlusConfig , 代码很简单:
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();}}使用 SpringBoot 默认的数据源这种方式 , 直接在 application.yml 中添加 spring.dataSource 配置即可:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db?allowMultiQueries=true --tt-darkmode-color: #999999;">注意 , 数据库连接地址的 key 为 url, MyBatisPlus 的分页插件能自动生效 。
使用自定义数据源自定义数据源时 , 需要编写数据源类, 通过 @ConfigurationProperties 注解指定数据源配置信息 , 此时需要单独为数据源设置 MyBatisPlus 分页插件 , 否则分页查询将会无效 。
@Configurationpublic class MysqlDataSourceConfig {@Autowiredprivate PaginationInterceptor paginationInterceptor; @Primary @Bean(name = "mysqlDataSource")@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource() {return DataSourceBuilder.create().build();}@Primary@Bean(name = "mysqlSqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);//mybatis plus 配置MybatisConfiguration configuration = new MybatisConfiguration();configuration.setJdbcTypeForNull(JdbcType.NULL);configuration.setMapUnderscoreToCamelCase(true);configuration.setCacheEnabled(false);sessionFactory.setConfiguration(configuration);// 设置 MyBatis 分页插件 , 否则分页查询将不会生效sessionFactory.setPlugins(paginationInterceptor);return sessionFactory.getObject();}}需要注意的是:数据源的配置信息 , 不能与默认的 datasource 一致 , 否则会报异常:
ERROR [com.zaxxer.hikari.HikariConfig] - HikariPool-1 - jdbcUrl is required with driverClassName.异常说明数据库连接地址信息缺少 jdbc-url, 将 url 改为 jdbc-url, 正确启动 。
要点是数据源的分页插件和 key:

  1. sessionFactory.setPlugins(paginationInterceptor);
  2. 数据源配置 key 为 jdbc-url
启示录疑问:理论上使用 SpringBoot 默认数据源和自定义数据源 , 配置信息应该一样才对 , 也都到一些文章的 demo 中二者的配置信息是一样的 。
那么 , 是什么原因导致两种配置的 key 有差异的呢?猜测可能是 SpringBoot 版本问题 。
最终找到了答案:DataSourceBuilder 创建数据源时 , SpringBoot2.0 中用的是key 是 jdbc-url, 而 1.5 版本用的是 url。 所以稳妥的办法是 , 同时配置这两种信息: