12

私は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フィールドは自動インクリメントされ、レコードは正しく挿入されています。

4

8 に答える 8

19

ID がオブジェクトに挿入されます。

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);

int id = fileAttachment.getId();

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

于 2012-08-24T09:03:33.227 に答える
11

あなただけを使用する必要があります

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

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

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

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

于 2013-04-23T13:57:06.653 に答える
8

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

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 を取得できます。

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

于 2016-03-11T10:54:29.523 に答える
2

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

于 2012-08-24T08:04:28.587 に答える
0

ライターで、カスタム複合ライターを使用でき、そこで挿入された ID を取得できることを願っています。

于 2016-02-19T15:59:33.107 に答える
0

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

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

于 2016-03-03T19:53:54.427 に答える