框架环境:springboot:2.7.2 mybatis-plus:2.3
引入依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.1</version>
</dependency>
配置application.yml文件修改:
spring:
datasource:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://主数据源地址:3306/数据库名称?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: wqcs2023
type: com.alibaba.druid.pool.DruidDataSource
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://此数据源地址:3306/数据库名称?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: wqcs2023
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name这里使用的是mysql的,可根据数据类型的不同添加
注意:我这使用的是springboot2.0以上的配置路径用jdbc-url,1.0用url
添加两个配置类
主配置
package com.crrs.config;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
/**
* @program:
* @description: 数据库配置1
* @author: wys
* @create: 2019-12-03 16:20
**/
@Configuration
@MapperScan(basePackages = {"com.crrs.modules.*.dao.*","com.crrs.common.utils.PubConfigUtil"}, sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class OneDataSourceConfig {
@Bean(name="db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db1")
@Primary
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name="db1SqlSessionFactory")
@Primary
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*/*.xml"));
return bean.getObject();
}
@Bean(name="db1TransactionManager")
@Primary
public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name="db1SqlSessionTemplate")
@Primary
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
次数据库配置:
package com.crrs.config;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.crrs.cwgl.dao",sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DataSource2Config {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/cwgl/*.xml"));
return bean.getObject();
}
@Bean
public DataSourceTransactionManager db2TransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
运行过程中可能会遇到的问题:
1.java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName
此类问题就是springboot的版本引入数据的类型变动的问题,1.x用url ,2.x用jdbc-url.
如上文配置文件中如果springboot的版本是1.x,修改数据库配置为:
spring:
datasource:
db1:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://主数据源地址:3306/数据库名称?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: wqcs2023
type: com.alibaba.druid.pool.DruidDataSource
db2:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://此数据源地址:3306/数据库名称?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: wqcs2023
type: com.alibaba.druid.pool.DruidDataSource
2.Caused by: java.lang.IllegalArgumentException: Data sources cannot be empty.
引入上文的依赖后,项目启动会出现上述问题,原因是sharding-jdbc没有配置默认的连接数据库,需要在启动类中屏蔽自动装载的类。
exclude={DataSourceAutoConfiguration.class, SpringBootConfiguration.class}
3.org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
此类问题产生的原因有很多,目前根据我部署时遇到的情况分析:
3.1.可能是xml映射文件或者接口不对应,可确认是否接口方法和映射文件对应,xml文件中的namespace地址是否正确。映射文件是否放在resources目录下
3.2使用的SqlSessionFactory引入的不对,mybatis引入的应该使MybatisSqlSessionFactoryBean