六. Spring Boot 与数据库
目录
JDBC 集成
Spring Data JPA
MyBatis 集成
事务管理
1、JDBC 集成
1.1 JDBC简介
1.1.1 定义和作用
JDBC(Java Database Connectivity)是Java中用于与关系型数据库进行交互的API。它为Java程序提供了一个标准的、统一的接口,使得Java程序可以连接到各种支持JDBC的数据库,如MySQL、Oracle、PostgreSQL等。通过JDBC,开发人员可以执行SQL语句,进行数据的增删改查操作。
JDBC的主要作用包括:
- 连接数据库:通过JDBC驱动器建立与数据库的连接。
- 执行SQL语句:支持执行各种SQL语句,如SELECT、INSERT、UPDATE、DELETE等。
- 处理结果集:对于查询操作,JDBC提供了结果集(ResultSet)来存储和处理查询返回的数据。
- 事务管理:支持数据库事务的提交和回滚,确保数据操作的原子性和一致性。
1.1.2 优点和缺点
优点:
- 跨平台性:JDBC允许Java程序在不同平台和数据库之间移植,仅需更换相应的JDBC驱动器。
- 统一接口:提供了统一的接口,简化了与不同数据库的交互。
- 功能强大:支持复杂的SQL操作和事务管理。
- 广泛支持:几乎所有主流数据库都提供JDBC驱动器,具有良好的生态系统。
缺点:
- 冗长的代码:传统的JDBC操作需要手动管理连接、预处理语句、处理结果集等,这会导致代码冗长且易于出错。
- 资源管理麻烦:需要手动关闭连接、语句和结果集,否则会导致资源泄漏。
- 不支持动态SQL:JDBC本身不直接支持动态生成SQL,需要通过字符串拼接等方式实现,可能增加SQL注入的风险。
- 不适合复杂对象关系映射:JDBC适合简单的CRUD操作,但在处理复杂的对象关系映射时,需要额外的ORM(对象关系映射)工具的支持。
1.2 Spring Boot 中的 JDBC 配置
1.2.1 自动配置原理
Spring Boot通过 starters 机制自动配置JDBC环境。当添加spring-boot-starter-jdbc
或spring-boot-starter-data-jpa
依赖时,Spring Boot会自动在classpath中查找JDBC驱动器,并基于这些驱动器配置数据源和JdbcTemplate。
具体来说:
- 自动检测驱动器:Spring Boot会检测classpath中是否存在支持的数据库驱动器,如H2、MySQL、PostgreSQL等。
- 配置数据源:根据
application.properties
中的配置,创建并配置数据源(DataSource)实例,默认使用HikariCP作为连接池。 - 创建JdbcTemplate:Spring Boot会自动创建并配置JdbcTemplate bean,开发者可以直接注入使用。
1.2.2 数据源配置(如HikariCP)
HikariCP是Spring Boot默认使用的数据库连接池,因为它高效、轻量级,并且性能优异。以下是HikariCP的主要特点:
- 高性能:HikariCP是目前Java领域最快的连接池之一。
- 轻量级:占用内存小,启动快。
- 自动调优:HikariCP能够自动调整连接池大小,以达到最佳性能。
在application.properties
中配置HikariCP的相关参数:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # HikariCP 配置
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=15
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.idleTimeout=60000
1.2.3 application.properties 配置详解
在application.properties
中,可以通过Spring Boot的属性来配置数据源和数据库连接:
- 数据库连接URL:
spring.datasource.url
- 数据库用户名:
spring.datasource.username
- 数据库密码:
spring.datasource.password
- JDBC驱动类名:
spring.datasource.driver-class-name
- 数据源类型:
spring.datasource.type
,默认为HikariDataSource,可以选择其他如Druid等。
自定义数据源
如果需要自定义数据源,可以在配置类中定义一个@Bean
:
@Configuration
public class DatabaseConfig { @Bean public DataSource dataSource() { return DataSourceBuilder.create() .driverClassName("com.mysql.cj.jdbc.Driver") .url("jdbc:mysql://localhost:3306/mydb") .username("root") .password("123456") .build(); }
}
1.3 使用 JdbcTemplate
1.3.1 什么是 JdbcTemplate?
JdbcTemplate是Spring框架提供的一个JDBC模板类,旨在简化JDBC操作。它封装了底层的JDBC细节,提供了一系列方法来执行SQL操作,并自动处理资源的释放。通过使用JdbcTemplate,开发者可以专注于业务逻辑,而不必担心繁琐的JDBC资源管理。
1.3.2 CRUD 操作示例
以下是使用JdbcTemplate进行CRUD操作的示例:
- 插入数据(INSERT):
public void insertUser(User user) { String sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)"; jdbcTemplate.update(sql, user.getUsername(), user.getEmail(), user.getPassword());
}
- 查询数据(SELECT):
public List<User> findAllUsers() { String sql = "SELECT * FROM users"; return jdbcTemplate.query(sql, new UserRowMapper());
} class UserRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getLong(</