Java中执行SQL语句的基础方法
在Java中执行SQL语句是数据库操作的核心环节,主要通过JDBC(Java Database Connectivity)实现,JDBC是Java提供的标准API,用于连接数据库并执行SQL命令,无论是简单的查询、插入,还是复杂的事务处理,JDBC都提供了统一的接口,以下是Java执行SQL语句的详细方法和注意事项。

JDBC连接数据库的准备工作
在执行SQL语句前,需要先建立与数据库的连接,以下是基本步骤:
-
加载JDBC驱动
不同数据库需要加载对应的驱动类,例如MySQL使用com.mysql.cj.jdbc.Driver,Oracle使用oracle.jdbc.driver.OracleDriver,代码示例如下:Class.forName("com.mysql.cj.jdbc.Driver"); -
获取数据库连接
使用DriverManager.getConnection()方法,传入数据库URL、用户名和密码。String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "password"; Connection connection = DriverManager.getConnection(url, username, password);
-
创建Statement或PreparedStatement对象
Statement:用于执行静态SQL语句,适合简单的SQL操作。PreparedStatement:预编译SQL语句,防止SQL注入,适合参数化查询。CallableStatement:用于调用存储过程。
使用Statement执行SQL语句
Statement是最基础的执行方式,适用于无参数的SQL语句。
-
执行查询操作(SELECT)
使用executeQuery()方法,返回ResultSet对象,遍历结果集获取数据:Statement statement = connection.createStatement(); String sql = "SELECT id, name FROM users"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } -
执行更新操作(INSERT/UPDATE/DELETE)
使用executeUpdate()方法,返回受影响的行数:String sql = "UPDATE users SET age = 25 WHERE id = 1"; int rowsAffected = statement.executeUpdate(sql); System.out.println("更新了 " + rowsAffected + " 行数据");
使用PreparedStatement执行SQL语句
PreparedStatement是更安全、高效的执行方式,尤其适合动态SQL。
-
预编译SQL语句
通过占位符表示参数,然后设置参数值:
String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "张三"); preparedStatement.setInt(2, 30);
-
执行SQL语句
- 查询操作:
executeQuery(),返回ResultSet。 - 更新操作:
executeUpdate(),返回受影响的行数。int rowsAffected = preparedStatement.executeUpdate();
- 查询操作:
-
批量操作
PreparedStatement支持批量执行,提高效率:for (int i = 1; i <= 10; i++) { preparedStatement.setString(1, "用户" + i); preparedStatement.setInt(2, 20 + i); preparedStatement.addBatch(); } int[] results = preparedStatement.executeBatch();
处理结果集(ResultSet)
ResultSet是查询操作返回的结果集,需要正确关闭以避免资源泄漏。
-
遍历结果集
使用next()方法移动光标,结合getXxx()方法获取数据:while (resultSet.next()) { int id = resultSet.getInt(1); // 按列索引获取 String name = resultSet.getString("name"); // 按列名获取 } -
关闭资源
按照声明顺序反向关闭资源:resultSet.close(); statement.close(); connection.close();
事务管理
事务是数据库操作的重要概念,确保一组操作要么全部成功,要么全部失败。
-
开启事务
默认情况下,JDBC是自动提交模式,需手动关闭:connection.setAutoCommit(false);
-
提交或回滚事务
- 提交:
connection.commit() - 回滚:
connection.rollback()try { // 执行SQL语句 connection.commit(); } catch (SQLException e) { connection.rollback(); e.printStackTrace(); }
- 提交:
-
设置事务隔离级别
通过connection.setTransactionIsolation()设置隔离级别,如Connection.TRANSACTION_READ_COMMITTED。
使用try-with-resources管理资源
Java 7及以上版本支持try-with-resources,自动关闭实现了AutoCloseable接口的资源(如Connection、Statement、ResultSet):
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement statement = connection.prepareStatement(sql)) {
// 执行SQL语句
} catch (SQLException e) {
e.printStackTrace();
}
最佳实践与注意事项
-
防止SQL注入
始终使用PreparedStatement而非直接拼接SQL字符串。 -
使用连接池
直接创建连接开销大,推荐使用HikariCP、DBCP等连接池管理连接。 -
异常处理
捕获SQLException,记录日志并适当处理,避免程序崩溃。 -
关闭资源
确保所有资源(Connection、Statement、ResultSet)在使用后关闭,最好使用try-with-resources。 -
批量操作优化
对于大量数据插入或更新,使用批量操作并合理设置批量大小(如每1000条提交一次)。
示例代码整合
以下是一个完整的示例,展示使用PreparedStatement执行查询并处理结果集:
import java.sql.*;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement statement = connection.prepareStatement("SELECT id, name FROM users WHERE age > ?")) {
statement.setInt(1, 25);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
System.out.println("ID: " + resultSet.getInt("id") + ", Name: " + resultSet.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
通过以上方法,可以高效、安全地在Java中执行SQL语句,根据实际需求选择合适的执行方式,并注意资源管理和异常处理,以确保程序的稳定性和性能。


















