用戶僅修改表單中的部分字段(如姓名、生日),後台需保持未修改字段原值,僅更新變更字段。
null 或默認值視為「不修改」,用原值覆蓋UPDATE 語句,所有字段參數化PreparedStatement 防注入、提升性能public class UserDaoJdbcImpl implements UserDao {
@Override
public void update(User u) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "UPDATE user SET name=?, birthday=?, money=? WHERE id=?";
ps = conn.prepareStatement(sql);
// 1. 獲取原記錄
User original = getUserById(u.getId());
// 2. 合併字段
if (u.getName() == null) u.setName(original.getName());
if (u.getBirthday() == null) u.setBirthday(original.getBirthday());
if (u.getMoney() == 0) u.setMoney(original.getMoney()); // 假設 0 為未修改標記
// 3. 設置參數
ps.setString(1, u.getName());
ps.setDate(2, new java.sql.Date(u.getBirthday().getTime()));
ps.setDouble(3, u.getMoney());
ps.setInt(4, u.getId());
// 4. 執行
int rows = ps.executeUpdate();
System.out.println("成功更新 " + rows + " 條記錄");
} catch (SQLException e) { e.printStackTrace(); }
finally { JdbcUtils.free(rs, ps, conn); }
}
@Override
public User getUserById(int id) {
// 標準查詢邏輯,返回 User 對象
}
}
public static void main(String[] args) {
UserDao dao = new UserDaoJdbcImpl();
User u = new User();
u.setId(9);
u.setName("先生"); // 僅修改姓名和生日
try {
u.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1999-9-14"));
} catch (ParseException e) { e.printStackTrace(); }
// u.setMoney(1234); // 不修改金額
dao.update(u);
}
free(ResultSet, Statement, Connection) 釋放資源,順序:RS → Stmt → ConnSET 子句,減少數據庫開銷version 字段,WHERE id=? AND version=? 防止丟失更新addBatch() + executeBatch() 提升吞吐