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

一致する注釈が見つかりませんでした<selectkey>(この未解決の問題を参照してください)。

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

4

4 に答える 4

32

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

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

keyProperty="idName"SomeBean の key プロパティの名前が「id」の場合、この部分は不要であることに注意してください。keyColumnMyBatis が自分で主キー列を見つけられないまれなケースのために、利用可能な属性もあります。@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);
于 2011-06-23T13:31:48.697 に答える
16

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

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

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

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

于 2010-11-30T14:10:22.513 に答える
2

保存メソッドから生成された ID を取得できます。たとえば、ID と名前のプロパティを持つ Bean を考えてみましょう。

bean.setName("xxx");
mapper.save(bean);
// here is your id
logger.debug(bean.getID);
于 2010-12-13T09:24:15.547 に答える