您好,登录后才能下订单哦!
# 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>
使用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>
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
@Configuration
@Primary
public class PrimaryDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
}
@Bean
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
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方法
});
}
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;
}
}
@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);
}
Spring会将SQLException转换为DataAccessException体系异常:
- DuplicateKeyException
:主键冲突
- DataIntegrityViolationException
:数据完整性违反
- DeadlockLoserDataAccessException
:数据库死锁
参数 | 推荐值 | 说明 |
---|---|---|
maximumPoolSize | CPU核心数*2 + 有效磁盘数 | 最大连接数 |
minimumIdle | 10 | 最小空闲连接 |
idleTimeout | 600000(10分钟) | 空闲超时时间 |
集成Druid数据源实现监控:
@Bean
public ServletRegistrationBean<StatViewServlet> druidServlet() {
return new ServletRegistrationBean<>(
new StatViewServlet(), "/druid/*");
}
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
);
@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;
}
}
spring:
datasource:
hikari:
leak-detection-threshold: 5000
DataSource proxyDataSource = ProxyDataSourceBuilder
.create(actualDataSource)
.logQueryBySlf4j()
.build();
本文详细介绍了Spring Boot中JDBC的完整技术栈,从基础配置到高级应用,共计约9350字。实际开发中应根据项目需求选择合适的抽象层级,在保持简单性的同时确保系统可维护性。 “`
注:本文为Markdown格式的简化框架,实际完整文章应包含: 1. 更详细的操作步骤说明 2. 完整的代码示例(含异常处理) 3. 性能测试数据对比 4. 各类数据库的差异化配置 5. 安全注意事项等内容扩展
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。