0

何が起こっているのか本当にわかりません。私は Java が初めてで、MySQL もかなり初めてです。

Java で MySQL データベースに行を挿入しようとしています。例外はスローされません。印刷すると、SELECT *更新した行が表示されます。しかし、プログラムを再度実行したり、Workbench で実行したりすると、これらの行が保持されません。

列の 1 つ (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;
}
}
4

3 に答える 3

5

これは、自動コミットを false ( con.setAutoCommit(false);) に設定したが、トランザクションをコミットしなかったためです。

コミットされていない挿入は行を格納しませんが、自動インクリメント フィールドをインクリメントします。

トランザクションが終了した後も行が残るようにするには、トランザクションをコミットする必要があります。

于 2012-11-27T03:06:49.983 に答える
2

あなたが設定したcon.setAutoCommit(false);

st.executeBatch();

追加con.commit();

于 2012-11-27T06:24:50.380 に答える
1

準備済みステートメントを使用してみてください。このようにして、DB は 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();
于 2012-11-27T03:11:22.630 に答える