获取mybatis中最后插入记录的id
Posted
技术标签:
【中文标题】获取mybatis中最后插入记录的id【英文标题】:Get the id of last inserted record in mybatis 【发布时间】:2012-08-24 05:30:32 【问题描述】:我是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 字段会自动递增,并且记录会正确插入。
【问题讨论】:
【参考方案1】:id被注入到对象中:
int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);
int id = fileAttachment.getId();
selectKey
所做的是在您要插入的对象中设置 id,在本例中是在其属性 id
中的 fileAttachment
中,并且插入了 AFTER 记录。
【讨论】:
我不知道,但我相信 myBatis,所以我会答应。【参考方案2】:你只需要使用
<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();
之所以使用fileAttachment.getId(),是因为在插入标签中定义了keyColumn="id",您将在FileAttachment的fileAttachment引用中获得所有返回值。
【讨论】:
【参考方案3】:其实MyBatis已经提供了这个功能,可以使用选项:“useGeneratedKeys”来获取最后插入的id。
这里是MyBatis的解释。(如果你想了解更详细的信息,你可以去MyBatis官方页面)。
useGeneratedKeys (insert and update only) 这告诉 MyBatis 使用 JDBC getGeneratedKeys 方法来检索数据库内部生成的键(例如 MySQL 或 SQL Server 等 RDBMS 中的自动递增字段)。默认值:假
如果您使用的是 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。
希望对你有所帮助。
【讨论】:
【参考方案4】:我认为返回的 1 是指更新/插入的记录数。我认为 id 是在您传递给 insertSelective 调用的 fileAttachment 参数上设置的。
【讨论】:
感谢 Ed 的回复,那么我该如何获取该 ID?【参考方案5】:我希望在 writer 中,您可以拥有一个自定义的复合 writer,并且您可以在其中获取插入的 id。
【讨论】:
【参考方案6】:(1) 补充如菊的回答,在插入语句中需要定义属性useGeneratedKeys=true, parameterType="object", keyProperty="objectId" and keyColumn="objectId" 应该设置相同的主键列存储对象记录的表中的名称 (objectId)。数据库表中的主键列(objectId)应设置为AUTO_INCREMENT。
(2) 当insert语句被触发时,新生成的主键(objectId)会存储在object中,你可以通过这个方法(object.getObjectId()或者object.objectId)访问objectId属性来获取它.现在这应该给出准确的和新生成的主节点。它对我有用....
【讨论】:
【参考方案7】:需要使用 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 字段的自动更新
【讨论】:
【参考方案8】:After struggling alot, I got the following solution:
Use Case: if you are using sequence for generating primary key. and you want the id inserted to db
in xml:
<insert id="createEmployee"
parameterType="com.test.EmployeeModel">
<selectKey keyProperty="employeeId" keyColumn="EMPLOYEE_ID"
resultType="Long" order="BEFORE">
select EMPLOYEE_SEQ.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO EMPLOYEE(EMPLOYEE_ID,EMPLOYEE_NAME)
VALUES
(#employeeId,jdbcType=NUMERIC,#EMPLOYEE_NAME,jdbcType=VARCHAR)
</insert>
in java side:
interface
public void createEmployee(EmployeeModel request);
in dao
getMapper().createEmployee(model);
getClient().commit();
Long employeeId= model.getEmployeeId();
System.out.println("Recent Employee Id: "+employeeId)
【讨论】:
以上是关于获取mybatis中最后插入记录的id的主要内容,如果未能解决你的问题,请参考以下文章