您好,登录后才能下订单哦!
# SpringBoot中怎么利用JDBC对数据库进行操作
## 目录
1. [JDBC与SpringBoot概述](#jdbc与springboot概述)
2. [环境准备与项目搭建](#环境准备与项目搭建)
3. [基础JDBC操作实现](#基础jdbc操作实现)
4. [Spring JDBC Template详解](#spring-jdbc-template详解)
5. [事务管理机制](#事务管理机制)
6. [连接池配置优化](#连接池配置优化)
7. [异常处理与调试](#异常处理与调试)
8. [性能优化建议](#性能优化建议)
9. [实际应用案例](#实际应用案例)
10. [总结与扩展](#总结与扩展)
---
## JDBC与SpringBoot概述
### 1.1 JDBC技术简介
Java数据库连接(JDBC)是Java语言中用来规范客户端程序如何访问数据库的标准API,由一组用Java语言编写的类和接口组成。它提供了:
- 统一的数据库访问接口
- 驱动程序管理器架构
- SQL语句执行能力
- 事务控制功能
```java
// 传统JDBC操作示例
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,user,password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 处理结果集...
} finally {
if(conn != null) conn.close();
}
SpringBoot通过自动配置和starter依赖大幅简化了JDBC的使用: - 自动配置数据源 - 内置连接池支持 - 简化异常处理 - 声明式事务支持
在pom.xml中添加关键依赖:
<dependencies>
<!-- SpringBoot Starter JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 连接池可选 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
</dependencies>
application.yml典型配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
connection-timeout: 30000
@Repository
public class UserRepository {
@Autowired
private DataSource dataSource;
public List<User> findAll() throws SQLException {
List<User> users = new ArrayList<>();
try(Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while(rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
users.add(user);
}
}
return users;
}
}
public User findById(Long id) throws SQLException {
try(Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE id = ?")) {
ps.setLong(1, id);
ResultSet rs = ps.executeQuery();
if(rs.next()) {
return new User(rs.getLong("id"), rs.getString("name"));
}
return null;
}
}
JdbcTemplate提供的主要方法:
方法类别 | 典型方法 | 说明 |
---|---|---|
查询操作 | query() | 执行查询并处理结果集 |
更新操作 | update() | 执行INSERT/UPDATE/DELETE |
批处理 | batchUpdate() | 执行批量操作 |
存储过程 | call() | 调用存储过程 |
public List<User> findActiveUsers() {
return jdbcTemplate.query(
"SELECT * FROM users WHERE status = ?",
new Object[]{1},
(rs, rowNum) -> new User(
rs.getLong("id"),
rs.getString("name"),
rs.getInt("age")
));
}
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Service
public class UserService {
@Transactional
public void createUser(User user) {
// 数据库操作...
}
}
Spring定义了7种传播行为: - REQUIRED(默认) - SUPPORTS - MANDATORY - REQUIRES_NEW - NOT_SUPPORTED - NEVER - NESTED
spring:
datasource:
hikari:
pool-name: SpringBootHikariCP
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
Spring将检查型SQLException转换为运行时异常: - DataAccessException - BadSqlGrammarException - DataIntegrityViolationException - DeadlockLoserDataAccessException
try {
jdbcTemplate.update("INSERT INTO users VALUES(?,?)", user.getId(), user.getName());
} catch(DuplicateKeyException ex) {
log.error("主键冲突: {}", ex.getMessage());
}
public Map<Long, User> getUserMap() {
return jdbcTemplate.query("SELECT * FROM users",
rs -> {
Map<Long, User> map = new HashMap<>();
while(rs.next()) {
User user = new User(rs.getLong("id"), rs.getString("name"));
map.put(user.getId(), user);
}
return map;
});
}
完整实现包含: 1. 用户CRUD操作 2. 分页查询实现 3. 事务处理示例 4. 性能监控配置
@Service
public class UserServiceImpl implements UserService {
private static final String INSERT_SQL =
"INSERT INTO users(username,password,email) VALUES(?,?,?)";
@Override
@Transactional
public User register(User user) {
jdbcTemplate.update(INSERT_SQL,
user.getUsername(),
passwordEncoder.encode(user.getPassword()),
user.getEmail());
// 其他业务逻辑...
}
}
技术方案 | 优点 | 适用场景 |
---|---|---|
原生JDBC | 性能最好,控制精细 | 超高性能需求 |
JdbcTemplate | 平衡易用与性能 | 大多数常规场景 |
ORM框架 | 开发效率最高 | 复杂业务系统 |
完整代码示例可参考:GitHub示例仓库 “`
(注:此为精简版大纲,完整8400字文章需扩展每个章节的详细说明、原理分析、更多代码示例和性能对比图表等内容)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。