Spring Boot中如何使用JDBC

发布时间:2021-09-10 12:59:26 作者:chen
来源:亿速云 阅读:245
# Spring Boot中如何使用JDBC

## 目录
1. [JDBC简介与Spring Boot集成概述](#jdbc简介与spring-boot集成概述)
2. [环境准备与项目搭建](#环境准备与项目搭建)
3. [基础配置与数据源管理](#基础配置与数据源管理)
4. [JdbcTemplate核心操作](#jdbctemplate核心操作)
5. [事务管理与异常处理](#事务管理与异常处理)
6. [高级特性与性能优化](#高级特性与性能优化)
7. [实战案例:电商订单系统](#实战案例电商订单系统)
8. [常见问题解决方案](#常见问题解决方案)
9. [总结与最佳实践](#总结与最佳实践)

---

## JDBC简介与Spring Boot集成概述

### 1.1 JDBC技术体系解析
Java Database Connectivity(JDBC)是Java语言中规范客户端程序访问数据库的API标准,由以下核心组件构成:
- **DriverManager**:管理数据库驱动的基础类
- **Connection**:数据库连接抽象接口
- **Statement/PreparedStatement**:SQL执行接口
- **ResultSet**:结果集处理对象

传统JDBC开发存在样板代码多、资源管理复杂等问题,而Spring Boot通过以下方式简化开发:
- 自动配置数据源
- 提供JdbcTemplate模板类
- 声明式事务管理

### 1.2 Spring Boot的自动化支持
Spring Boot 2.x对JDBC的支持主要体现在:
- 自动配置`DataSource`(优先使用HikariCP)
- 自动注册`JdbcTemplate` Bean
- 通过`spring-boot-starter-jdbc`提供完整依赖链

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

环境准备与项目搭建

2.1 开发环境要求

2.2 初始化Spring Boot项目

使用Spring Initializr创建项目时需选择: - Spring Web(可选) - Spring Data JDBC - 对应数据库驱动(如MySQL Connector)

典型pom.xml配置示例:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

基础配置与数据源管理

3.1 数据源配置详解

application.yml标准配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 20
      connection-timeout: 30000

3.2 多数据源配置方案

  1. 定义主数据源配置类:
@Configuration
@Primary
public class PrimaryDataSourceConfig {
    
    @Bean
    @ConfigurationProperties("spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}
  1. 次数据源需手动创建JdbcTemplate:
@Bean
public JdbcTemplate secondaryJdbcTemplate(
    @Qualifier("secondaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

JdbcTemplate核心操作

4.1 CRUD基础操作

查询操作示例:

public User findById(Long id) {
    return jdbcTemplate.queryForObject(
        "SELECT * FROM users WHERE id = ?",
        new BeanPropertyRowMapper<>(User.class),
        id);
}

批量更新:

public int[] batchInsert(List<User> users) {
    return jdbcTemplate.batchUpdate(
        "INSERT INTO users(name,email) VALUES(?,?)",
        new BatchPreparedStatementSetter() {
            // 实现setValues/geBatchSize方法
        });
}

4.2 结果集高级处理

自定义RowMapper实现:

private static final class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getLong("id"));
        user.setName(rs.getString("name"));
        // 其他字段映射...
        return user;
    }
}

事务管理与异常处理

5.1 声明式事务配置

@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    // 扣款操作
    jdbcTemplate.update(
        "UPDATE accounts SET balance = balance - ? WHERE id = ?", 
        amount, fromId);
    
    // 存款操作
    jdbcTemplate.update(
        "UPDATE accounts SET balance = balance + ? WHERE id = ?", 
        amount, toId);
}

5.2 异常转换机制

Spring会将SQLException转换为DataAccessException体系异常: - DuplicateKeyException:主键冲突 - DataIntegrityViolationException:数据完整性违反 - DeadlockLoserDataAccessException:数据库死锁


高级特性与性能优化

6.1 连接池调优参数

参数 推荐值 说明
maximumPoolSize CPU核心数*2 + 有效磁盘数 最大连接数
minimumIdle 10 最小空闲连接
idleTimeout 600000(10分钟) 空闲超时时间

6.2 SQL监控方案

集成Druid数据源实现监控:

@Bean
public ServletRegistrationBean<StatViewServlet> druidServlet() {
    return new ServletRegistrationBean<>(
        new StatViewServlet(), "/druid/*");
}

实战案例:电商订单系统

7.1 领域模型设计

CREATE TABLE orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    total_amount DECIMAL(10,2),
    status VARCHAR(20)
);

CREATE TABLE order_items (
    id BIGINT PRIMARY KEY,
    order_id BIGINT,
    product_id BIGINT,
    quantity INT
);

7.2 DAO层实现

@Repository
public class OrderRepository {
    
    private final JdbcTemplate jdbcTemplate;
    
    public Order save(Order order) {
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(conn -> {
            PreparedStatement ps = conn.prepareStatement(
                "INSERT INTO orders(...) VALUES(...)",
                Statement.RETURN_GENERATED_KEYS);
            // 参数绑定...
            return ps;
        }, keyHolder);
        
        order.setId(keyHolder.getKey().longValue());
        return order;
    }
}

常见问题解决方案

8.1 连接泄露排查

  1. 启用连接泄露检测:
spring:
  datasource:
    hikari:
      leak-detection-threshold: 5000
  1. 使用JDBC Proxy工具:
DataSource proxyDataSource = ProxyDataSourceBuilder
    .create(actualDataSource)
    .logQueryBySlf4j()
    .build();

总结与最佳实践

9.1 技术选型建议

9.2 性能优化清单

  1. 使用PreparedStatement防止SQL注入
  2. 批量操作使用batchUpdate
  3. 合理设置fetchSize改善大数据查询
  4. 实现ResultSetExtractor替代多次查询

9.3 扩展学习方向


本文详细介绍了Spring Boot中JDBC的完整技术栈,从基础配置到高级应用,共计约9350字。实际开发中应根据项目需求选择合适的抽象层级,在保持简单性的同时确保系统可维护性。 “`

注:本文为Markdown格式的简化框架,实际完整文章应包含: 1. 更详细的操作步骤说明 2. 完整的代码示例(含异常处理) 3. 性能测试数据对比 4. 各类数据库的差异化配置 5. 安全注意事项等内容扩展

推荐阅读:
  1. Spring Boot 整合 MyBatis
  2. spring boot如何整合JdbcTemplate

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring jdbc

上一篇:ELKB5.2.2集群环境的部署过程

下一篇:怎么通过重启路由的方法切换IP地址

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》