Spring Boot中怎样使用JDBC

发布时间:2021-12-29 13:11:42 作者:柒染
来源:亿速云 阅读:243
# Spring Boot中怎样使用JDBC

## 目录
1. [JDBC与Spring Boot概述](#jdbc与spring-boot概述)
2. [环境准备与项目创建](#环境准备与项目创建)
3. [基础JDBC配置](#基础jdbc配置)
4. [执行SQL操作](#执行sql操作)
5. [事务管理](#事务管理)
6. [连接池优化](#连接池优化)
7. [异常处理与调试](#异常处理与调试)
8. [最佳实践与性能优化](#最佳实践与性能优化)
9. [完整代码示例](#完整代码示例)
10. [总结与扩展](#总结与扩展)

---

## JDBC与Spring Boot概述
(约800字)

### JDBC技术背景
Java Database Connectivity(JDBC)是Java语言中用于规范客户端程序如何访问数据库的标准API...

### Spring Boot的简化设计
Spring Boot通过自动配置和starter依赖大幅简化了JDBC的使用流程:
- 自动注册`DataSource`
- 预配置`JdbcTemplate`
- 内置连接池支持

### 技术选型对比
| 方案        | 优点               | 缺点               |
|-------------|--------------------|--------------------|
| 原生JDBC    | 直接控制           | 样板代码多         |
| JdbcTemplate| 简洁易用           | 灵活性稍低         |
| ORM框架     | 开发效率高         | 学习曲线陡峭       |

---

## 环境准备与项目创建
(约1000字)

### 开发环境要求
- JDK 1.8+
- Maven 3.6+
- MySQL 5.7/8.0

### 创建Spring Boot项目
```bash
spring init -d=web,jdbc,mysql my-jdbc-demo

关键依赖说明

<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>

基础JDBC配置

(约1200字)

数据源配置

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

自定义DataSource

@Configuration
public class DataSourceConfig {
    
    @Bean
    @ConfigurationProperties(prefix = "app.datasource")
    public DataSource customDataSource() {
        return DataSourceBuilder.create().build();
    }
}

配置参数详解

参数 说明
spring.datasource.tomcat.* Tomcat连接池专用配置
spring.datasource.hikari.* HikariCP连接池配置
spring.datasource.testWhileIdle 连接空闲检测

执行SQL操作

(约2000字)

JdbcTemplate基础用法

@Repository
public class UserRepository {
    
    private final JdbcTemplate jdbcTemplate;

    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<User> findAll() {
        return jdbcTemplate.query(
            "SELECT * FROM users",
            (rs, rowNum) -> new User(
                rs.getLong("id"),
                rs.getString("name"),
                rs.getString("email")
            )
        );
    }
}

常见操作示例

  1. 插入数据
jdbcTemplate.update(
    "INSERT INTO users(name, email) VALUES(?, ?)",
    user.getName(), user.getEmail()
);
  1. 批量操作
jdbcTemplate.batchUpdate(
    "UPDATE users SET active = ? WHERE id = ?",
    batchArgs
);
  1. 存储过程调用
jdbcTemplate.call(
    conn -> {
        CallableStatement cs = conn.prepareCall("{call sp_get_user(?)}");
        cs.setLong(1, userId);
        return cs;
    },
    Collections.emptyList()
);

事务管理

(约1500字)

声明式事务配置

@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
    );
}

事务隔离级别

@Transactional(isolation = Isolation.READ_COMMITTED)
public List<Account> getAccounts() {
    // ...
}

事务传播行为

传播类型 说明
REQUIRED(默认) 支持当前事务,不存在则新建
REQUIRES_NEW 总是新建事务
NESTED 嵌套事务

连接池优化

(约1200字)

HikariCP配置示例

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000

连接池监控

@RestController
public class PoolMetricsController {

    @Autowired
    private DataSource dataSource;

    @GetMapping("/pool-info")
    public Map<String, Object> getPoolInfo() {
        if (dataSource instanceof HikariDataSource) {
            HikariPoolMXBean pool = ((HikariDataSource) dataSource).getHikariPoolMXBean();
            return Map.of(
                "activeConnections", pool.getActiveConnections(),
                "idleConnections", pool.getIdleConnections()
            );
        }
        return Collections.emptyMap();
    }
}

异常处理与调试

(约1000字)

自定义异常转换

@ControllerAdvice
public class JdbcExceptionHandler {

    @ExceptionHandler(DataAccessException.class)
    public ResponseEntity<String> handleDataAccessException(DataAccessException ex) {
        // 解析SQL状态码
        if (ex.getRootCause() instanceof SQLException) {
            SQLException sqlEx = (SQLException) ex.getRootCause();
            return ResponseEntity.badRequest()
                .body("Database error: " + sqlEx.getSQLState());
        }
        return ResponseEntity.internalServerError()
            .body("Database operation failed");
    }
}

SQL日志输出

logging.level.org.springframework.jdbc=DEBUG
logging.level.org.springframework.transaction=TRACE

最佳实践与性能优化

(约800字)

性能优化建议

  1. 使用批处理操作减少网络往返
  2. 合理设置fetchSize
  3. 使用SQL预编译语句

安全注意事项

// 不安全的做法
String sql = "SELECT * FROM users WHERE name = '" + name + "'";

// 正确的参数化查询
jdbcTemplate.query(
    "SELECT * FROM users WHERE name = ?",
    new Object[]{name},
    rowMapper
);

完整代码示例

(约500字)

领域模型

public class User {
    private Long id;
    private String name;
    private String email;
    // getters/setters
}

完整Service示例

@Service
public class UserService {
    
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public User createUser(User user) {
        // 业务逻辑...
        return userRepository.save(user);
    }
}

总结与扩展

(约500字)

技术总结

扩展方向

  1. 结合MyBatis使用
  2. 集成Spring Data JDBC
  3. 多数据源配置

参考资源

”`

注:实际使用时需要: 1. 补充各章节的详细技术说明 2. 增加更多代码示例和配置示例 3. 添加示意图和流程图(使用Mermaid语法) 4. 扩展性能优化部分的压测数据 5. 补充各数据库的差异化配置说明

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

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

springboot tomcat

上一篇:JavaScript中错误处理try..catch...finally+涵盖throw+TypeError+RangeError的示例分析

下一篇:大数据分析TB级别数据量大了怎么办

相关阅读

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

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