首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDBC 更新數據庫記錄實戰:部分字段更新、預處理語句與資源管理

     編輯:Java 相關知識

業務場景

用戶僅修改表單中的部分字段(如姓名、生日),後台需保持未修改字段原值,僅更新變更字段。

核心思路

  1. 根據主鍵查詢原記錄
  2. 對比前端傳入對象,null 或默認值視為「不修改」,用原值覆蓋
  3. 構建完整 UPDATE 語句,所有字段參數化
  4. 使用 PreparedStatement 防注入、提升性能

完整 DAO 實現

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);
}

工具類 JdbcUtils 關鍵點

  • 連接池管理(Druid/HikariCP)
  • 統一 free(ResultSet, Statement, Connection) 釋放資源,順序:RS → Stmt → Conn
  • 異常轉換為運行時異常或自定義異常,上層統一處理

進階優化

  • 動態 SQL:僅構建修改字段的 SET 子句,減少數據庫開銷
  • 樂觀鎖:增加 version 字段,WHERE id=? AND version=? 防止丟失更新
  • 批量更新:addBatch() + executeBatch() 提升吞吐
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved