java中执行insert操作应使用preparedstatement防止sql注入并提升效率,通过setxxx设置参数、executeupdate执行、getgeneratedkeys获取自增id,且必须用try-with-resources自动关闭资源。

在 Java 中通过 JDBC 执行 INSERT 操作,核心是使用 PreparedStatement(推荐)或 Statement 对象发送 SQL 插入语句,并正确处理连接、参数、异常和资源释放。
1. 准备数据库连接和预编译语句
使用 PreparedStatement 可防止 SQL 注入、支持参数占位符(?),且执行效率更高。需先获取 Connection,再用它创建带 SQL 的 PreparedStatement:
- SQL 示例:
"INSERT INTO users(name, age, email) VALUES(?, ?, ?)" - 调用
connection.prepareStatement(sql)得到PreparedStatement实例 - 按顺序用
setString()、setInt()等方法为每个?设置值
2. 执行插入并获取自增主键(可选)
若表主键是自增(如 MySQL 的 AUTO_INCREMENT),可在创建 PreparedStatement 时传入额外参数,以便后续获取生成的 ID:
- 写法:
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) - 执行
executeUpdate()后,调用getGeneratedKeys()获取ResultSet - 遍历结果集:例如
rs.next(); long id = rs.getLong(1);
3. 正确关闭资源与异常处理
JDBC 资源(Connection、PreparedStatement、ResultSet)必须显式关闭,否则会导致连接泄漏。推荐用 try-with-resources 自动管理:
- 把
Connection、PreparedStatement(以及ResultSet,如果用了)都声明在 try 小括号内 - 捕获
SQLException,必要时包装为运行时异常(如RuntimeException)向上抛出 - 避免在 finally 块中手动 close —— try-with-resources 已确保执行
4. 完整示例代码
注意替换数据库 URL、用户名、密码及字段名:
String url = "jdbc:mysql://localhost:3306/testdb";
String sql = "INSERT INTO users(name, age, email) VALUES(?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url, "user", "pass");
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, "张三");
ps.setInt(2, 25);
ps.setString(3, "zhangsan@example.com");
int rows = ps.executeUpdate();
if (rows > 0) {
try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
System.out.println("插入成功,ID:" + rs.getLong(1));
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











