项目中使用多个数据源在以往工作中比较常见,可以使用SpringDataJPA构建简单的查询,mybits做一些复杂的操作。
1.多数据源yml配置:
2.config配置
1.基础的配置,这个实际上可以写到对应后续各个源里面,看个人喜好。(注意:作为第一数据源有@Primary)
package
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 javax.sql.DataSource;
/**
* 数据源的配置
*/
@Configuration
public class DataSourceConfig {
//第一数据源 -- jpa
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
@Primary
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
//还是第一数据源(既可使用jpa又可以使用mybatis) -- mybatis
@Bean(name = "nowDataSource")
@Qualifier("nowDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource nowDataSource() {
return DataSourceBuilder.create().build();
}
//第二数据源 -- mybatis
@Bean(name = "ourDataSource")
@Qualifier("ourDataSource")
@ConfigurationProperties(prefix = "spring.datasourceour")
public DataSource ourDataSource() {
return DataSourceBuilder.create().build();
}
//第三数据源 -- mybatis
@Bean(name = "brmDataSource")
@Qualifier("brmDataSource")
@ConfigurationProperties(prefix = "spring.datasourcebrm")
public DataSource brmDataSource() {
return DataSourceBuilder.create().build();
}
}
2.jpa的配置 (注意:作为第一数据源有@Primary)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
/**
* jpa数据源一
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {
"com.XXXX"
}) //设置dao所在位置
public class PrimaryConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource)
.properties(getVendorProperties())
.packages(
"com.xxx"
) //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}
@Autowired
private JpaProperties jpaProperties;
private Map<String, Object> getVendorProperties() {
//不同spingboot版本写法不一
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
3.mybatis源配置
package
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.xxxx", sqlSessionFactoryRef = "ourSqlSessionFactory")
public class DataSourceConfigOur {
@Bean(name = "ourSqlSessionFactory")
// @Qualifier表示查找Spring容器中名字为ourSqlSessionFactory的对象
public SqlSessionFactory ourSqlSessionFactory(@Qualifier("ourDataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath*:/ourmapper/*.xml"));
return bean.getObject();
}
@Bean("ourSqlSessionTemplate")
public SqlSessionTemplate oursqlsessiontemplate(
@Qualifier("ourSqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
3.mapper写法与使用
1.与正常mybits写法一致。
2.对应的xml配置
4.jpa的dao写法
1.基础接口
2.对应的dao
5.部署遇见问题
本地运行未遇见问题。但是部署到服务器有遇见包多数据源冲突问题,我之前mapper文件都是建立在dao层下,如dao.xxxmapper,而jpa的目录是.dao导致的,将xxxmapper移到dao层外,部署成功。