2012-11-27 63 views
0

我真的不知道發生了什麼事。我是Java的新手,對於MySQL來說相當新穎。實際上並沒有插入MySQL,但自動增加字段正在增加?

我想在Java中插入行到MySQL數據庫。它不會拋出任何例外,並且當我打印出SELECT *時,它會顯示我更新的行。但是當我再次運行該程序或在Workbench中時,這些行不會停留。

其中一列(pk)是一個自動遞增的字段。該字段正在遞增,但數據不存在。

當我通過Workbench添加數據時,它會粘住,我可以在我的Java程序中檢索它,當我執行SELECT *時。只有當我通過下面的代碼添加它時,數據似乎消失了。

這是代碼。我也跟着教程:

import java.sql.*; 

public class SaveMap { 
public static boolean MapSave(String mapName) { 
    Connection con = null; 
    Statement st = null; 
    ResultSet rs = null; 

    String url = "jdbc:mysql://127.0.0.1:3306/"; 
    String db = "game_Maps"; 
    String driver = "com.mysql.jdbc.Driver"; 
    String user = "root"; 
    String pass = "pass"; 

    try { 
     Class.forName(driver); 
     con = DriverManager.getConnection(url + db, user, pass); 
     con.setAutoCommit(false); 

     st = con.createStatement(); 

     System.out.println(st.executeUpdate("INSERT INTO Maps (mapName, mapSize) VALUES('DB Test', 5)")); 
     st.executeBatch(); 



     String sql = "SELECT * FROM Maps"; 
     rs = st.executeQuery(sql); 

     System.out.println("No \t Name"); 
     while(rs.next()){ 
      System.out.println(rs.getString(1) + " \t"); 
      System.out.println(rs.getString(2) + " \t"); 
      System.out.println(rs.getString(3) + " \t"); 
     } 

     rs.close(); 
     st.close(); 
     con.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return true; 
} 
} 

回答

5

這是因爲你設置自動提交爲false(con.setAutoCommit(false);),但沒有提交事務。

非comitted插入不存儲行,但他們增加自動增量字段。

您需要在事務結束後提交要保留的行的事務。

+0

衛生署,我覺得自己像個白癡。我不確定這是什麼意思,並開始查看它,但忘了。謝謝。 – Blanky

1

嘗試使用預準備語句 - 這樣您的數據庫就可以防止sql注入。像這樣的東西(修復你的價值觀):

 Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     Connection con = (Connection) DriverManager.getConnection(DBurl, user, password); 
     String read = "INSERT INTO Maps (mapName, mapSize) VALUES(?, ?)" 
     PreparedStatement p = (PreparedStatement) con.prepareStatement(read); 
     p.setString(1, "DB Test"); 
     p.setInt(2, 5); 
     p.executeUpdate(); 
     long insertId = p.getLastInsertID(); 
     con.close(); 
2

設置con.setAutoCommit(false);

st.executeBatch();

之後添加con.commit();