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

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

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

   int insertSelective(FileAttachment record);

В моем классе дао я использую

int id = fileAttachmentMapper.insertSelective(fileAttachment);

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


person Harry    schedule 24.08.2012    source источник


Ответы (7)


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

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);

int id = fileAttachment.getId();

Что делает selectKey, так это устанавливает идентификатор в объект, который вы вставляете, в этом случае в fileAttachment в его свойстве id и ПОСЛЕ вставляется запись.

person jddsantaella    schedule 24.08.2012
comment
Я не знаю, но я доверяю моему Батису, так что я бы сказал да. - person jddsantaella; 24.08.2012

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

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

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

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

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

person Ruju    schedule 23.04.2013

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

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

useGeneratedKeys (только вставка и обновление) Это указывает MyBatis использовать метод JDBC getGeneratedKeys для извлечения ключей, сгенерированных внутри базы данных (например, поля автоматического увеличения в РСУБД, таких как MySQL или SQL Server). По умолчанию: ложь

Если вы используете xml:

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

Если вы используете аннотацию:

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

Как только вы завершите операцию вставки, будет вызван метод setId() файла FileAttachment, и ему будет присвоен идентификатор последней вставленной записи. Вы можете использовать getId() в fileAttachment, чтобы получить идентификатор последней вставки.

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

person sofia    schedule 11.03.2016

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

person Ed Solis    schedule 24.08.2012
comment
Спасибо за ответ, Эд, тогда как я могу получить этот идентификатор? - person Harry; 24.08.2012

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

person Cosmin Constantinescu    schedule 19.02.2016

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

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

person Dylan    schedule 03.03.2016

Необходимость конфигурации с 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

person julien    schedule 19.11.2018