springboot连接不同数据库的写法详解

下面是“Spring Boot连接不同数据库的写法详解”的完整攻略。

1. 引入对应的数据库依赖

在使用Spring Boot连接不同的数据库时,需要根据使用的数据库引入对应的依赖。

  • MySQL

    xml
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>

  • PostgreSQL

    xml
    <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    </dependency>

2. 配置数据源

在Spring Boot中,可以使用application.properties或application.yml文件来配置数据源。

  • application.properties配置MySQL数据源

    properties
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

  • application.yml配置PostgreSQL数据源

    yaml
    spring:
    datasource:
    url: jdbc:postgresql://localhost:5432/test
    username: postgres
    password: postgres
    driver-class-name: org.postgresql.Driver

3. 多数据源的配置

Spring Boot支持多数据源的配置,下面分别介绍两种不同的多数据源方式。

3.1 注解方式

使用注解方式可以在启动类上加上@MapperScan@EnableTransactionManagement注解,其中@MapperScan注解的basePackages属性指定Mapper文件所在的包,@EnableTransactionManagement注解开启事务。

@SpringBootApplication
@MapperScan(basePackages = "com.example.demo.dao.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
@EnableTransactionManagement
public class MultiDataSourcesApplication {
    //...
}

在MySQL和PostgreSQL的数据源配置类上加上@Configuration@MapperScan注解,并指定不同的@Bean名称和Mapper文件所在的包,同时使用@Qualifier注解指定对应的数据源名称。

@Configuration
@MapperScan(basePackages = "com.example.demo.dao.postgresql", sqlSessionTemplateRef = "postgresqlSqlSessionTemplate")
public class PostgreSQLDataSourceConfig {

    @Bean(name = "postgresqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.postgresql")
    public DataSource postgresqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "postgresqlSqlSessionFactory")
    public SqlSessionFactory postgresqlSqlSessionFactory(@Qualifier("postgresqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "postgresqlTransactionManager")
    public DataSourceTransactionManager postgresqlTransactionManager(@Qualifier("postgresqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "postgresqlSqlSessionTemplate")
    public SqlSessionTemplate postgresqlSqlSessionTemplate(@Qualifier("postgresqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
@Configuration
@MapperScan(basePackages = "com.example.demo.dao.mysql", sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class MySQLDataSourceConfig {

    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean.getObject();
    }

    @Bean(name = "mysqlTransactionManager")
    public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mysqlSqlSessionTemplate")
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3.2 配置多个数据源

使用配置多个数据源的方式可以在application.properties或application.yml中配置多个数据源。

spring:
  datasource:
    mysql:
      url: jdbc:mysql://localhost:3306/test
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    postgresql:
      url: jdbc:postgresql://localhost:5432/test
      username: postgres
      password: postgres
      driver-class-name: org.postgresql.Driver

需要在每个数据源相关的类上加上@ConfigurationProperties注解,并指定前缀为对应的数据源名称。

@Configuration
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public class MySQLDataSourceConfig {

    private String url;

    private String username;

    private String password;

    private String driverClassName;

    @Bean(name = "mysqlDataSource")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().url(url).username(username).password(password).driverClassName(driverClassName).build();
    }

    //...
}

4. 示例

下面提供两个示例,一个是使用注解方式,一个是使用配置方式。

4.1 使用注解方式

  • MySQL

    java
    @Repository
    public interface UserDao {
    @Insert("insert into user(name, age) values(#{name}, #{age})")
    void addUser(@Param("name") String name, @Param("age") Integer age);
    }

  • PostgreSQL

    java
    @Repository
    public interface UserLogDao {
    @Insert("insert into user_log(user_id, content) values(#{userId}, #{content})")
    void addUserLog(@Param("userId") Integer userId, @Param("content") String content);
    }

在ServiceImpl类中注入对应的Mapper即可。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private UserLogDao userLogDao;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void addUserAndLog(String userName, Integer age, String content) {
        userDao.addUser(userName, age);
        userLogDao.addUserLog(1, content);
        throw new RuntimeException(); //模拟异常
    }
}

4.2 使用配置方式

  • MySQL

    java
    @Repository
    public interface UserDao {
    @Insert("insert into user(name, age) values(#{name}, #{age})")
    void addUser(@Param("name") String name, @Param("age") Integer age);
    }

  • PostgreSQL

    java
    @Repository
    public interface UserLogDao {
    @Insert("insert into user_log(user_id, content) values(#{userId}, #{content})")
    void addUserLog(@Param("userId") Integer userId, @Param("content") String content);
    }

使用@Qualifier注解指定对应的Mapper。

@Service
public class UserServiceImpl implements UserService {

    @Qualifier("mysqlSqlSessionTemplate")
    @Autowired
    private SqlSessionTemplate mysqlSqlSessionTemplate;

    @Qualifier("postgresqlSqlSessionTemplate")
    @Autowired
    private SqlSessionTemplate postgresqlSqlSessionTemplate;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void addUserAndLog(String userName, Integer age, String content) {
        UserDao userDao = mysqlSqlSessionTemplate.getMapper(UserDao.class);
        UserLogDao userLogDao = postgresqlSqlSessionTemplate.getMapper(UserLogDao.class);

        userDao.addUser(userName, age);
        userLogDao.addUserLog(1, content);
        throw new RuntimeException(); //模拟异常
    }
}

以上就是“Spring Boot连接不同数据库的写法详解”的攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot连接不同数据库的写法详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Security 在 Spring Boot 中的使用详解【集中式】

    下面是对于 “Spring Security 在 Spring Boot 中的使用详解【集中式】” 的完整攻略。 一、什么是 Spring Security Spring Security 是 Spring 生态圈中基于安全框架的一款开源工具。它能够帮助我们实现应用程序的安全控制,保证我们的应用程序在面临安全威胁时能够做出正确的响应。 二、Spring Se…

    Java 2023年5月20日
    00
  • java中Hibernate面试知识点整理

    Java中Hibernate面试知识点整理 什么是Hibernate? Hibernate是一个基于Java语言的ORM(对象关系映射)框架,简单来说就是将Java对象和数据库表进行映射,使得开发人员可以将精力放在业务逻辑的开发上,而不用去关注数据库相关的细节。 Hibernate的主要特点 简化了数据持久化的开发工作 数据库无关性,可以支持多种主流数据库 …

    Java 2023年5月20日
    00
  • Java 8 Time Api 使用方法技巧

    Java 8 Time API 使用方法技巧 介绍 Java 8 引入了全新的日期和时间 API,称为 Java 8 Time API,它位于 java.time 包下。相较于旧版的 Java 时间 API(java.util.Date 和 java.util.Calendar),Java 8 Time API 显得更加真正的面向对象,功能性也更强。 Jav…

    Java 2023年5月20日
    00
  • 这一次搞懂SpringMVC原理说明

    一、 SpringMVC 原理 SpringMVC 是 Spring 框架中的一个模块,是用来实现基于 Java 技术的 Web 应用程序开发的。下面介绍 SpringMVC 的原理。 请求 dispatcherServlet 当用户请求一个页面时,dispatcherServlet 是 SpringMVC 的入口点。dispatcherServlet 是一…

    Java 2023年5月19日
    00
  • 基于使用递归推算指定位数的斐波那契数列值的解决方法

    对于求解指定位数的斐波那契数列值,可以使用递归的方式进行推算。具体步骤如下: 步骤一:确定递归函数的参数和返回值 斐波那契数列的递推公式为:F(n) = F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。因此,当需要求解第n个斐波那契数列值时,可以将递归函数fib定义为接受一个整数n作为参数,返回一个整数作为结果。 def fib(n:…

    Java 2023年5月26日
    00
  • Mybatis 查询语句条件为枚举类型时报错的解决

    针对问题“Mybatis 查询语句条件为枚举类型时报错”的解决,可以采取以下步骤: 1. 确认报错信息 在解决问题之前,需要先确认报错信息。针对“Mybatis 查询语句条件为枚举类型时报错”的情况,通常表现为: org.apache.ibatis.exceptions.PersistenceException: ### Error querying dat…

    Java 2023年5月20日
    00
  • Java 类型相互转换byte[]类型,Blob类型详细介绍

    针对Java类型相互转换byte[]类型、Blob类型的问题,以下是一个完整的攻略说明。 一、基础概念 Java中的Blob类型指的是二进制大对象(Binary Large Object),通常用于保存大型数据,如图片、音频等。在数据库中一般以byte[]类型存储。 在Java中,byte[]是字节数组类型,表示由多个字节构成的数组。可以将Blob类型转换为…

    Java 2023年5月20日
    00
  • Springboot项目快速实现Aop功能

    下面是关于“Springboot项目快速实现Aop功能”的完整攻略,希望对你有帮助。 什么是AOP AOP,全称为Aspect Oriented Programming,即面向切面编程。它是一种基于OOP的扩展,旨在通过预编译方式和运行期动态代理实现程序的透明化、模块化、松耦合等功能。通俗的理解就是,把一些常用功能提取出来,不用在每个业务场景都写一遍,比如日…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部