涉及的 MySQL Connector/J 的版本是MySQL網站上提供的最新的 5.1.7 這個版本。
問題是這樣的,假設表中有自動增長的字段id,我們在插入數據的時候,可以通過 ResultSet rs = ps.getGeneratedKeys() 這樣的代碼來獲取到所插入數據產生的id值。這個方法在 5.1.7 之前的任何一個版本都是可行的,但在 5.1.7 這個版本就會拋出一個異常:
java.sql.SQLException: !Statement.GeneratedKeysNotRequested!
也就是相當於幾乎所有的插入語句都會出錯,昨天晚上我更新了 oschina 的 jdbc 驅動到 5.1.7 這個版本,就沒有測試數據的插入,結果早上發佈數據的時候出現了上面這個提示。
在 MySQL 網站上查到了這個問題的bug說明,在 5.1.7 版本的驅動中,如果要使用 getGeneratedKeys 這個方法的前提是你不能使用 PreparedStatement ,而必須用 Statement 來替代,而且還要增加一個參數如下:
Statement stmt =connection.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.executeUpdate("INSERT INTO table values(1,2)",Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys(); //This works
這簡直是扯淡嘛!!!所以唯一的解決辦法就是不要用 5.1.7 這個版本。