Получить идентификатор последней вставленной записи в 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. У меня получилось....