SpringBoot+MyBatis配置多数据源
SpringBoot+MyBatis配置多数据源
在应用的入口中,我们需要修改一下,主要功能是能不能自动识别xml配置文件里面的设置,需要手动代码设置
例如:mybatis.mapper-locations=classpath:dbxml/*.xml
//排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
这是因为SpringBoot会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除DataSourceAutoConfiguration的自动配置.
配置数据源
这里我们配置来两个数据源 一个是shopcart,一个website,修改application.properties文件
# 数据库配置 #基本属性-- spring.datasource.shopcart.url=jdbc:mysql://127.0.0.1:3306/program_shopcart?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.shopcart.username=sa spring.datasource.shopcart.password=1234 spring.datasource.shopcart.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.shopcart.type-aliases-package=tb.db.mysql.shopcart.mybatis.pojo #基本属性-- spring.datasource.website.url=jdbc:mysql://127.0.0.1:3306/program_shopcart?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.website.username=sa spring.datasource.website.password=1234 spring.datasource.website.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.website.type-aliases-package=tb.db.mysql.shopcart.mybatis.pojo # mybatis配置 mybatis.mapper-locations=classpath:dbxml/*.xml
创建配置文件封装类
为了更合理的使用配置文件,这里我们没有使用之前的@Value,而是自己封装一个PropertiesConfig类对象.如下
@Data注解需要添加Lombok插件并开启,需要不想安装的话,请为下面的四个成员变量提供set/get方法即可
数据源shopcart配置文件封装
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* <pre>
* 数据源shopcart配置文件封装
* </pre>
*
* @author wangyunpeng
* @date 2020/2/24 8:52
*/
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.shopcart")
public class ShopCartDataBaseProperties {
String url;
String username;
String password;
String driverClassName;
String typeAliasesPackage;
}
数据源website配置文件封装
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* <pre>
* 数据源website配置文件封装
* </pre>
*
* @author wangyunpeng
* @date 2020/2/24 8:53
*/
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.website")
public class WebSiteDataBaseProperties {
String url;
String username;
String password;
String driverClassName;
String typeAliasesPackage;
}
完成数据源配置
这里需要完成DataSource/SqlSessionFactory/SessionTemp等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的Bean必须使用@Primary完成注解.
下面是两个数据源的配置,其中ShopCart使用了@Primary注解
MapperScan注解的basePackages 表示了其目录下的Mapper使用文件使用该数据源,如ShopCartDataSource中表示tb.db.mysql.shopcart.mybatis下的Maper文件将使用ShopCartDataSource.
第一个数据源: ShopCartDataSource
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.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* <pre>
* 完成shopcart数据源配置
* </pre>
*
* @author wangyunpeng
* @date 2020/2/24 9:00
*/
@Configuration
@MapperScan(basePackages = "tb.db.mysql.shopcart.mybatis"
, sqlSessionTemplateRef ="shopcartSqlSessionTemplate")
public class ShopCartDataSourceConfig {
/**
* 注入类 Environment 可以很方便的获取配置文件中的参数
*/
@Resource
private Environment env;
@Resource
private ShopCartDataBaseProperties prop;
/**
* 创建数据源
* @return
*/
@Bean(name = "shopcartDS")
@Primary
public DataSource getDataSource() {
DataSource build = DataSourceBuilder.create()
.driverClassName(prop.driverClassName)
.url(prop.url)
.username(prop.username)
.password(prop.password)
.build();
return build;
}
/**
* 创建SessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "shopcartSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("shopcartDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setTypeAliasesPackage(prop.typeAliasesPackage);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
return bean.getObject();
}
/**
* 创建事务管理器
* @param dataSource
* @return
*/
@Bean("shopcartTransactionManger")
@Primary
public DataSourceTransactionManager transactionManger(@Qualifier("shopcartDS") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/**
* 创建SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name = "shopcartSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("shopcartSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
第二个数据源:WebSiteDataSource
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.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* <pre>
*完成website数据源配置
* </pre>
*
* @author wangyunpeng
* @date 2020/2/24 9:06
*/
@Configuration
@MapperScan(basePackages = "tb.db.mysql.website.mybatis"
, sqlSessionTemplateRef ="websiteSqlSessionTemplate")
public class WebSiteDataSourceConfig {
/**
* 注入类 Environment 可以很方便的获取配置文件中的参数
*/
@Resource
private Environment env;
@Resource
private WebSiteDataBaseProperties prop;
/**
* 创建数据源
* @return
*/
@Bean(name = "websiteDS")
public DataSource getDataSource() {
DataSource build = DataSourceBuilder.create()
.driverClassName(prop.driverClassName)
.url(prop.url)
.username(prop.username)
.password(prop.password)
.build();
return build;
}
/**
* 创建SessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "websiteSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("websiteDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setTypeAliasesPackage(prop.typeAliasesPackage);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
return bean.getObject();
}
/**
* 创建事务管理器
* @param dataSource
* @return
*/
@Bean("websiteTransactionManger")
@Primary
public DataSourceTransactionManager transactionManger(@Qualifier("websiteDS") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/**
* 创建SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name = "websiteSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("websiteSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
实现Mapper
根据数据源配置的MappScan目录来创建测试Mapper,代码如下,注意包名,放在正确的位置上.
程序入口Program
// 排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

浙公网安备 33010602011771号