数据源1:
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.context.annotation.Primary;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.lnsoft.common.dbutil.ProJdbcTemplate;
/**
* 数据源配置
*
*/
@Configuration
@MapperScan(basePackages = GydlDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "gydlSqlSessionFactory")
public class GydlDataSourceConfig {
// 精确数据源目录,以便与其他数据源隔离
static final String PACKAGE = "com.lnsoft.patrol.mapper.gydl";
static final String MAPPER_LOCATION = "classpath:mybatis/mapper/gydl/*.xml";
static final String CONFIG_LOCATION = "classpath:mybatis/mybatis-config.xml";
@Primary
@Bean(name = "gydlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.gydl")
public DataSource gydlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "gydlJdbcTemplate")
public JdbcTemplate gydlJdbcTemplate(@Qualifier("gydlDataSource") javax.sql.DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "proJdbcTemplate")
public ProJdbcTemplate proJdbcTemplate(@Qualifier("gydlDataSource") javax.sql.DataSource dataSource) {
return new ProJdbcTemplate(dataSource);
}
/*
* 配置事务管理器
*/
@Primary
@Bean(name = "gydlTransactionManager")
public DataSourceTransactionManager gydlTransactionManager() {
return new DataSourceTransactionManager(gydlDataSource());
}
/*
* SqlSessionFactory配置
*/
@Primary
@Bean(name = "gydlSqlSessionFactory")
public SqlSessionFactory gydlSqlSessionFactory(@Qualifier("gydlDataSource") DataSource gydlDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(gydlDataSource);
sessionFactory.setTypeAliasesPackage("com.lnsoft.visual.pojo");
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(CONFIG_LOCATION));
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
数据源2:
/**
* 数据源配置
*
*/
@Configuration
@MapperScan(basePackages = GisDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "gydlgisSqlSessionFactory")
public class GisDataSourceConfig {
// 精确数据源目录,以便与其他数据源隔离
static final String PACKAGE = "com.lnsoft.patrol.mapper.gis";
static final String MAPPER_LOCATION = "classpath:mybatis/mapper/gis/*.xml";
static final String CONFIG_LOCATION = "classpath:mybatis/mybatis-config.xml";
@Bean(name = "gydlgisDataSource")
@ConfigurationProperties(prefix = "spring.datasource.gydlgis")
public DataSource gydlgisDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "gydlgisJdbcTemplate")
public JdbcTemplate gydlgisJdbcTemplate(@Qualifier("gydlgisDataSource") javax.sql.DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
/*
* 配置事务管理器
*/
@Bean(name = "gydlgisTransactionManager")
public DataSourceTransactionManager gydlgisTransactionManager() {
return new DataSourceTransactionManager(gydlgisDataSource());
}
/*
* SqlSessionFactory配置
*/
@Bean(name = "gydlgisSqlSessionFactory")
public SqlSessionFactory gydlgisSqlSessionFactory(@Qualifier("gydlgisDataSource") DataSource gydlgisDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(gydlgisDataSource);
sessionFactory.setTypeAliasesPackage("com.lnsoft.visual.pojo");
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(CONFIG_LOCATION));
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
mybatis-config.xml文件配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="NULL"></setting>
<setting name="cacheEnabled" value="true"></setting>
<setting name="callSettersOnNulls" value="true"></setting>
<setting name="logImpl" value="STDOUT_LOGGING"></setting>
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
</typeAliases>
</configuration>
下面为项目结构图,结合上面的数据源代码中的一些参数配置理解作为参考:
下面关于application.properties中的配置参数图,和JAVA代码多数据源配置的注解@ConfigurationProperties有关作为参考
总结:
多数据源无非就是在JAVA代码中配置了不同的SqlSessionFactory 和不同的事务管理器 通过classpath绑定相关的访问数据库的接口,从而实现了在写业务代码无感知的去调不同的数据源。