您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

SpringBoot配置多数据源

时间:2022-05-27 12:57:59  来源:今日头条  作者:啃饼思录

写在前面

本篇来学习SpringBoot如何配置多数据源,所谓多数据源就是一个JAVA EE项目中采用了不同数据库实例中的多个库,或者是同一个数据库实例中的多个不同库。一般来说,采用MyCat等分布式数据库中间件是比较好的解决方案,这样可以把数据库读写分离、分库分表、备份等操作交给中间件去做,这样Java代码只需要专注于业务即可。不过这并不意味着无法使用Java代码解决类似的问题,在Spring Famework中就可以配置多个数据源,SpringBoot作为其中的佼佼者,自然也同样支持多数据源的配置,只是配置方式有些变化而已。

下面就分别介绍使用Jdbc Template、MyBatis和SpringData JPA等不同持久层框架时的多数据源配置。

Jdbc Template多数据源

Jdbc Template多数据源配置是最简单的一个,因为一个Jdbc Template就对应一个DataSource,开发者只需要提供多个DataSource,再手动配置Jdbc Template即可。具体配置如下: 第一步,创建数据库。使用下面的SQL语句来手动创建两个数据库和表:

drop database if exists jdbcone;
create database jdbcone;
use jdbcone;
drop table if exists book;
create table book(
id int(11) not null auto_increment comment 'id',
name varchar(128) default null comment '名称',
author varchar(64) default null comment '作者',
primary key(id)
)ENGINE=INNODB default charset=utf8;
insert into book(id,name,author)values(1,"西游记","吴承恩");

drop database if exists jdbctwo;
create database jdbctwo;
use jdbctwo;
drop table if exists book;
create table book(
id int(11) not null auto_increment comment 'id',
name varchar(128) default null comment '名称',
author varchar(64) default null comment '作者',
primary key(id)
)ENGINE=INNODB default charset=utf8;
insert into book(id,name,author)values(1,"红楼梦","曹雪芹");

执行该SQL语句后,可以看出数据库中的信息如下所示:

SpringBoot配置多数据源

 

第二步,创建SpringBoot项目并添加依赖。使用spring Initializr构建工具构建一个SpringBoot的Web应用,名称为jdbcmorespringboot,然后在pom.xml文件中添加如下依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--添加jdbc依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--添加数据库驱动依赖-->
        <dependency>
            <groupId>MySQL</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--添加数据库连接池依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

请注意这里添加的数据库连接池依赖是druid-spring-boot-starter。druid-spring-boot-starter可以帮助开发者在SpringBoot项目中轻松集成Druid数据库连接池和监控。

第三步,配置数据库连接。Application.properties配置文件中配置多个数据源的信息:

# 数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/jdbcone?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.one.username=root
spring.datasource.one.password=1234
# 数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/jdbctwo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.two.username=root
spring.datasource.two.password=1234

这里配置了两个数据源,主要区别是数据库不同,其他都是一样的。 第四步,配置数据源。新建一个config包,并在里面创建一个DataSourceConfig类,用于配置数据源,这样就可以根据application.properties文件来生成对应的DataSource。里面的代码为:

@Configuration
public class DataSourceConfig {
    
    @Bean
    @ConfigurationProperties("spring.datasource.one")
    public DataSource dsOne(){
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.two")
    public DataSource dsTwo(){
        return DruidDataSourceBuilder.create().build();
    }
}

简单解释一下上述代码的含义:

  • 请注意DataSource是javax.sql.DataSource包内的;
  • DataSourceConfig类中提供了两个数据源:dsOne和dsTwo,默认的方法名就是实例名。
  • @ConfigurationProperties注解表示使用不同前缀的配置文件来创建不同的DataSource实例。

第五步,配置Jdbc Template。前面提到过,只要开发者引入了spring-jdbc依赖,那么若开发者没有提供Jdbc Template实例时,SpringBoot默认会提供一个Jdbc Template实例。但是现在是配置多数据源,因此这个Jdbc Template实例就需要开发者自己来提供了。在config包内新建一个JdbcTemplateConfig类,用于返回需要的Jdbc Template实例,相应的代码为:

@Configuration
public class JdbcTemplateConfig {

    @Bean
    public JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne")DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

    @Bean
    public JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo")DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }
}

简单解释一下上述代码的含义:

  • JdbcTemplateConfig类中提供了两个JdbcTemplate实例,每一个JdbcTemplate实例都需要提供DataSource,由于Spring容器中有两个DataSource实例,因此需要通过方法名来查找。@Qualifier注解表示查找不同名称的DataSource实例,并注入进来。

第六步,创建Book实体类和BookController类。新建pojo包,并在里面创建Book实体类,里面的代码为:

public class Book {
    private Integer id;
    private String name;
    private String author;
    //getter和setter方法
}

接着新建controller包,并在里面创建BookController类,里面的代码为:

@RestController
public class BookController {

    @Resource(name="jdbcTemplateOne")
    JdbcTemplate jdbcTemplateOne;

    @Autowired
    @Qualifier(value="jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;

    @GetMapping("/test")
    public void test(){
        String sql = "select * from book";
        List<Book> booksOne = jdbcTemplateOne.query(sql,new BeanPropertyRowMapper<>(Book.class));
        List<Book> booksTwo = jdbcTemplateTwo.query(sql,new BeanPropertyRowMapper<>(Book.class));
        System.out.println("booksOne>>>>>>"+booksOne);
        System.out.println("booksTwo>>>>>>"+booksTwo);
    }
}

简单解释一下上述代码的含义:

  • 注意这里没有定义Repository和Service层,而是直接将JdbcTemplate注入到了Controller中。在Controller中注入两个不同的JdbcTemplate有两种方式:第一种,使用@Resource注解,并指明name属性,然后按照name进行装配,此时会根据实例名查找相应的实例进行注入。第二种,使用@Autowried注解并结合@Qualifier注解,其实这种效果等同于使用@Resource注解。

第七步,运行项目。运行项目,在浏览器地址栏中输入http://localhost:8080/test,然后查看控制台的输出信息为:

booksOne>>>>>>[com.envy.jdbcmorespringboot.pojo.Book@166352ef]
booksTwo>>>>>>[com.envy.jdbcmorespringboot.pojo.Book@11ed31ef]

不方便查看,那就给Book实体类提供toString方法,之后再来运行一下:

booksOne>>>>>>[Book{id=1, name='西游记', author='吴承恩'}]
booksTwo>>>>>>[Book{id=1, name='红楼梦', author='曹雪芹'}]

对比一下数据库中的数据:

SpringBoot配置多数据源

 

可以看到数据已经成功取出来了,这表明JdbcTemplate配置多数据源成功。

Mybatis多数据源

JdbcTemplate可以配置多数据源,同样Mybatis也是可以的,只是步骤就稍微复杂一些。

第一步,创建数据库。使用下面的SQL语句来手动创建两个数据库和表:

drop database if exists mybatisone;
create database mybatisone;
use mybatisone;
drop table if exists book;
create table book(
id int(11) not null auto_increment comment 'id',
name varchar(128) default null comment '名称',
author varchar(64) default null comment '作者',
primary key(id)
)ENGINE=INNODB default charset=utf8;
insert into book(id,name,author)values(1,"西游记","吴承恩");

drop database if exists mybatistwo;
create database mybatistwo;
use mybatistwo;
drop table if exists book;
create table book(
id int(11) not null auto_increment comment 'id',
name varchar(128) default null comment '名称',
author varchar(64) default null comment '作者',
primary key(id)
)ENGINE=INNODB default charset=utf8;
insert into book(id,name,author)values(1,"红楼梦","曹雪芹");

执行该SQL语句后,可以看出数据库中的信息如下所示:

SpringBoot配置多数据源

 

第二步,创建SpringBoot项目并添加依赖。使用spring Initializr构建工具构建一个SpringBoot的Web应用,名称为mybatismorespringboot,然后在pom.xml文件中添加如下依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--添加mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--添加数据库驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--添加数据库连接池依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

请注意这里添加的数据库连接池依赖是druid-spring-boot-starter。druid-spring-boot-starter可以帮助开发者在SpringBoot项目中轻松集成Druid数据库连接池和监控。

第三步,配置数据库连接。在application.properties配置文件中配置多个数据源的信息:

# 数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/mybatisone?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.one.username=root
spring.datasource.one.password=1234
# 数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/mybatistwo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.two.username=root
spring.datasource.two.password=1234

这里配置了两个数据源,主要区别是数据库不同,其他都是一样的。

第四步,配置数据源。新建一个config包,并在里面创建一个DataSourceConfig类,用于配置数据源,这样就可以根据application.properties文件来生成对应的DataSource。里面的代码为:

@Configuration
public class DataSourceConfig {
    
    @Bean
    @ConfigurationProperties("spring.datasource.one")
    public DataSource dsOne(){
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.two")
    public DataSource dsTwo(){
        return DruidDataSourceBuilder.create().build();
    }
}

简单解释一下上述代码的含义:

  • 请注意DataSource是javax.sql.DataSource包内的;
  • DataSourceConfig类中提供了两个数据源:dsOne和dsTwo,默认的方法名就是实例名。
  • @ConfigurationProperties注解表示使用不同前缀的配置文件来创建不同的DataSource实例。

第五步,创建Mybatis配置。在Jdbc Template多数据源的配置中这一步就是用来返回Jdbc Template,但是Mybatis中这一步是用来提供SqlSessionFactory实例和SqlSessionTemplate实例。在config包内新建两个配置类:MybatisConfigOne和MybatisConfigTwo,分别用于返回对应数据源的SqlSessionFactory实例和SqlSessionTemplate实例。这里以MybatisConfigOne配置类中的代码为例进行解释说明:

@Configuration
@MapperScan(value = "com.envy.mybatismorespringboot.mapper1",sqlSessionFactoryRef = "sqlSessionFactoryBean1")
public class MybatisConfigOne {
    @Autowired
    @Qualifier("dsOne")
    DataSource dsOne;

    @Bean
    SqlSessionFactory sqlSessionFactoryBean1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dsOne);
        return factoryBean.getObject();
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBean1());
    }
}

@Configuration注解表明这个类是一个配置类,@MapperScan注解用于指名包的扫描路径,即mapper接口所在的位置。同时使用sqlSessionFactoryRef来指定该位置下的mapper将使用SqlSessionFactory实例。然后定义了一个sqlSessionFactoryBean1方法用于返回一个SqlSessionFactory对象,在这个方法中通过factoryBean.setDataSource方法将DataSource给注入进去,请注意这里创建的SqlSessionFactory实例,其实也就是@MapperScan注解中sqlSessionFactoryRef参数指定的实例。最后提供了一个sqlSessionTemplate1方法,该方法用于返回一个SqlSessionTemplate实例,这是一个线程安全类,主要用来管理Mybatis中的SqlSession操作。

MybatisConfigTwo中的代码与前面MybatisConfigOne中的差不多,这里仅仅附上代码,就不做多解释:

@Configuration
@MapperScan(value = "com.envy.mybatismorespringboot.mapper2",sqlSessionFactoryRef = "sqlSessionFactoryBean2")
public class MybatisConfigTwo {

    @Autowired
    @Qualifier("dsTwo")
    DataSource dsTwo;

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dsTwo);
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBean2());
    }
}

第六步,创建Book实体类。新建pojo包,并在里面创建Book实体类,里面的代码为:

public class Book {
    private Integer id;
    private String name;
    private String author;
    //getter、setter和toString方法
}

第七步,创建数据库访问层。新建两个mapper包:mapper1和mapper2,并在里面新建对应的mapper接口和xml文件。其中mapper1包内的BookMapper.java文件中的代码为:

@Component
@Mapper
public interface BookMapper {
    List<Book> getAllBooks();
}

mapper1包内的BookMapper.xml文件中的代码为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.envy.mybatismorespringboot.mapper1.BookMapper">
    <select id="getAllBooks" resultType="com.envy.mybatismorespringboot.pojo.Book">
        select * from book
    </select>
</mapper>

便于简化操作和演示,此处仅仅是配置了一个方法。mapper2包内的BookMapper2.java文件和BookMapper2.xml文件中的代码与上述非常相似,这里就不粘贴了,仅仅粘贴项目的目录结构:

SpringBoot配置多数据源

 

第八步,配置pom.xml文件,这一步很重要。在Maven工程中,XML配置文件建议写在resources目录下,但是很明显上述的BookMapper.xml文件写在了mapper包内,且不在resources目录下,此时运行项目肯定会抛出mapper文件找不到的异常,因为Maven运行时会忽略包内的xml文件,因此需要在pom.xml文件中重新指明资源文件的位置:

    <build>
        <!--使用mybatis时需要手动指明xml的位置-->
        <resources>
            <resource>
                <directory>src/mAIn/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
   </build>

第九步,创建Controller层。在controller包内新建BookController类,这里同样没有service层,因此是直接将Mapper注入到Controller中。里面的代码为:

@RestController
public class BookController {

    @Autowired
    BookMapper bookMapper;

    @Autowired
    BookMapper2 bookMapper2;

    @GetMapping("/test")
    public void test(){
        List<Book> bookList1 = bookMapper.getAllBooks();
        List<Book> bookList2 = bookMapper2.getAllBooks();
        System.out.println("【bookList1】>>>>>>"+bookList1);
        System.out.println("【bookList2】>>>>>>"+bookList2);
    }
}

第十步,运行项目。运行项目,在浏览器地址栏中输入http://localhost:8080/test,然后查看控制台的输出信息为:

【bookList1】>>>>>>[Book{id=1, name='西游记', author='吴承恩'}]
【bookList2】>>>>>>[Book{id=1, name='红楼梦', author='曹雪芹'}]

对比一下数据库中的数据:

SpringBoot配置多数据源

 

可以看到数据已经成功取出来了,这表明Mybatis配置多数据源成功。

Spring Data JPA多数据源

JPA和Mybatis配置多数据源非常类似,只是JPA配置时主要提供LocalContainerEntityManagerFactoryBean以及事务管理器,具体的配置如下:

第一步,创建数据库,不创建表。使用下面的SQL语句来手动创建两个数据库:

drop database if exists jpaone;
create database jpaone;

drop database if exists jpatwo;
create database jpatwo;

执行该SQL语句后,可以看出数据库中已经有这两个数据库了。

第二步,创建SpringBoot项目并添加依赖。使用spring Initializr构建工具构建一个SpringBoot的Web应用,名称为jpamorespringboot,然后在pom.xml文件中添加如下依赖:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--添加数据库驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--添加数据库连接池依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--添加Spring Data JPA依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
     <!--添加lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

请注意这里添加的数据库连接池依赖是druid-spring-boot-starter。druid-spring-boot-starter可以帮助开发者在SpringBoot项目中轻松集成Druid数据库连接池和监控。

第三步,配置数据库连接。在application.properties配置文件中配置多个数据源及JPA的配置信息:

# 数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/jpaone?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.one.username=root
spring.datasource.one.password=1234

# 数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/jpatwo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.two.username=root
spring.datasource.two.password=1234

# JPA相关配置
spring.jpa.properties.hibernate.dialect.MySQL57InnoDBDialect
spring.jpa.properties.database=mysql
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.show-sql=true

这里配置了两个数据源,主要区别是数据库不同,其他都是一样的。不过需要注意的是JPA多数据源配置与单独的JPA配置有所不同,因为后续的配置要从JpaProperties中的getProperties方法中获取所有JPA相关的配置,因此这里的属性前缀都是spring.jpa.properties。

第四步,配置数据源。新建一个config包,并在里面创建一个DataSourceConfig类,用于配置数据源,这样就可以根据application.properties文件来生成对应的DataSource。里面的代码为:

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.one")
    @Primary
    public DataSource dsOne(){
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.two")
    public DataSource dsTwo(){
        return DruidDataSourceBuilder.create().build();
    }
}

不知道你是否注意到,此处在dsOne方法上添加了@Primary注解。默认的@Autowired注解是依据类型进行注入,但是此处存在多个类型相同的对象,因此必须使用@Primary注解来指定优先注入哪个。

第五步,创建Book实体类。新建pojo包,并在里面创建Book实体类,里面的代码为:

@Entity(name = "t_user")
@Data
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
    
    private String gender;
    
    private Integer age;
}

这样后续会根据实体类在数据库中创建t_user表,表中的id字段自增长。

第六步,创建JPA配置。接下来是核心配置,根据两个配置好的数据源来创建两个不同的JPA配置。在config包内,新建两个JPA的配置类:JpaOneConfig和JpaTwoConfig,用于返回LocalContainerEntityManagerFactoryBean及事务管理器对象。下面以JpaOneConfig配置类中的代码为例进行解释说明:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.envy.jpamorespringboot.dao1",entityManagerFactoryRef = "entityManagerFactoryBeanOne",transactionManagerRef = "platformTransactionManagerOne")
public class JpaOneConfig {

    @Resource(name = "dsOne")
    DataSource dsOne;

    @Autowired
    JpaProperties jpaProperties;

    @Bean
    @Primary
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanOne(EntityManagerFactoryBuilder builder){
        return builder.dataSource(dsOne)
                .properties(jpaProperties.getProperties())
                .packages("com.envy.jpamorespringboot.pojo")
                .persistenceUnit("pu1")
                .build();
    }
    
    @Bean
    PlatformTransactionManager platformTransactionManagerOne(EntityManagerFactoryBuilder builder){
        LocalContainerEntityManagerFactoryBean factoryOne = entityManagerFactoryBeanOne(builder);
        return new JpaTransactionManager(factoryOne.getObject());
    }
}

解释一下上述代码的含义:

  • 使用@Configuration注解来标识这是一个配置类,接着使用@EnableJpaRepositories注解来进行JPA的配置,该注解中主要配置三个属性:basePackages、entityManagerFactoryRef和transactionManagerRef。其中basePackages属性用于指定Repository的所在位置,entityManagerFactoryRef属性用于指定实体类管理工厂Bean的名称,transactionManagerRef属性则用来指定事务管理器的引用名称,这里的引用名称就是JpaOneConfig类中注册的Bean的名称(默认的Bean名称为方法名)。
  • 然后创建entityManagerFactoryBeanOne方法,用于生成一个LocalContainerEntityManagerFactoryBean对象,而该对象用来提供EntityManager实例,在该类的创建过程中,首先配置数据源,然后设置JPA相关配置(JpaProperties由系统自动加载),再设置实体类所在的位置,最后配置持久化单元名,若项目中只有一个EntityManagerFactory,则persistenceUnit可以省略掉,若有多个,则必须明确指定持久化单元名。
  • 由于项目中会提供两个LocalContainerEntityManagerFactoryBean实例,故需要在entityManagerFactoryBeanOne方法上添加@Primary注释,用于告诉Spring容器时优先使用该实例。
  • platformTransactionManagerOne方法用于返回一个PlatformTransactionManager对象,实际上返回的是一个JpaTransactionManager对象,它提供对单个EntityManagerFactory的事务支持,专门用于解决JPA中的事务管理。

上面是第一个JPA的配置信息,第二个JPA的配置与之相似,故这里仅仅只粘贴代码(需要注意的是第二个JPA类中的entityManagerFactoryBeanOne方法上不能添加@Primary注解):

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.envy.jpamorespringboot.dao2",entityManagerFactoryRef = "entityManagerFactoryBeanTwo",transactionManagerRef = "platformTransactionManagerTwo")
public class JpaTwoConfig {

    @Resource(name = "dsTwo")
    DataSource dsTwo;

    @Autowired
    JpaProperties jpaProperties;

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanTwo(EntityManagerFactoryBuilder builder){
        return builder.dataSource(dsTwo)
                .properties(jpaProperties.getProperties())
                .packages("com.envy.jpamorespringboot.pojo")
                .persistenceUnit("pu2")
                .build();
    }

    @Bean
    PlatformTransactionManager platformTransactionManagerTwo(EntityManagerFactoryBuilder builder){
        LocalContainerEntityManagerFactoryBean factoryOne = entityManagerFactoryBeanTwo(builder);
        return new JpaTransactionManager(factoryOne.getObject());
    }
}

第七步,创建Repository。新建dao1和dao2包,并分别在其中新建UserDao和UserDao2接口文件。其中UserDao.java中的代码为:

package com.envy.jpamorespringboot.dao1;

import com.envy.jpamorespringboot.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserDao extends JpaRepository<User,Integer> {
}

其中UserDao2.java中的代码为:

package com.envy.jpamorespringboot.dao2;

import com.envy.jpamorespringboot.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserDao2 extends JpaRepository<User,Integer> {
}

其中UserDao和UserDao2分别用于操作不同的数据源。这里粘贴一下此时的目录结构:

SpringBoot配置多数据源

 

第八步,创建Controller。便于演示和简便,这里就省略Service层,将UserDao直接注入Controller层。新建controller包,并在里面新建UserController.java文件,里面的代码为:

@RestController
public class UserController {

    @Autowired
    private UserDao userDao;

    @Autowired
    private UserDao2 userDao2;

    @GetMapping("/test")
    public void test(){
        User user1 = new User();
        user1.setName("小明");
        user1.setAge(20);
        user1.setGender("男");
        userDao.save(user1);

        User user2 = new User();
        user2.setName("小美");
        user2.setAge(18);
        user2.setGender("女");
        userDao2.save(user2);
    }
}

第九步,运行项目。运行项目,在浏览器地址栏中输入http://localhost:8080/test,然后查看数据库是否已经有了这两条记录:

SpringBoot配置多数据源

 

总结

本篇学习了如何在SpringBoot中整合Jdbc Template、Mybatis和Spring Data JPA的多数据源配置,其中Jdbc Template用的不是很多,基本上不会使用了;而Mybatis由于其灵活性较好,能进行SQL优化,因此如果开发者需要考虑SQL的性能,建议选用这个。Spring Data JPA使用起来较为方便,几乎不需要书写SQL语句,特别适合快速开发一个RESTful风格的应用,这一点在实际工作中深有体会。



Tags:SpringBoot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: SpringBoot  点击:(23)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: SpringBoot  点击:(91)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: SpringBoot  点击:(94)  评论:(0)  加入收藏
公司用了六年的 SpringBoot 项目部署方案,稳得一批!
本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作。 profiles指定不同环境的配置 maven-assembly-plugin打发布压...【详细内容】
2024-01-10  Search: SpringBoot  点击:(185)  评论:(0)  加入收藏
简易版的SpringBoot是如何实现的!!!
SpringBoot作为目前最流行的框架之一,同时是每个程序员必须掌握的知识,其提供了丰富的功能模块和开箱即用的特性,极大地提高了开发效率和降低了学习成本,使得开发人员能够更专注...【详细内容】
2023-12-29  Search: SpringBoot  点击:(144)  评论:(0)  加入收藏
用 SpringBoot+Redis 解决海量重复提交问题
前言 一:搭建redis的服务Api 二:自定义注解AutoIdempotent 三:token创建和检验 四:拦截器的配置 五:测试用例 六:总结前言:在实际的开发项目中,一个对外暴露的接口往往会面临很多...【详细内容】
2023-12-20  Search: SpringBoot  点击:(56)  评论:(0)  加入收藏
SpringBoot中如何优雅地个性化定制Jackson
当使用 JSON 格式时,Spring Boot 将使用ObjectMapper实例来序列化响应和反序列化请求。在本教程中,我们将了解配置序列化和反序列化选项的最常用方法。一、默认配置默认情况下...【详细内容】
2023-12-20  Search: SpringBoot  点击:(139)  评论:(0)  加入收藏
springboot-如何集成Validation进行参数校验
一、步骤概览 二、步骤说明1.引入依赖包在 pom.xml 文件中引入 validation 组件,它提供了在 Spring Boot 应用程序中进行参数校验的支持。<!-- WEB 程序依赖包 --><dependen...【详细内容】
2023-12-13  Search: SpringBoot  点击:(159)  评论:(0)  加入收藏
优雅的springboot参数校验,你学会了吗?
前言在后端的接口开发过程,实际上每一个接口都或多或少有不同规则的参数校验,有一些是基础校验,如非空校验、长度校验、大小校验、格式校验;也有一些校验是业务校验,如学号不能重...【详细内容】
2023-11-29  Search: SpringBoot  点击:(200)  评论:(0)  加入收藏
Springboot扩展点之BeanDefinitionRegistryPostProcessor,你学会了吗?
前言通过这篇文章来大家分享一下,另外一个Springboot的扩展点BeanDefinitionRegistryPostProcessor,一般称这类扩展点为容器级后置处理器,另外一类是Bean级的后置处理器;容器级...【详细内容】
2023-11-27  Search: SpringBoot  点击:(180)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(7)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(11)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(23)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(62)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(52)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(43)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(58)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(72)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(95)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(91)  评论:(0)  加入收藏
站内最新
站内热门
站内头条