1.pom.xml文件里加入
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.0
2.application.properties配置文件中加入数据源配置(application.yml同理转化)
###########多数据源整合###############
#datasource.test1
spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.test1.username=root
spring.datasource.test1.password=root
#datasource.test2
spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.test2.username=root
spring.datasource.test2.password=root
3.编写datasource配置类
先建好test01、test02包,后面用到,以便这里配置mybatis的接口类存放位置
DataSource1Config:
//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.mybatisspringboot.demo.test01", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {
// 将这个对象放入Spring容器中
@Bean(name = "test1DataSource")
// 表示这个数据源是默认数据源
@Primary
// 读取application.properties中的配置参数映射成为一个对象
// prefix表示参数的前缀
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource getDateSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test1SqlSessionFactory")
// 表示这个数据源是默认数据源
@Primary
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/mapper/test01/*.xml"));
return bean.getObject();
}
@Bean("test1SqlSessionTemplate")
// 表示这个数据源是默认数据源
@Primary
public SqlSessionTemplate test1sqlsessiontemplate(
@Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
DataSource2Config:
@Configuration
@MapperScan(basePackages = "com.mybatisspringboot.demo.test02", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSource2Config {
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource getDateSource2() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test2SqlSessionFactory")
public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/mapper/test02/*.xml"));
return bean.getObject();
}
@Bean("test2SqlSessionTemplate")
public SqlSessionTemplate test2sqlsessiontemplate(
@Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
4.持久层按原本的mapper(或是dao),创建不同包。比如此前放在mapper包下,这次我为这两个数据源分别 创建了两个包,以包名来区分数据源,并且之前包名为mapper,这次以dao命名,具体例如UserMapperTest01的编写和普通的mapper类一样。
5.创建resources下的xml对应位置,具体扫描.xml文件可在application.properties中配置
#指定mybatis映射文件的地址
mybatis.mapper-locations=classpath*:mybatis/**/*.xml
1.最坑的地方是路径.xml的路径配置问题
1.1 application.properties
1.2 datasource配置类中指定
2.@Primary //该注解表示在同一个接口有多个实现类可以注入的时候,默认选择哪一个,而不是让autowire注解报错,官网要求当多个数据源时,必须指定一个datasource,另一个datasource则不用添加。
3.xml文件mapper namespace记得修改成对应的命名空间
4.application.properties配置数据库的访问路径有两点需要注意:jdbc-url,还有数据库名后面添加以下,否则启动时候会报一个包含乱码在内的一个错误,启动失败。
数据库名?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
5.以上是楼主主要遇到坑,网上还有一堆解决方法,具体问题再具体查找,加油。