在SpringBoot中如何整合数据源?

2023-06-28 13:30:00

在企业级应用开发中,数据存储是必不可少的一环。为了简化数据访问层的开发,SpringBoot提供了对多种数据源的整合支持。本文将介绍如何在SpringBoot项目中整合常见的数据源,包括JdbcTemplate、MyBatis和JPA,并探讨如何配置和使用多数据源。

1. 数据源的选择与配置

1.1. 常见的数据源类型

在Java开发中,常见的数据源类型有以下几种:

  1. JDBC:Java数据库连接,是Java访问数据库的标准API。使用JDBC可以直接操作数据库,但需要编写大量的SQL语句和处理结果集,开发效率较低。

  2. JdbcTemplate:基于JDBC的一个封装库,简化了JDBC的使用,提高了开发效率。

  3. MyBatis:一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。

  4. JPA:Java持久化API,是一种ORM(对象关系映射)规范,实现了对象模型和关系型数据库之间的映射。Hibernate是JPA的一种实现。

1.2. 数据源配置文件的编写

在SpringBoot项目中,我们通常在application.propertiesapplication.yml文件中配置数据源。以下是一个典型的数据源配置示例:

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

其中,url指定了数据库的连接地址,usernamepassword分别表示数据库的用户名和密码,driver-class-name是数据库驱动类的全限定名。

1.3. SpringBoot自动配置数据源的原理

在SpringBoot中,数据源的配置得到了极大的简化,这得益于其自动配置的特性。一旦我们在项目中添加了相应的依赖并正确配置了数据源信息,SpringBoot便会自动创建一个DataSource对象,并将其注册到Spring容器中,从而实现了数据源的自动化管理。

具体而言,SpringBoot会根据项目中的依赖来智能选择合适的数据源实现。例如,如果项目中引入了HikariCP、Tomcat连接池或者C3P0等依赖,SpringBoot会自动选择并使用这些数据源实现。而在没有引入这些依赖的情况下,SpringBoot则会采用默认的数据源实现。

通过这种方式,SpringBoot为我们提供了一种简洁、高效的数据源配置方法,使得我们能够更专注于业务逻辑的实现,而无需过多关注底层的数据源配置细节。

2. SpringBoot整合JdbcTemplate

2.1. JdbcTemplate的简介与作用

JdbcTemplate是Spring框架中提供的一个简化JDBC操作的工具类,它可以帮助我们避免编写大量的重复代码,提高开发效率。JdbcTemplate主要提供了以下功能:

  1. 简化数据库连接的获取和释放;
  2. 简化SQL语句的执行;
  3. 简化结果集的处理。

2.2. 在SpringBoot中配置JdbcTemplate

要在SpringBoot项目中使用JdbcTemplate,首先需要引入相关依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

然后,在配置文件中配置数据源信息,如前文所述。

最后,在需要使用JdbcTemplate的地方,通过@Autowired注解注入JdbcTemplate对象:

@Autowired
private JdbcTemplate jdbcTemplate;

2.3. 使用JdbcTemplate进行数据库操作

使用JdbcTemplate进行数据库操作非常简单,以下是一个简单的示例:

public List<User> findAllUsers() {
  String sql = "SELECT * FROM user";
  return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}

在这个示例中,我们使用JdbcTemplate的query方法执行了一个查询语句,并将结果集映射为User对象的列表。这里使用了BeanPropertyRowMapper作为结果集的映射器,它会自动将结果集中的列映射到Java对象的属性上。

3. SpringBoot整合MyBatis

3.1. MyBatis的简介与作用

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis的主要特点包括:

  1. 灵活的SQL编写,支持动态SQL;
  2. 易于集成,可以与Spring、SpringBoot等框架无缝集成;
  3. 支持多种数据库和多种数据源;
  4. 提供了丰富的映射类型,支持一对一、一对多等关联查询。

3.2. 在SpringBoot中配置MyBatis

要在SpringBoot项目中使用MyBatis,首先需要引入相关依赖:

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.4</version>
</dependency>

然后,在配置文件中配置数据源信息和MyBatis的相关配置,例如:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.example.demo.entity

其中,mapper-locations指定了MyBatis的映射文件的位置,type-aliases-package指定了实体类的包名。

3.3. 使用MyBatis进行数据库操作

使用MyBatis进行数据库操作需要编写Mapper接口和映射文件。以下是一个简单的示例:

  1. 编写Mapper接口:
public interface UserMapper {
  List<User> findAll();
}
  1. 编写映射文件:
<mapper namespace="com.example.demo.mapper.UserMapper">
  <select id="findAll" resultType="User">
    SELECT * FROM user
  </select>
</mapper>
  1. 在需要使用UserMapper的地方,通过@Autowired注解注入UserMapper对象:
@Autowired
private UserMapper userMapper;
  1. 调用UserMapper的方法进行数据库操作:
public List<User> findAllUsers() {
  return userMapper.findAll();
}

4. SpringBoot整合JPA

4.1. JPA的简介与作用

JPA(Java Persistence API)是Java EE 5规范中的持久化规范,它的目的是简化实体Bean的持久化操作。JPA的主要特点包括:

  1. 提供了一种基于注解的对象关系映射;
  2. 支持多种数据库和多种数据源;
  3. 提供了丰富的查询方式,包括JPQL(Java Persistence Query Language)和Criteria API;
  4. 支持事务管理。

4.2. 在SpringBoot中配置JPA

要在SpringBoot项目中使用JPA,首先需要引入相关依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

然后,在配置文件中配置数据源信息和JPA的相关配置,例如:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

其中,ddl-auto表示Hibernate的自动建表策略,show-sql表示是否打印SQL语句。

4.3. 使用JPA进行数据库操作

使用JPA进行数据库操作需要编写实体类和Repository接口。以下是一个简单的示例:

  1. 编写实体类:
@Entity
@Table(name = "user")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  private Integer age;

  // 省略getter和setter方法
}
  1. 编写Repository接口:
public interface UserRepository extends JpaRepository<User, Long> {
}
  1. 在需要使用UserRepository的地方,通过@Autowired注解注入UserRepository对象:
@Autowired
private UserRepository userRepository;
  1. 调用UserRepository的方法进行数据库操作:
public List<User> findAllUsers() {
  return userRepository.findAll();
}

5. 多数据源的配置与使用

5.1. 在SpringBoot中配置多数据源

在某些场景下,我们需要在一个项目中使用多个数据源。要在SpringBoot中配置多数据源,首先需要在配置文件中配置多个数据源的信息,例如:

spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/test1
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
    secondary:
      url: jdbc:mysql://localhost:3306/test2
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver

然后,需要编写一个配置类,用于创建多个数据源对象:

@Configuration
public class DataSourceConfig {
  @Bean
  @Primary
  @ConfigurationProperties(prefix = "spring.datasource.primary")
  public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
  }

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

5.2. 使用多数据源进行数据库操作

在配置了多数据源之后,我们可以在不同的场景下使用不同的数据源。以下是一个使用多数据源的示例:

  1. 编写一个Service类,用于操作不同的数据源:
@Service
public class UserService {
  @Autowired
  @Qualifier("primaryJdbcTemplate")
  private JdbcTemplate primaryJdbcTemplate;

  @Autowired
  @Qualifier("secondaryJdbcTemplate")
  private JdbcTemplate secondaryJdbcTemplate;

  public List<User> findAllUsersFromPrimary() {
    String sql = "SELECT * FROM user";
    return primaryJdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
  }

  public List<User> findAllUsersFromSecondary() {
    String sql = "SELECT * FROM user";
    return secondaryJdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
  }
}
  1. 在需要使用多数据源的地方,调用UserService的方法进行数据库操作:
public List<User> findAllUsers() {
  List<User> primaryUsers = userService.findAllUsersFromPrimary();
  List<User> secondaryUsers = userService.findAllUsersFromSecondary();
  return Stream.concat(primaryUsers.stream(), secondaryUsers.stream()).collect(Collectors.toList());
}

总结

本文介绍了如何在SpringBoot项目中整合常见的数据源,包括JdbcTemplate、MyBatis和JPA,并探讨了如何配置和使用多数据源。通过使用SpringBoot提供的自动配置和简化的API,我们可以轻松地在项目中使用不同的数据源,提高开发效率。

更多推荐

记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案

《XAPI项目》:GitHub仓库(勿打🚫小破站一个)这篇文章,主要内容是记录使用DockerCompose部署《XAPI项目》遇道的问题及解决方案目录📚本地MySQL数据如何导入到容器内的MySQL中❎解决报错:docker-xapi-backend-1|q.GetUserInfoByUserAccounterr

KMP算法

1.典型例题28.找出字符串中第一个匹配项的下标-力扣(LeetCode)题干:给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbut

Spring WebFlux使用未加前缀的双通配符模式绕过安全性CVE-2023-34034

文章目录0.前言漏洞漏洞介绍描述1.参考文档2.基础介绍3.解决方案3.1.升级版本4.漏洞修复源码分析5.漏洞利用示例0.前言背景:公司项目扫描到WebFlux中使用"**"作为模式会导致SpringSecurity和SpringWebFlux之间CVE-2023-34034漏洞漏洞高|2023年7月18日|CVE-

LVS+Keepalived群集

LVS+Keepalived群集一、Keepalived实现原理1、原理2、Keepalived体系主要模块及其作用3、Keepalived工具介绍4、合格的集群应该具备的特性二、Keepalived的部署三、LVS+Keepalived高可用集群部署1.部署共享存储2.配置负载调度器(主、备相同)3.配置节点服务器4

2023年亚马逊云科技中国峰会记录

前言有幸抽到了亚马逊云科技中国峰会的门票,恰好又是在上海举行的,并且看预告有很多热点内容,所以就参加了。27日一早就赶到了世博中心,此时已经排起了长队。看来与会者还是蛮多的。整体分为以下几个环节:一.上午的主题演讲二.下午的互动活动三.下午的各种分会场论坛一.主题演讲-面向未来进行构建首个环节,是主题演讲,演讲者是亚马

springboot2整合nacos云服务,配置基本类型和json类型

最近公司要搭建一个配置中心,由于不想自己运维,便选择了云服务,定的是阿里云的nacos服务,即​​​​​​​https://mse.console.aliyun.com/。这里记录一下在springboot2项目中,使用云nacos来做一些基本配置String、int等,和配置json数据映射到java对象中。1云na

Android Kotlin 基础详解

1,基础语法1.1可变变量与不可变变量可以多次赋值的变量是可变变量,用关键字var表示:var<标识符>:<类型>=<初始化值>注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。varname:String="yuanzhen"name="yuanzhen1"varage:Int=20a

27、Flink 的SQL之SELECT (窗口函数)介绍及详细示例(3)

Flink系列文章1、Flink部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接13、Flink的tableapi与sql的基本概念、通用api介绍及入门示例14、Flink的tableapi与sql之数据类型:内置数据类型以及它们的属性15、Flink

Spring Boot中Tomcat服务器参数解析及高并发控制

SpringBoot中Tomcat服务器参数解析及高并发控制SpringBoot集成了多种服务器,默认使用了Tomcat服务器。在高并发情况下,合理地配置Tomcat服务器参数对于控制请求量和提高系统的稳定性至关重要。本文将解释SpringBoot中涉及Tomcat服务器的一些关键参数,并探讨在高并发情况下如何通过这些

JS中Symbol的介绍

1、引入Symbol类型的背景ES5的对象属性名都是字符串,这容易造成属性名冲突的问题举例:使用别人的模块/对象,又想为之添加新的属性,这就容易使得新属性名与原有属性名冲突2、Symbol类型简介symbol是一种原始数据类型其余原始类型:未定义(undefined)、空值(null)、布尔值(boolean)、字符串

进一步观察扩散模型中的参数有效调整

摘要:像Stablediffusion[31]这样的大规模扩散模型非常强大,可以找到各种真实世界的应用程序,而通过微调来定制这样的模型会降低内存和时间的效率。受自然语言处理最新进展的推动,我们通过插入小型可学习模块adapters(称为适配器)来研究大型扩散模型中的参数高效调优。具体来说,我们将适配器的设计空间分解为正

热文推荐