龙空技术网

SpringBoot数据源及MyBatis分页配置坑点

毕小宝 2613

前言:

今天姐妹们对“springboot配置多数据源无效”都比较关注,姐妹们都需要学习一些“springboot配置多数据源无效”的相关内容。那么小编也在网摘上汇集了一些关于“springboot配置多数据源无效””的相关文章,希望大家能喜欢,各位老铁们快快来学习一下吧!

背景

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 {    @Bean    public PaginationInterceptor paginationInterceptor(){        return new PaginationInterceptor();    }}
使用 SpringBoot 默认的数据源

这种方式,直接在 application.yml 中添加 spring.dataSource 配置即可:

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&&serverTimezone=UTC    username: root    password: 12345    type: com.alibaba.druid.pool.DruidDataSource

注意,数据库连接地址的 key 为 url ,MyBatisPlus 的分页插件能自动生效。

使用自定义数据源

自定义数据源时,需要编写数据源类 ,通过 @ConfigurationProperties 注解指定数据源配置信息,此时需要单独为数据源设置 MyBatisPlus 分页插件,否则分页查询将会无效。

@Configurationpublic class MysqlDataSourceConfig {    @Autowired    private 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:

sessionFactory.setPlugins(paginationInterceptor);数据源配置 key 为 jdbc-url启示录

疑问:理论上使用 SpringBoot 默认数据源和自定义数据源,配置信息应该一样才对,也都到一些文章的 demo 中二者的配置信息是一样的。

那么,是什么原因导致两种配置的 key 有差异的呢?猜测可能是 SpringBoot 版本问题。

最终找到了答案:DataSourceBuilder 创建数据源时,SpringBoot2.0 中用的是key 是 jdbc-url ,而 1.5 版本用的是 url 。所以稳妥的办法是,同时配置这两种信息:

spring:  dataSource:    driver-class-name: com.mysql.cj.jdbc.Driver    jdbc-url: jdbc:mysql://localhost:3306/db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&&serverTimezone=UTC    url: jdbc:mysql://localhost:3306/db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&&serverTimezone=UTC    username: root    password: 12345    type: com.alibaba.druid.pool.DruidDataSource

标签: #springboot配置多数据源无效