获取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的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis中插入记录后获取该条记录ID

Mybatis获取插入记录的自增长ID

MyBatis获取插入记录的自增长字段值

获取mybaties插入记录自动增长的主键值

mybatis如何获取oracle新插入数据记录的主键?

Mybatis获取插入记录主键