Java语言中的增删改查操作详解
Java语言作为企业级应用开发的主流选择,其数据库操作能力尤为重要,增删改查(CRUD,Create、Read、Update、Delete)是数据库操作的核心,本文将结合JDBC(Java Database Connectivity)技术,详细说明如何在Java中实现这四种基本操作,并附关键代码示例与注意事项。

准备工作:环境配置与数据库连接
在执行增删改查操作前,需完成以下准备工作:
- 加载驱动:通过
Class.forName()加载数据库驱动(如MySQL的com.mysql.cj.jdbc.Driver)。 - 获取连接:使用
DriverManager.getConnection()建立与数据库的连接,需提供URL、用户名和密码。 - 创建Statement或PreparedStatement:
Statement:用于执行静态SQL语句,存在SQL注入风险,不推荐使用。PreparedStatement:预编译SQL语句,可防止SQL注入,支持参数化查询,优先推荐。
// 示例:MySQL数据库连接
String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
System.out.println("数据库连接成功!");
} catch (Exception e) {
e.printStackTrace();
}
增(Create):向数据库插入数据
增操作通过INSERT语句实现,使用PreparedStatement可有效防止SQL注入,步骤如下:
- 编写SQL语句,使用占位符代替参数。
- 通过
conn.prepareStatement()创建PreparedStatement对象。 - 调用
setXxx()方法为占位符赋值(setString()、setInt()等)。 - 执行
executeUpdate()方法,返回受影响的行数。
String sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "张三");
pstmt.setInt(2, 25);
pstmt.setString(3, "zhangsan@example.com");
int rows = pstmt.executeUpdate();
System.out.println("成功插入 " + rows + " 条数据");
} catch (SQLException e) {
e.printStackTrace();
}
删(Delete):从数据库删除数据
删操作通过DELETE语句实现,需注意条件筛选,避免误删数据,步骤与增操作类似:

- 编写带条件的
DELETE语句(如WHERE id = ?)。 - 设置参数并执行
executeUpdate()。
String sql = "DELETE FROM users WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 1); // 删除id为1的用户
int rows = pstmt.executeUpdate();
if (rows > 0) {
System.out.println("成功删除 " + rows + " 条数据");
} else {
System.out.println("未找到匹配的记录");
}
} catch (SQLException e) {
e.printStackTrace();
}
改(Update):修改数据库数据
改操作通过UPDATE语句实现,需明确更新字段和更新条件,关键点:
- SQL语句需包含
SET子句(指定更新字段)和WHERE子句(筛选条件)。 - 通过
setXxx()方法为占位符赋值,注意字段类型与参数类型匹配。
String sql = "UPDATE users SET age = ?, email = ? WHERE name = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 26); // 更新年龄为26
pstmt.setString(2, "zhangsan_new@example.com"); // 更新邮箱
pstmt.setString(3, "张三"); // 条件:姓名为张三
int rows = pstmt.executeUpdate();
System.out.println("成功更新 " + rows + " 条数据");
} catch (SQLException e) {
e.printStackTrace();
}
查(Read):查询数据库数据
查操作是CRUD中最复杂的部分,通过SELECT语句实现,结果需通过ResultSet处理,步骤如下:
- 编写
SELECT语句,可带条件(如WHERE、ORDER BY)。 - 创建
PreparedStatement并设置参数(若有)。 - 执行
executeQuery()方法,返回ResultSet对象。 - 遍历
ResultSet,通过getXxx()方法获取字段值(如getString()、getInt())。 - 关闭
ResultSet和PreparedStatement(建议使用try-with-resources自动关闭)。
String sql = "SELECT id, name, age, email FROM users WHERE age > ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
pstmt.setInt(1, 20); // 查询年龄大于20的用户
System.out.println("ID\t姓名\t年龄\t邮箱");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String email = rs.getString("email");
System.out.printf("%d\t%s\t%d\t%s\n", id, name, age, email);
}
} catch (SQLException e) {
e.printStackTrace();
}
事务管理:确保数据一致性
在增删改操作中,事务管理至关重要,通过Connection对象控制事务提交与回滚:

- 关闭自动提交:
conn.setAutoCommit(false); - 执行多个操作,若全部成功则提交:
conn.commit(); - 若某一步失败,则回滚:
conn.rollback();
try {
conn.setAutoCommit(false); // 开启事务
// 执行多个操作(如插入、更新)
String sql1 = "INSERT INTO orders (user_id, amount) VALUES (?, ?)";
String sql2 = "UPDATE users SET balance = balance - ? WHERE id = ?";
try (PreparedStatement pstmt1 = conn.prepareStatement(sql1);
PreparedStatement pstmt2 = conn.prepareStatement(sql2)) {
pstmt1.setInt(1, 1);
pstmt1.setDouble(2, 100.0);
pstmt1.executeUpdate();
pstmt2.setDouble(1, 100.0);
pstmt2.setInt(2, 1);
pstmt2.executeUpdate();
conn.commit(); // 提交事务
System.out.println("事务提交成功");
}
} catch (SQLException e) {
try {
conn.rollback(); // 回滚事务
System.out.println("事务回滚");
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
注意事项与最佳实践
- 资源关闭:确保
Connection、PreparedStatement、ResultSet等资源在使用后关闭,推荐使用try-with-resources语法。 - SQL注入防护:始终使用
PreparedStatement,避免拼接SQL字符串。 - 异常处理:合理捕获并处理
SQLException,避免程序因异常中断。 - 连接池优化:高并发场景下,使用数据库连接池(如HikariCP、Druid)提升性能,避免频繁创建和销毁连接。
- 事务边界:明确事务范围,避免长事务导致数据库性能下降。
通过以上步骤,Java开发者可以高效实现数据库的增删改查操作,在实际开发中,还需结合具体业务需求优化逻辑,确保代码的健壮性与可维护性。















