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);
int affectedRows = pstmt.executeUpdate(); // 执行更新(插入、更新、删除) System.out.println("影响行数: " + affectedRows);
}
catch (SQLException e) { e.printStackTrace(); } } }
更新
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);
int affectedRows = pstmt.executeUpdate(); System.out.println("更新影响行数: " + affectedRows);
}
catch (SQLException e) { e.printStackTrace(); } }
删除
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

对比点StatementPreparedStatement(推荐
SQL 注入 存在风险(字符串拼接) 安全(预编译,参数占位符)
性能 每次编译 SQL、性能差 预编译一次,执行多次
代码可读性 差(拼接字符串) 好(使用 ? 占位符)
使用场景 不推荐使用 所有场景

 

 

posted @ 2026-08-17 11:31  Fēngwèi  阅读(5)  评论(0)    收藏  举报