多数据源配置

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 &gt;= #{startDate}
  </if>
  <if test="endDate != null and endDate != ‘‘">
    and stat_date  &lt;= #{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接口自带的查询方法




















































以上是关于多数据源配置的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

代码片段:Shell脚本实现重复执行和多进程

Huawei_Netconf_Ncclient

方向/配置更改后如何维护 ListView 片段状态?

VS Code配置markdown代码片段