您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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>
(约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
@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 | 连接空闲检测 |
(约2000字)
@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")
)
);
}
}
jdbcTemplate.update(
"INSERT INTO users(name, email) VALUES(?, ?)",
user.getName(), user.getEmail()
);
jdbcTemplate.batchUpdate(
"UPDATE users SET active = ? WHERE id = ?",
batchArgs
);
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字)
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");
}
}
logging.level.org.springframework.jdbc=DEBUG
logging.level.org.springframework.transaction=TRACE
(约800字)
// 不安全的做法
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
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. 补充各章节的详细技术说明 2. 增加更多代码示例和配置示例 3. 添加示意图和流程图(使用Mermaid语法) 4. 扩展性能优化部分的压测数据 5. 补充各数据库的差异化配置说明
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。