web-dev-qa-db-ja.com

アノテーション付きのmysqlでmybatisを使用してインサートのIDを返す方法

  • この関連する質問を参照 Postgresの場合。何らかの理由で、このソリューションは機能しません。挿入ステートメントの戻り値は常に「1」です。
  • XMLベースのソリューション については、この他の質問を参照してください。 XMLを使用せずに同じことを実行したいのですが、レコードを挿入して、挿入したばかりのレコードの新しい自動生成IDを見つけます。

<selectkey>に一致するアノテーションが見つかりませんでした(これを参照 未解決の問題 )どうすればよいですか?

Mybatisコードを調べると、INSERTUPDATEを介して実装されており、常に挿入された行の数が返されます。したがって...ここで何かが完全に欠落していない限り、現在の(3.0.3)実装を使用してこれを行う方法はありません。

16
ripper234

実際には、@Optionsアノテーションを使用してそれを行うことができます(データベースでauto_incrementまたは同様のものを使用している場合):

@Insert("insert into table3 (id, name) values(null, #{name})") 
@Options(useGeneratedKeys=true, keyProperty="idName")
int insertTable3(SomeBean myBean); 

SomeBeanのkeyプロパティの名前が「id」の場合、keyProperty="idName"の部分は必要ないことに注意してください。 MyBatisが自分で主キー列を見つけられないまれなケースのために、keyColumn属性も利用できます。また、@Optionsを使用すると、メソッドをいくつかのデフォルトパラメータに送信することに注意してください。ドキュメントを参照することが重要です(以下にリンクされています-現在のバージョンでは60ページ)!

(古い回答)(かなり最近の)@SelectKeyアノテーションは、より複雑なキー検索(シーケンス、identity()関数)に使用できます。 。)。 MyBatis 3ユーザーガイド (pdf)が例として提供しているものは次のとおりです。

この例は、@ SelectKeyアノテーションを使用して、挿入前にシーケンスから値を取得する方法を示しています。

@Insert("insert into table3 (id, name) values(#{nameId}, #{name})") 
@SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class) 
int insertTable3(Name name); 

次の例は、@ SelectKeyアノテーションを使用して、挿入後にID値を取得する方法を示しています。

@Insert("insert into table2 (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)
int insertTable2(Name name);
30
Manur

<insert><update>、および<delete>ステートメントは、データベースAPIで一般的なように、影響を受ける行の数を返します。

挿入された行に対して新しいIDが生成されると、パラメーターとして渡したオブジェクトに反映されます。したがって、たとえば、注釈付きの挿入メソッド内でmapper.insert(someObject)を呼び出す場合、挿入後にsomeObject.getId(または同様のもの)を呼び出してそれを取得できます。

<insert>のオプションを使用して、IDを生成または取得する方法(SQLステートメントを提供することにより)と時期(実際の挿入の前後)、およびオブジェクト内のどこに配置するかを微調整できます。

MyBatisジェネレーター を使用してデータベーススキーマからクラスを生成し、挿入と更新がどのように処理されるかを確認すると役立つ場合があります。具体的には、ジェネレーターは、データを渡すための一時的なコンテナーとして使用される「サンプル」クラスを生成します。

14
Daniel Novak

生成されたIDはsaveメソッドから取得できます。たとえば、IDと名前のプロパティを持つBeanなどです。

bean.setName("xxx");
mapper.save(bean);
// here is your id
logger.debug(bean.getID);
1
edwinkun