12

我是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 字段自动递增,并且记录正确插入。

4

8 回答 8

19

id 被注入到对象中:

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment);

int id = fileAttachment.getId();

所做的是在您selectKey要插入的对象中设置 id,在这种情况下,fileAttachment在其属性中id并插入 AFTER 记录。

于 2012-08-24T09:03:33.227 回答
11

你只需要使用

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

MyBatis 中的插入标签内无需执行选择查询。它为您提供了插入操作的新参数。这里定义 useGeneratedKeys="true", keyProperty="id", keyColumn="id"。您可以通过以下方式检索 id 的值

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

使用 fileAttachment.getId() 是因为在插入标签中定义了 keyColumn="id",您将在 FileAttachment 的 fileAttachment 引用中获得所有返回值。

于 2013-04-23T13:57:06.653 回答
8

其实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。

我希望这会对你有所帮助。

于 2016-03-11T10:54:29.523 回答
2

我认为返回的 1 是指更新/插入的记录数。我认为 id 是在您传递给 insertSelective 调用的 fileAttachment 参数上设置的。

于 2012-08-24T08:04:28.587 回答
0

我希望在编写器中,您可以拥有一个自定义复合编写器,并且在那里您可以获得插入的 ID。

于 2016-02-19T15:59:33.107 回答
0

(1)添加到Ruju的答案,在插入语句中,您需要定义属性useGeneratedKeys = true,parameterType =“object”,keyProperty =“objectId”和keyColumn =“objectId”应该设置为相同的主键列名称(objectId ) 来自存储对象记录的表。主键列 (objectId) 应在数据库表中设置为 AUTO_INCREMENT。

(2) 当insert语句被触发时,新生成的主键(objectId)会存储在object中,你可以通过objectId(object.getObjectId()或object.objectId)这个方法访问objectId属性来获取它。现在这应该给出准确的和新生成的主节点。它对我有用....

于 2016-03-03T19:53:54.427 回答
0

需要使用 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 字段的自动更新

于 2018-11-19T11:31:25.310 回答
0
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)
于 2021-03-10T06:31:44.553 回答