web-dev-qa-db-ja.com

mybatisに最後に挿入されたレコードのIDを取得します

私はmybatisの初心者です。最後に挿入されたレコードのIDを取得しようとしています。私のデータベースはmysqlであり、私のマッパーxmlは

  <insert id="insertSelective"  parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" >
  <selectKey resultType="Java.lang.Long" keyProperty="id" order="AFTER" >
  SELECT LAST_INSERT_ID() as id
</selectKey>
 insert into fileAttachment
<trim prefix="(" suffix=")" suffixOverrides="," >
  <if test="name != null" >
    name,
  </if>
  <if test="attachmentFileSize != null" >
    size,
  </if>      
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
  <if test="name != null" >
    #{name,jdbcType=VARCHAR},
  </if>
 <if test="attachmentFileSize != null" >
    #{attachmentFileSize,jdbcType=INTEGER},
  </if>
 </trim>
 </insert>

ここに記述されたステートメント 'SELECT LAST_INSERT_ID()as id'は、最後に挿入されたレコードのIDを返す必要があると思いましたが、レコードを挿入した後、常に1になります。

私のmapper.Javaクラス私はメソッドを持っています

   int insertSelective(FileAttachment record);

私のdaoクラスで使用しています

int id = fileAttachmentMapper.insertSelective(fileAttachment);

新しいレコードが挿入されると、Idの値は常に1になります。 Idフィールドは自動的にインクリメントされ、レコードは正しく挿入されます。

11
Harry

IDはオブジェクトに挿入されます:

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);

int id = fileAttachment.getId();

selectKeyが行うことは、挿入するオブジェクトにIDを設定することです。この場合、プロパティfileAttachmentidに、AFTERレコードが挿入されます。

19
jddsantaella

使用する必要があるのは

  <insert id="insert" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 

MyBatisの挿入タグ内でselectクエリを実行する必要はありません。挿入操作の新しいパラメーターを提供します。ここで、useGeneratedKeys = "true"、keyProperty = "id"、keyColumn = "id"を定義します。次の方法でidの値を取得できます。

  FileAttachment fileAttachment=fileAttachmentMapper.insertSelective(fileAttachment);
  Integer id=fileAttachment.getId();

fileAttachment.getId()が使用されるのは、挿入タグでkeyColumn = "id"が定義されており、FileAttachmentのfileAttachment参照内ですべての戻り値を取得するためです。

11
Ruju

実際、MyBatisはすでにこの機能を提供しています。オプション「useGeneratedKeys」を使用して、最後の挿入IDを取得できます。

これがMyBatisからの説明です(より詳細な情報が必要な場合は、MyBatisの公式ページにアクセスしてください)。

useGeneratedKeys(挿入および更新のみ)これは、データベースによって内部的に生成されたキーを取得するためにJDBC getGeneratedKeysメソッドを使用するようにMyBatisに指示します(たとえば、MySQLやSQL ServerなどのRDBMSの自動インクリメントフィールド)。デフォルト:false

Xmlを使用している場合:

<insert id="" parameterType="" useGeneratedKeys="true">

注釈を使用している場合:

@Insert("your sql goes here")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insert(FileAttachment fileAttachment) throws Exception;

挿入操作が完了すると、fileAttachmentのsetId()メソッドが呼び出され、最後に挿入されたレコードのIDに設定されます。 fileAttachmentのgetId()を使用して、最後の挿入IDを取得できます。

これがお役に立てば幸いです。

6
sofia

返される1は、更新/挿入されたレコードの数を示していると思います。 IDは、insertSelectiveの呼び出しに渡したfileAttachmentパラメーターに設定されていると思います。

2
Ed Solis

ライターで、カスタムコンポジットライターを使用して、挿入されたIDを取得できることを願っています。

CodeGeneratorでの構成の必要性:

 <table schema="catalogue" tableName="my_table" >
        <generatedKey column="my_table_id" sqlStatement="JDBC" identity="true" />
        <columnOverride column="my_table_id" isGeneratedAlways="true"/>
    </table>

http://www.mybatis.org/generator/configreference/generatedKey.html

コード生成後、挿入にはidフィールドの自動更新が含まれます

0
julien

(1)Rujuの回答に加えて、挿入ステートメントで属性useGeneratedKeys = trueを定義する必要があり、parameterType = "object"、keyProperty = "objectId"、およびkeyColumn = "objectId"は、同じ主キー列名(objectId )オブジェクトレコードを格納するテーブルから。データベーステーブルでは、主キー列(objectId)をAUTO_INCREMENTに設定する必要があります。

(2)挿入ステートメントがトリガーされると、新しく生成された主キー(objectId)がobjectに格納され、このメソッド(object.getObjectId()またはobject.objectId)を使用してobjectIdプロパティにアクセスすることでそれを取得できます。これで、正確で新しく生成されたプライマリが得られるはずです。それは私のために働いた....

0
Dylan