多数据源配置
Posted financial
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多数据源配置相关的知识,希望对你有一定的参考价值。
多数据源配置
实现同一个项目以不同的方式链接使用多个数据库,如果只使用一个数据源,很多配置都可以省略,因为spring boot构架会有一些默认的配置可以直接使用,但是想要使用多个数据源时,就需要更多的配置来加以区分来告诉spring boot应该使用哪个数据源,事务管理、session管理等对应的是哪个数据源
1、pom.xml配置文件
在dependencies标签对中增加两个dependency标签对配置数据库的依赖包,
支持jdbc、Hibernate数据库链接
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
支持mybatis数据库链接
还需要增加两个dependency标签对配置
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
2、application.properties配置文件
profiles配置
如果使用profiles配置,可启用不同环境的配置文件,如:开发环境,测试环境,生产环境
假如现在处于开发阶段,那么在application.properties配置文件中增加
#环境配置
spring.profiles.active=dev
不同环境的配置文件命名示例:
以上配置表明,目前生效的配置文件是application.properties和application-dev.properties两个文件
数据库链接参数配置
数据库参数配置(jdbc、Hibernate、mybatis,三种方式的配置都是一样的
只是定义的名称要有所区分如dataSource1,dataSource2……,该名称会在Java配置文件定义其他bean时被引用)
dataSource1.datasource.driverClassName=com.mysql.jdbc.Driver
dataSource1.datasource.jdbc-url=jdbc:mysql://域名:端口号/数据库名?useUnicode=true&useSSL=false
dataSource1.datasource.username=数据库用户名
dataSource1.datasource.password=数据库密码
3、Java配置文件
选择使用Java配置文件来配置,主要是因为项目代码是使用java语言开发,使用Java配置文件更容易理解
这一步主要的作用是定义各种bean时,定义不同的bean名称,并且在需要传入数据库的方法中,在与第2步数据库链接参数配置的名称一一对应
Jdbc
注解
@Configuration
什么是Java配置文件,就是创建的java类,增加了@Configuration注解,这样spring boot框架扫描bean的时候,才会把这样的Java类文件当作是配置文件,然后是在类里面可以随意的手动增加一些bean
dataSource
DataSource(jdbc、Hibernate、mybatis,三种方式的DataSource配置都是一样的
只是定义的名称要有所区分,可以与第2步数据库链接参数配置的名称,如dataSource1,dataSource2……)
@Bean(name = "dataSource1")//因为是多数据源,所以需要取别名
@Qualifier("dataSource1")
@ConfigurationProperties(prefix = " dataSource1.datasource")//第2步数据库链接参数配置的名称
public DataSource dataSource1 (){//定义数据源bean
return DataSourceBuilder.create().build();
}
Template
这一步关键的生成一个重新命名并配置好数据源的JdbcTemplate
a、 重新命名:在方法前面增加@Bean
@Bean(name = "jdbcTemplate")
b、 定义该方法时要传入带了别名的数据源为参数
public JdbcTemplate jdbcTemplate(@Qualifier("dataSource1") DataSource dataSource)
c、 生成的JdbcTemplate并把数据源set进来,然后返回JdbcTemplate
return new JdbcTemplate(dataSource);
使用
直接使用
引入JdbcTemplate就可以调用Template里封装的查询方法了,按封装方法的要求传入参数就可以了
@Autowired
private
JdbcTemplate
jdbcTemplate;
JdbcTemplate自带查询抽象方法如下:
public <T> List<T> query(String sql, @Nullable Object[] args, RowMapper<T> rowMapper)
实际调用如下:
事先写好String类型的sql,和要输入的参数列表params,以及返回结果列表集
BeanPropertyRowMapper是RowMapper的实现类
List<mapper> list = jdbcTemplate.query(sql, params.toArray(), new BeanPropertyRowMapper<>( mapper.class));
b、封装成通用工具
当然了,如果调用JdbcTemplate的抽象方法之前想多做一些事情,比如打印日志,参数转换等,可以按自己的想法,再封装多一个通用工具
另创建一个类当作通用工具类,引入JdbcTemplate再调用JdbcTemplate里封装的查询方法
@SuppressWarnings("unchecked")
public <T> List<T> querySpaDataList(String sql, Object[] params, Class<T> clazz) {
printSqlToConsole(sql, params);
return jdbcTemplate.query(sql, params, new BeanPropertyRowMapper<T>(clazz));
}
以上封装的方法增加了查询语句打印,结果类的参数的做了转换,在调用时第三个参数可直接传结果类class
实际调用如下:
List<mapper> list = jdbcTemplate.query(sql, params.toArray(),mapper.class);
mybatis
注解
@Configuration:同JDBC
@ MapperScan:在配置类上增加实体类扫描注解
@MapperScan(basePackages = {"com.myboot.mapper"}, sqlSessionTemplateRef = "sqlSessionTemplate")
basePackages:数据表映射接口所在路径
sqlSessionTemplateRef:SqlSessionTemplate的bean名称(要与后面讲到的SqlSessionTemplate配置的名称一致)
dataSource
同jdbc,但名称要有所区分,
@Bean(name = " dataSource2")
SqlSessionFactory
这一步关键的生成一个配置好数据源和XML文件路径的SqlSessionFactory
a、 重新命名:在方法前面增加@Bean
@Bean(name = "sqlSessionFactory")
b、 定义该方法时要传入带了别名的数据源为参数
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception
c、 在方法内生成一个默认的SqlSessionFactory,并把数据源set进来
SqlSessionFactoryBean
bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
d、 添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.getResources("classpath:mappings/*.xml"));
e、 记得关键语句要捕抓异常,不然intellij IDEA会给你一个错误提示
SqlSessionTemplate
这一步关键的生成一个配置好SqlSessionFactory的SqlSessionTemplate
a、 重新命名:在方法前面增加@Bean
@Bean(name = "sqlSessionTemplate")
b、 定义该方法时要传入带了别名的SqlSessionFactory为参数(要与上一步SqlSessionFactory配置的名称一致)
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception
c、 在方法内生成一个默认的SqlSessionTemplate,并把SqlSessionFactory set进来
然后返回这个template
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
DataSourceTransactionManager
如果你对数据源的操作只有查询,没有增加、删除、修改的操作,那这一步可以不需要
这一步的配置与SqlSessionFactory的配置也有相同之处,那就是生成一个配置好数据源DataSourceTransactionManager
a、 重新命名:在方法前面增加@Bean
@Bean(name = "transactionManager")
b、 定义该方法时要传入带了别名的数据源为参数
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource2") DataSource dataSource) throws Exception
c、 在方法内生成一个默认的DataSourceTransactionManager,并把数据源set进来
并返回DataSourceTransactionManager
return new DataSourceTransactionManager(dataSource);
使用
本项目中每一个数据表对应一个xml文件,每一个xml文件对应一个数据表映射接口,xml文件和对应的接口分别放到两个不同的目录下
xml文件:"classpath:mappings/*.xml"
接口:"com.myboot.mapper"
使用时引入接口,通过接口调用xml里的sql语句执行数据库操作
a、 xml文件中必须定义所对应的数据表映射接口的全路径
<mapper namespace="com.myboot.mapper.Table1Mapper " >
如定义一个查询方法(resultMap=" Table1",这个要在xml中先定义一个名为Table1的resultMap)
<select id="selectByDate" resultMap=" Table1" parameterType="java.util.HashMap">
SELECT *
FROM ` Table1`
WHERE 1=1
<if test="startDate
!= null and startDate != ‘‘">
and stat_date >= #{startDate}
</if>
<if test="endDate
!= null and endDate != ‘‘">
and stat_date <= #{endDate}
</if>
ORDER BY stat_date DESC
</select>
b、 定义接口
注解:数据访问Dao注解
@Mapper
@Repository("Table1Mapper ")
Xml的接口(要先写一个Table1Stat,Table1的实体类)
List< Table1Stat> selectByDate(@Param("startDate")
String startDate,
@Param("endDate") String endDate);
c、 调用接口
引入接口
@Autowired
private Table1Mapper table1Mapper;
通过table1Mapper调用
table1Mapper.selectByDate(startDate, endDate);
hibernate
注解
@Configuration:同JDBC
@EnableTransactionManagement,事务管理
@ EnableJpaRepositories:在配置类上增加实体类扫描注解
@EnableJpaRepositories(entityManagerFactoryRef = "girlEntityManagerFactory", transactionManagerRef = "girlTransactionManager", basePackages = "com.myboot.repository")
basePackages:数据表映射接口所在路径
entityManagerFactoryRef:entityManagerFactory的bean名称(要与后面讲到的LocalContainerEntityManagerFactoryBean配置的名称一致)
transactionManagerRef:事务管理的bean名称(要与后面讲到的PlatformTransactionManager配置的名称一致)
dataSource
同jdbc,但名称要有所区分,
@Bean(name = " dataSource3")
LocalContainerEntityManagerFactoryBean
这一步关键通过EntityManagerFactoryBuilder生成一个配置好数据源、实体类等属性的EntityManagerFactory
a、 重新命名:在方法前面增加@Bean
@Bean(name = "girlEntityManagerFactory")
b、 定义该方法时要传入带了别名的数据源和EntityManagerFactoryBuilder为参数
public LocalContainerEntityManagerFactoryBean girlEntityManagerFactory (@Qualifier("dataSource3") DataSource dataSource,EntityManagerFactoryBuilder builder)
c、 在方法内通过EntityManagerFactoryBuilder 把属性set进来
然后返回这个LocalContainerEntityManagerFactoryBean
return builder
.dataSource(dataSource)
.properties(getVendorProperties())
.packages("com.myboot.entity")
.persistenceUnit("primaryPersistenceUnit")
.build();
getVendorProperties()这个方法要先定义好
@Autowired
private JpaProperties jpaProperties;
private Map<String, Object>
getVendorProperties() {
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
PlatformTransactionManager
如果你对数据源的操作只有查询,没有增加、删除、修改的操作,那这一步可以不需要
这一步的配置与SqlSessionFactory的配置也有相同之处,那就是生成一个配置好数据源DataSourceTransactionManager
a、 重新命名:在方法前面增加@Bean
@Bean(name = "girlTransactionManager")
b、 定义该方法时要传入带了别名的数据源为参数
public PlatformTransactionManager girlTransactionManager(@Qualifier("dataSource3")DataSource dataSource, EntityManagerFactoryBuilder builder)
c、 在方法内生成一个默认的DataSourceTransactionManager,并把数据源set进来
并返回TransactionManager
return new JpaTransactionManager(girlEntityManagerFactory(dataSource, builder).getObject());
使用
本项目中每一个数据表对应一个实体类,每一个实体类对应一个数据表映射接口,实体类和对应的接口分别放到两个不同的目录下
实体类:"com.myboot.entity"
接口:"com.myboot.repository"
使用时引入接口,通过接口调用xml里的sql语句执行数据库操作
a、 实体类中必须定义所对应的数据表,并增加实体类注解@Entity
@Entity
@Table(name = "girl")
b、 定义接口(其中Girl就是实体类,JpaRepository是spring boot框架提供的数据库访问接口)
public interface GirlDao extends JpaRepository<Girl, Integer>
c、 数据库执行接口
@Query("select g from Girl g where g.createTime >= startDate and g.createTime < endDate ")
List< Girl > selectByDate(String startDate, String endDate);
d、 调用接口
引入接口
@Autowired
GirlDao girlDao;
通过girlDao调用
girlDao.selectByDate(startDate, endDate);
girlDao.findAll();//JpaRepository接口自带的查询方法
以上是关于多数据源配置的主要内容,如果未能解决你的问题,请参考以下文章