14

iBatis/Java と Postgres 8.3 を使用しています。Ibatis で挿入を行うときは、ID を返す必要があります。
次の表を使用して質問を説明します
CREATE TABLE sometable ( id serial NOT NULL, somefield VARCHAR(10) );
。シーケンスsometable_id_seqは、create ステートメントを実行することによって自動生成されます。

現時点では、次のSQLマップを使用しています:

<insert id="insertValue" parameterClass="string" >
 INSERT INTO sometable ( somefield ) VALUES ( #value# );
 <selectKey keyProperty="id" resultClass="int">
  SELECT last_value AS id FROM sometable_id_seq
 </selectKey>
</insert>

これは、新しく挿入された ID を取得する ibatis の方法のようです。Ibatis は最初に INSERT ステートメントを実行し、その後シーケンスに最後の ID を要求します。
これが多くの同時挿入で機能するかどうかは疑問です。(この質問で説明)

ibatis で次のステートメントを使用したいと思います。
INSERT INTO sometable ( somefield ) VALUES ( #value# ) RETURNING id;

しかし、sqlMap内で使用しようとすると、<insert>ibatisはIDを返しません。<selectKey>タグが必要なようです。

だからここに質問があります:

上記のステートメントを ibatis で使用するにはどうすればよいですか?

4

2 に答える 2

16

要素は要素の<selectKey>子であり<insert>、そのコンテンツはメインステートメントの前に実行されます。INSERT2 つの方法を使用できます。

レコードを挿入した後にキーをフェッチする

このアプローチは、ドライバーによって異なります。これでは、スレッド化が問題になる可能性があります。

レコードを挿入する前にキーを取得する

このアプローチは、スレッド化の問題を回避しますが、より多くの作業が必要になります。例:

<insert id="insert">
  <selectKey keyProperty="myId"
             resultClass="int">
    SELECT nextVal('my_id_seq')
  </selectKey>
  INSERT INTO my
    (myId, foo, bar)
  VALUES
    (#myId#, #foo#, #bar#)
</insert>

Java側では、次のことができます

Integer insertedId = (Integer) sqlMap.insert("insert", params)

my_id_seqこれにより、シーケンスから選択されたキーが得られます。

于 2009-11-20T11:08:13.237 に答える
10

簡単な例を次に示します。

<statement id="addObject"
        parameterClass="test.Object"
        resultClass="int">
        INSERT INTO objects(expression, meta, title,
        usersid)
        VALUES (#expression#, #meta#, #title#, #usersId#)
        RETURNING id
</statement>

そしてJavaコードでは:

Integer id = (Integer) executor.queryForObject("addObject", object);
object.setId(id);

この方法は、使用するよりも優れています:

  1. もっと簡単です。
  2. シーケンス名 (通常、postgresql 開発者には隠されているもの) を知ることは要求されていません。
于 2009-12-03T20:12:18.180 に答える