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日

相关文章

  • SpringBoot整合Shiro和Redis的示例代码

    下面我将为你详细讲解“SpringBoot整合Shiro和Redis的示例代码”的具体过程,包含示例代码说明。 一、引入相关依赖 首先需要在 pom.xml 文件中引入相关依赖,包括 SpringBoot、Shiro 和 Redis 的依赖,示例代码如下: <dependencies> <!– SpringBoot 依赖 –> &…

    Java 2023年6月15日
    00
  • Java File类的简单使用教程(创建、删除、遍历与判断是否存在等)

    Java File类的简单使用教程 Java中的File类是用于操作文件和目录的类,可以进行文件和目录的创建、删除、遍历以及判断文件和目录是否存在等操作。下面我们将介绍如何使用File类进行这些操作。 创建文件 要创建一个文件,我们可以使用File类的构造函数,然后使用createNewFile()方法。示例代码如下: File file = new Fil…

    Java 2023年5月19日
    00
  • Java解码H264格式视频流中的图片

    针对“Java解码H264格式视频流中的图片”的需求,我整理了以下完整攻略: 确定准备工作 了解H.264编解码标准及相关概念(可以参考视频编解码入门知识); 熟悉Java开发语言以及常用的流处理库,如Netty、I/O等; 确定H.264格式视频流的来源和传输方式。 解码H.264视频流 接收H.264视频流; 使用H.264解码器库,例如h264lib、…

    Java 2023年5月20日
    00
  • Hibernate 的原理与配置

    Hibernate是一个面向对象的Java持久化框架,它的目的是简化数据访问,并提供更好的对象封装性和查询性能。本文将讲解Hibernate的原理与配置,包括Hibernate的核心概念、Hibernate工作流程、Hibernate配置文件以及示例代码。 Hibernate的核心概念 Session:Session代表与数据库的一个会话,它包含了一系列的操…

    Java 2023年5月20日
    00
  • 使用Docker搭建Java环境的步骤方法

    使用Docker搭建Java环境的步骤方法一般分为如下几步: 下载并安装Docker:首先需要在本地机器上下载并安装Docker,Docker提供了不同操作系统下的安装程序,可以根据自己的操作系统选择对应的安装方式。安装完毕后可以通过运行docker –version来查看Docker的版本号,以保证Docker能够正常工作。 拉取Java镜像:Docke…

    Java 2023年5月20日
    00
  • ExtJS GTGrid 简单用户管理

    ExtJS GTGrid 简单用户管理 概述 在本文中,将会详细讲解通过 ExtJS GTGrid 进行简单用户管理的完整攻略。用户管理是每个 Web 系统必备的功能之一,通过 ExtJS GTGrid 可以快速搭建一个用户管理模块,同时也能与后端数据进行交互。 本文将会通过以下几个方面逐步阐述: GTGrid 的基本使用方法 GTGrid 与后端数据的交互…

    Java 2023年6月15日
    00
  • Java 泛型详解与范例

    Java 泛型详解与范例 什么是Java泛型 泛型(Generics)是Java SE 1.5中引入的一种新特性,主要用来解决类型安全和类型转换的问题。泛型在编译时进行类型检查,提高了程序的健壮性和可读性,并且减少了代码的重复。 泛型的定义 泛型定义形式为<T>,其中T为类型参数。通过T来表示任意一种类型,所以可以使用T来代替具体的类型。在Jav…

    Java 2023年5月26日
    00
  • 浅谈jsp文件和HTML互相引入的乱码问题

    来讲解一下如何解决jsp文件和HTML互相引入的乱码问题。 1. 问题背景 在jsp文件中,我们经常需要嵌入html页面,即在jsp文件中引入html文件。但是在引入的过程中,经常会出现乱码的情况。 比如,在一个jsp文件中引入一个html文件: <%@ page contentType="text/html;charset=UTF-8&qu…

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