私は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フィールドは自動的にインクリメントされ、レコードは正しく挿入されます。
IDはオブジェクトに挿入されます:
int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);
int id = fileAttachment.getId();
selectKey
が行うことは、挿入するオブジェクトにIDを設定することです。この場合、プロパティfileAttachment
のid
に、AFTERレコードが挿入されます。
使用する必要があるのは
<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参照内ですべての戻り値を取得するためです。
実際、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を取得できます。
これがお役に立てば幸いです。
返される1は、更新/挿入されたレコードの数を示していると思います。 IDは、insertSelectiveの呼び出しに渡したfileAttachmentパラメーターに設定されていると思います。
ライターで、カスタムコンポジットライターを使用して、挿入された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フィールドの自動更新が含まれます
(1)Rujuの回答に加えて、挿入ステートメントで属性useGeneratedKeys = trueを定義する必要があり、parameterType = "object"、keyProperty = "objectId"、およびkeyColumn = "objectId"は、同じ主キー列名(objectId )オブジェクトレコードを格納するテーブルから。データベーステーブルでは、主キー列(objectId)をAUTO_INCREMENTに設定する必要があります。
(2)挿入ステートメントがトリガーされると、新しく生成された主キー(objectId)がobjectに格納され、このメソッド(object.getObjectId()またはobject.objectId)を使用してobjectIdプロパティにアクセスすることでそれを取得できます。これで、正確で新しく生成されたプライマリが得られるはずです。それは私のために働いた....