2013-09-19 7 views
-1

Мой исходный код имеет следующую структуру:Как получить сгенерированный идентификатор вставки в JDBC?

SourceFolder
AddProduct.jsp
Исходные пакеты
- контроллер (сервлеты)
SaveProduct.java
- Модель (Db Операции)
ProductDbOperations.java

Я вставляю новый продукт в таблицу продуктов и в то же время добавляю запись в product_collection table (product_id | collection_id).

Чтобы вставить запись в таблицу product_collection мне нужно получить сгенерированный идентификатор из продукта таблицы. После этого в таблицу product_collection вставлена ​​новая запись.

Кроме того, я не использую никакой Framework и использую Netbeans 7.3.

Проблема:

Новая запись вставляется в таблицу продукта с этой частью кода

В : ProductDbOperations.java

try 
{ 
    this.initConnection(); // Db connection 
    pst = cn.prepareStatement("INSERT INTO product values('"+name+"', "+quantity+", "+price+")"); 
    rs = pst.executeUpdate(); 
} 
catch(SQLException ex) 
{ 

} 

Я также использовал решение по следующей ссылке, которая не работает для меня. я не получил каких-либо исключений SQL

How to get the insert ID in JDBC?

так помочь мне выяснить, почему этот код не работает для меня. Спасибо, миллион.

+3

Как вы знаете, вы не получите SQLException, улов блок пуст? Также вы попробовали метод getGeneratedKeys()? – Kayaman

+1

Что означает «не работает для меня»? Что происходит? По крайней мере, распечатайте трассировку стека в блоке catch: 'catch (SQLException ex) {ex.printStackTrace(); } ' – Jesper

+0

@Kayaman Фактически Код очень большой, поэтому позвольте мне объяснить .. i m используя переменную состояния типа String, чтобы получить исключение как строку и функцию, возвращает строку, такую ​​как status = ex.toString(); после попытки захватить блок статус возврата; –

ответ

6

Не все драйверы поддерживают версию getGeneratedKeys(), как показано в связанном ответ. Но при подготовке заявления вы также можете передать список столбцов, которые должны быть возвращены, вместо «flag» Statement.RETURN_GENERATED_KEYS (и прохождение имен столбцов более надежно работает по моему опыту)

Дополнительно: как правильно указал javaBeginner, ваше использование подготовленного заявления неверно. То, как вы это сделаете, все равно оставит вас широко открытыми для SQL-инъекций.

// run the INSERT 
String sql = "INSERT INTO product values(?,?,?)"; 
pst = cn.prepareStatement(sql, new String[] {"PRODUCT_ID"}); 
pst.setString(1, name); 
pst.setInt(2, quantity); 
pst.setInt(3, price); 
pst.executeUpdate(); 

// now get the ID: 
ResultSet rs = pst.getGeneratedKeys(); 
if (rs.next()) { 
    long productId = rs.getLong(1); 
} 

Обратите внимание, что имя столбца, переданное на вызов, чувствительно к регистру. Для Oracle имена столбцов обычно прописные. Если вы используете, например,Postgres вам, скорее всего, нужно будет пройти new String[] {"product_id"}

+0

Пожалуйста, объясните, почему вы использовали этот новый String [] {"PRODUCT_ID"} Массив строки –

+0

Хорошо, что вы предоставили хорошее объяснение. Благодарю. –

+0

PLS скажите мне, почему System.out.println(); не работает для меня. Есть идеи? –

2

, как вы используете это не правильный способ использования PreparedStatement

использовать следующим образом

pst = cn.prepareStatement("INSERT INTO product values(?,?,?)"); 
pst.setString(1,name); 
pst.setInt(2,quantity); 
pst.setInt(3,price); 
pst.executeUpdate(); 
+0

@javaBegginer Мне нужен сгенерированный идентификатор из таблицы продуктов. –

+1

Хотя это очень хороший совет, он не охватывает реальную проблему: как получить сгенерированный ключ. –

+0

Можете ли вы сказать, почему использование (?,?,?) Для значений полезно для вставки или обновления. –

0

Да, есть способ получить ключ, вставленный SQL. Вы можете сделать это: Использование Statement.RETURN_GENERATED_KEYS в предыдущей вставке и получить ключ, который может быть использован в дальнейшем вставить

например:

String query = "INSERT INTO Table (Col2, Col3) VALUES ('S', 50)"; 
Statement stmt = con.createStatement(); 
int count = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); 
+0

Что означает «SQL u»? –

+0

Только ошибка типографии ...... Да, есть способ получить ключ, вставленный SQL, и вы можете сделать это ..... ..... – Vihar

+1

Я отредактировал ваш ответ, пожалуйста, используйте фактические слова и не сокращайте на отдельные буквы, такие как u (вы) и b (be), это затрудняет чтение вашего ответа. –

Смежные вопросы