首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JDBC 向 MySQL 插入資料無反應:未提交事務或表名拼寫錯誤,檢查 executeUpdate 返回值與自動提交設定

     編輯:程式設計疑難解答

代碼執行無報錯但資料庫無資料,常見三大原因:

1. 表名拼寫錯誤


String sql = "insert into `uesr`(name) values('小蔡')"; // uesr → 應為 user

MySQL 若表不存在會拋錯,但若用反引號包裹錯誤名稱,某些版本/配置下可能不報錯?**實際上會報 Table 'db.uesr' doesn't exist**,所以這行應會拋異常。請確認 catch 區有無吞掉異常(`e.printStackTrace()` 有輸出嗎?)。

2. 未提交事務

預設 `Connection` 自動提交為 `true`,但若被框架/連線池設為 `false`,需手動 `conn.commit()`。建議顯式控制:


conn.setAutoCommit(false);
try {
    int rows = sta.executeUpdate(sql);
    System.out.println("影響行數: " + rows); // 關鍵:印出返回值
    conn.commit();
} catch (Exception e) {
    conn.rollback();
    throw e;
}

3. 主鍵衝突/唯一索引衝突被靜默忽略

若 `name` 有唯一索引且 '小蔡' 已存在,`executeUpdate` 拋 `SQLIntegrityConstraintViolationException`,catch 印堆疊應可見。

診斷步驟

  1. 在 `executeUpdate` 後 `System.out.println(sta.executeUpdate(sql));` **印出返回值**(1=成功,0=無影響)。
  2. 確認 `catch` 區 `e.printStackTrace()` 有輸出到控制台/日誌。
  3. 直接在 MySQL 客戶端跑同樣 SQL 驗證表名、欄位、編碼。
  4. 檢查 `my.ini` `character-set-server=utf8mb4` 避免中文亂碼導致靜默失敗。

最可能:**表名 `uesr` 拼錯**,或 **事務未提交**。加上 `println(rows)` 立見分曉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved