Опять большая проблема last_insert_id () - PullRequest
0 голосов
/ 06 июня 2010

Примечание. Здесь следует мой вопрос: JDBC: разрывается ли соединение, если я теряю ссылку на объект соединения?

Теперь у меня есть созданный класс, чтобы я мог легко работать с JDBC для остальной части моего кода -

public class Functions {
    private String DB_SERVER = "";
    private String DB_NAME = "test";
    private String DB_USERNAME = "root";
    private String DB_PASSWORD = "password";

    public  Connection con;
    public  PreparedStatement ps;
    public  ResultSet rs;
    public  ResultSetMetaData rsmd;

    public void connect()
            throws java.io.FileNotFoundException, java.io.IOException,
            SQLException, Exception    {
        String[] dbParms = Parameters.load();

        DB_SERVER = dbParms[0];
        DB_NAME = dbParms[1];
        DB_USERNAME = dbParms[2];
        DB_PASSWORD = dbParms[3];

        // Connect.
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        con = DriverManager.getConnection("jdbc:mysql://"
                + DB_SERVER + "/"
                + DB_NAME, DB_USERNAME, DB_PASSWORD);
    }

    public void disconnect() throws SQLException  {
        // Close.
        con.close();
    }
}

Как видно Parameters.load() обновляет параметры соединения из файла каждый раз, так что любые изменения к нему могут быть применены к следующему непосредственному соединению.

Пример этого класса в действии -

public static void add(String NAME)
        throws java.io.FileNotFoundException, java.io.IOException, SQLException, Exception    {
    Functions dbf = new Functions();
    dbf.connect();

    String query = "INSERT INTO " + TABLE_NAME + "(" +
            "NAME" +
            ") VALUES(?)";
    PreparedStatement ps = dbf.con.prepareStatement(query);
    ps.setString(1, NAME);
    ps.executeUpdate();

    dbf.disconnect();
}

Теперь вот проблема - для добавления записи в таблицу выше метод add() откроет соединение, добавит запись - и затем вызовет disconnect().

Что делать, если я хочу получить идентификатор вставленной записи после того, как позвоню add(), например:

Department.add("new dept");
int ID = getlastID();

Не возможно ли, чтобы между этими двумя операторами был вызван другой метод add ()?

Ответы [ 2 ]

1 голос
/ 06 июня 2010

Это возможно .. вы можете подумать о рефакторинге вашего кода.

Детские шаги, получить и сохранить идентификатор в переменной внутри вашего метода add перед закрытием соединения, изменить подпись и вернуть идентификатор.

0 голосов
/ 06 июня 2010

Неважно, будет ли выполняться другое добавление между операторами, если вы сохраняете свое соединение открытым. Функция last_insert_id получает последний идентификатор, созданный в том же сеансе базы данных, то есть с использованием того же соединения.

Итак, вы должны изменить свой код, чтобы не закрывать его, и снова открыть соединение между добавлением записи и получением идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...