-1

ソースコードの構造は次のとおりです。

SourceFolder
AddProduct.jsp
ソース パッケージ
-コントローラー(サーブレット)
SaveProduct.java
-モデル(DB 操作)
ProductDbOperations.java

製品テーブルに新しい製品を挿入すると同時に、product_collectionテーブル (product_id | collection_id) にエントリを挿入しています。

product_collectionテーブルにエントリを挿入するには、製品テーブルから生成された ID を取得する必要があります。その後、product_collectionテーブルに新しいエントリが挿入されます。

また、私はフレームワークを使用しておらず、Netbeans 7.3 を使用しています。

問題:

このコードを使用して、製品テーブルに新しいエントリが挿入されます

IN: ProductDbOperations.java

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

}

また、次のリンクのソリューションも使用しましたが、うまくいきません。SQL 例外はありませんでした

JDBCで挿入IDを取得するには?

このコードが機能しない理由を見つけるのを手伝ってください。どうもありがとう。

4

3 に答える 3

8

getGeneratedKeys()リンクされた回答に示されているように、すべてのドライバーが のバージョンをサポートしているわけではありません。ただし、ステートメントを準備するときに、「フラグ」の代わりに返される列のリストを渡すこともできます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"}

于 2013-09-19T09:56:32.307 に答える
2

あなたが使用している方法は、準備されたステートメントを使用する適切な方法ではありません

次の方法を使用します

    pst = cn.prepareStatement("INSERT INTO product values(?,?,?)");
pst.setString(1,name);
pst.setInt(2,quantity);
pst.setInt(3,price);
pst.executeUpdate();
于 2013-09-19T09:50:34.287 に答える
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);
于 2013-09-19T09:59:14.673 に答える