Получить идентификатор последней вставленной записи в mybatis

Я новичок в mybatis. Я пытаюсь получить идентификатор последней вставленной записи. Моя база данных-mysql, а мой xml mapper -

  <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" должен возвращать идентификатор последней вставленной записи, но я всегда получаю 1 после вставки записи.

мой маппер.класс java у меня есть метод

   int insertSelective(FileAttachment record);

в моем классе dao я использую

int id = fileAttachmentMapper.insertSelective (fileAttachment);

Я получаю значение Id всегда 1 при вставке новой записи. мое поле Id автоматически увеличивается, и записи вставляются правильно.

6 ответов


идентификатор вводится в объект:

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);

int id = fileAttachment.getId();

что selectKey does-установить идентификатор в объекте, который вы вставляете, в этом случае в fileAttachment в ее собственность id и после записи.


вам нужно использовать

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

нет необходимости выполнять запрос select внутри тега insert в MyBatis. Он предоставляет вам новый параметр для операции вставки.Здесь определите useGeneratedKeys= "true", keyProperty=" id", keyColumn="id".Вы можете повторить значение для id следующим образом

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

fileAttachment.getId () используется, потому что в insert tag keyColumn="id" определяется, и вы получите все возвращаемые значения внутри ссылки fileAttachment FileAttachment.


на самом деле, MyBatis уже предоставил эту функцию.Вы можете использовать опцию: "useGeneratedKeys", чтобы получить последний идентификатор вставки.

вот объяснение от MyBatis.(Если вы хотите узнать более подробную информацию, вы можете перейти на официальную страницу MyBatis).

useGeneratedKeys (только вставка и обновление) это говорит MyBatis использовать метод jdbc getGeneratedKeys для извлечения ключей, генерируемых внутри базы данных (например, поля автоматического приращения в СУБД, таких как MySQL или SQL Server). По умолчанию: 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() чтобы получить последний идентификатор вставки.

Я надеюсь, что это поможет вам.


Я думаю, что 1, который возвращается, относится к числу записей, которые обновляются/вставляются. Я думаю, что идентификатор установлен в параметре fileAttachment, который вы передали вызову insertSelective.


Я надеюсь, что в writer вы можете иметь пользовательский составной писатель, и там вы можете получить вставленные идентификаторы.


(1) добавляя к ответу Руджу, в инструкции insert вам нужно определить атрибут useGeneratedKeys=true, parameterType="object", keyProperty="objectId" и keyColumn="objectId" должны быть установлены с тем же именем столбца первичного ключа (objectId) из таблицы, в которой хранится запись объекта. Столбец первичного ключа (objectId) должен иметь значение AUTO_INCREMENT в таблице базы данных.

(2) при срабатывании инструкции insert новый сгенерированный первичный ключ (objectId) будет хранится в объекте, и u может получить его, обратившись к свойству objectId с помощью этих методов (object.getObjectId() или объект.аргумент objectid.) Теперь это должно дать точный и новый сгенерированный primary. У меня получилось....