JDBC执行sql过程

发布于:2025-05-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

1. 加载数据库驱动​

JDBC 通过 ​​驱动(Driver)​​ 实现与不同数据库的通信。驱动需提前加载到 JVM:

手动加载(JDBC 4.0 前)​​:

Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱动类

自动加载(JDBC 4.0+)​​:通过 SPI 机制自动识别驱动类,无需显式调用。

​2. 建立数据库连接

通过 DriverManager 或 ​​连接池(如 HikariCP)​​ 获取 Connection 对象:

String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false";

String user = "root";

String password = "123456";

Connection conn = DriverManager.getConnection(url, user, password);

3. 创建 Statement 对象​

JDBC 提供三种执行 SQL 的接口:

​接口​ ​特点​
Statement 静态 SQL,存在 SQL 注入风险,适用于简单查询。
PreparedStatement 预编译 SQL,参数化传递,防止 SQL 注入,适合重复执行或含动态参数的 SQL。
CallableStatement 调用存储过程。

示例:使用 PreparedStatement

String sql = "SELECT id, name FROM users WHERE age > ?";

PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, 18); // 设置参数(索引从 1 开始)

4. 执行 SQL 并处理结果​

执行 SQL​

查询操作​​(返回 ResultSet):

ResultSet rs = pstmt.executeQuery();

更新操作​​(返回影响行数):

int rowsAffected = pstmt.executeUpdate(); // INSERT/UPDATE/DELETE

处理结果集​

while (rs.next()) { int id = rs.getInt("id");

// 按列名获取 String name = rs.getString(2); // 按索引获取(从 1 开始)

System.out.println(id + ": " + name); }

结果集类型​​:

  • TYPE_FORWARD_ONLY:默认,只能向前遍历。
  • TYPE_SCROLL_INSENSITIVE:可滚动,不感知数据库变化。
  • TYPE_SCROLL_SENSITIVE:可滚动,感知数据库变化(多数驱动不实现)。

5. 事务管理(可选)

通过 Connection 控制事务:

try { conn.setAutoCommit(false); // 关闭自动提交

        // 执行多个 SQL...

        conn.commit(); // 提交事务

} catch (SQLException e) {

        conn.rollback(); // 回滚事务

} finally {

        conn.setAutoCommit(true); // 恢复自动提交

}

​隔离级别​​:通过 conn.setTransactionIsolation(level) 设置(如 READ_COMMITTED)。

​6. 释放资源​

必须显式关闭资源​​以避免内存泄漏和连接耗尽:

try {

        if (rs != null) rs.close();

        if (pstmt != null) pstmt.close();

        if (conn != null) conn.close(); // 实际中连接池会回收而非真正关闭

} catch (SQLException e) {

        e.printStackTrace();

}


网站公告

今日签到

点亮在社区的每一天
去签到