Java-JDBC:数据库连接与操作
JDBC:Java Database Connectivity、Java数据库连接,是Java 访问数据库的标准 API(JDBC驱动实际是JDBC接口的实现类)
JDBC 操作数据库的标准步骤:
- 加载并注册驱动(DriverManager)
- 获取数据库连接(Connection)
- 创建 Statement / PreparedStatement 对象
- 使用Statement对象执行 SQL 语句,处理结果(ResultSet)
- 关闭资源
测试中典型使用场景:
- 执行测试前,通过 JDBC 向数据库插入预设的“干净”数据,保证测试环境可控。
- 测试执行后,通过 JDBC 查询数据库,验证业务结果是否正确(如订单状态、用户余额)。
- 测试完成后,通过 JDBC 删除测试过程中产生的数据,保持数据库整洁。
数据库连接池介绍:预先建立多个数据库连接对象放入连接池,需要时从池中取出一个连接对象来使用,使用后再释放连接对象到池中。
- 优点:避免了频繁创建和销毁的开销,显著提升了系统性能
- 可以根据连接使用率,动态增加/减少连接
1、JDBC查询示例:
import java.sql.*; public class JdbcQueryDemo { public static void main(String[] args) { // 1. 定义连接信息(建议从配置文件读取) String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "123456"; // 2. 使用 try-with-resources 自动关闭资源,在 try 关键字后的 () 中声明并初始化资源对象--会自动按逆序关闭所有资源
// 关闭顺序:先关闭 ResultSet,再关闭 Statement,最后关闭 Connection
try (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement("SELECT id, name, age FROM users WHERE age > ?"); ) { // 3. 设置参数 pstmt.setInt(1, 18); // 第一个参数问号,值为 18 // 4. 执行查询,获取结果集 ResultSet rs = pstmt.executeQuery(); // 5. 遍历结果集 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age); } } catch (SQLException e) { e.printStackTrace(); } // try-with-resources 自动关闭 conn、pstmt、rs } }
| 插入 |
public class JdbcInsertDemo { public void addUser(String name, int age) { String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, name); pstmt.setInt(2, age); |
| 更新 |
public void updateUserAge(int id, int newAge) { String sql = "UPDATE users SET age = ? WHERE id = ?"; try (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, newAge); pstmt.setInt(2, id); |
| 删除 |
public void deleteUser(int id) { String sql = "DELETE FROM users WHERE id = ?"; try (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, id); int affectedRows = pstmt.executeUpdate(); System.out.println("删除影响行数: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } } |
2、推荐使用PreparedStatement
| 对比点 | Statement | PreparedStatement(推荐) |
|---|---|---|
| SQL 注入 | 存在风险(字符串拼接) | 安全(预编译,参数占位符) |
| 性能 | 每次编译 SQL、性能差 | 预编译一次,执行多次 |
| 代码可读性 | 差(拼接字符串) | 好(使用 ? 占位符) |
| 使用场景 | 不推荐使用 | 所有场景 |
本文来自博客园,作者:Fēngwèi,转载请注明原文链接:https://www.cnblogs.com/fengwei-blogs/p/22516761

浙公网安备 33010602011771号