上一篇
Java中更新数据使用SQL的UPDATE语句,通过JDBC或ORM框架执行,基本语法:
UPDATE 表名 SET 列1=值1,列2=值2 WHERE 条件,需注意防止SQL注入,推荐使用PreparedStatement设置参数化查询。
原生JDBC更新操作(基础但重要)
通过PreparedStatement防止SQL注入,确保安全性:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class JdbcUpdateExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 使用占位符?避免SQL注入
String sql = "UPDATE users SET email = ?, age = ? WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数(索引从1开始)
pstmt.setString(1, "new_email@example.com"); // 新邮箱
pstmt.setInt(2, 30); // 新年龄
pstmt.setInt(3, 1001); // 目标用户ID
// 执行更新,返回受影响行数
int affectedRows = pstmt.executeUpdate();
System.out.println("更新成功,影响行数: " + affectedRows);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
关键点:
- 始终用
PreparedStatement替代Statement,防止反面SQL注入 setXxx()方法自动处理数据类型和特殊字符转义- 使用try-with-resources自动关闭资源,避免内存泄漏
MyBatis框架更新操作(企业级常用)
通过XML或注解实现,提升可维护性:
XML映射文件方式
Mapper接口:
public interface UserMapper {
int updateUser(User user); // 返回受影响行数
}
XML配置(UserMapper.xml):

<update id="updateUser">
UPDATE users
SET
username = #{username},
email = #{email},
age = #{age}
WHERE id = #{id}
</update>
注解方式(简洁场景适用)
@Update("UPDATE users SET status = #{status} WHERE id = #{userId}")
int updateUserStatus(@Param("userId") int id, @Param("status") String status);
执行更新:
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(1001, "张三", "zhangsan@new.com", 30);
int count = mapper.updateUser(user);
session.commit(); // 提交事务
}
Hibernate/JPA更新操作(面向对象)
通过实体管理实现对象化操作:
直接更新托管实体
@Entity
public class User {
@Id
private Long id;
private String email;
private int age;
// Getter/Setter省略
}
// 更新代码
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
User user = em.find(User.class, 1001L); // 加载托管实体
user.setEmail("updated@example.com"); // 修改属性
user.setAge(28);
em.getTransaction().commit(); // 自动生成UPDATE语句
HQL语句更新
Query query = em.createQuery(
"UPDATE User u SET u.age = :newAge WHERE u.id = :userId"
);
query.setParameter("newAge", 30);
query.setParameter("userId", 1001L);
int rows = query.executeUpdate(); // 返回受影响行数
安全与性能最佳实践
-
防SQL注入

- 禁止拼接SQL:
"UPDATE ... WHERE id=" + userInput - 统一使用预编译(JDBC/ORM框架已内置)
- 禁止拼接SQL:
-
事务控制
try { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个更新操作... conn.commit(); // 成功则提交 } catch (SQLException e) { conn.rollback(); // 失败回滚 } -
批量更新优化
try (PreparedStatement pstmt = conn.prepareStatement(sql)) { for (User user : userList) { pstmt.setString(1, user.getEmail()); pstmt.setInt(2, user.getId()); pstmt.addBatch(); // 加入批处理 } int[] counts = pstmt.executeBatch(); // 一次执行 } -
连接池配置

使用Druid、HikariCP等连接池,避免频繁创建连接
技术选型建议
| 场景 | 推荐方案 | 优势 |
|---|---|---|
| 简单脚本/小型项目 | JDBC | 无依赖,轻量快速 |
| 中型企业应用 | MyBatis | SQL灵活可控,易于优化 |
| 复杂领域模型 | Hibernate/JPA | 对象化操作,减少样板代码 |
更新操作的核心原则:安全性 > 数据一致性 > 性能,无论何种方案,务必通过单元测试验证边界条件(如空值、并发冲突)。
引用说明:
本文代码示例基于以下技术版本:
- JDBC: MySQL Connector/J 8.0
- MyBatis: 3.5.10
- Hibernate: 6.4.4.Final
官方文档参考:Oracle JDBC Tutorial, MyBatis Guide, Hibernate ORM
