MyBatis,如何获取插入的自动生成密钥?[MySql]

2022-09-01 02:23:05

如何使用MyBatis获取插入物的生成密钥?我阅读了许多关于这个问题的页面,但我仍然被封锁了,任何人都可以帮我吗?这是我的代码:

该表:

ID_ERROR long primary key
DATE timestamp
TYPE varchar
MESSAGE varchar
SOURCE varchar

道:

Long returnedId = 0L;
MyMapper myMapper = this.sqlSession.getMapper(MyMapper.class);
myMapper.insertRecord(returnedId, Utils.now(), t.getClass().getName(), t.getMessage(), c.getName());
return returnedId;

映射器.java:

public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source);

映射器.xml

 <insert id="insertRecord" parameterType="map" useGeneratedKeys="true"  keyProperty="ID_ERROR">
    INSERT INTO errors (
        DATE,
        TYPE,
        MESSAGE,
        SOURCE
    )
    VALUES (
        #{timestamp},
        #{type},
        #{message},
        #{source}
    )
    <selectKey resultType="long" order="AFTER" keyProperty="returnedId">
        SELECT LAST_INSERT_ID() as returnedId
    </selectKey>
</insert>

怎么了?如何获取此插入内容的生成密钥?谢谢!


答案 1

对我来说,它的工作原理是这样的(mybatis 3.x)。必须在 mysql 表中设置 id 自动递增

<insert id="createEmpty" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
    INSERT INTO PROJECT (TITLE,DESCRIPTION)
    VALUES
    (#{title},#{description})
</insert>

注意keyProperty="project.projectId"useGeneratedKeys="true"

我的界面是:

public int createEmpty(@Param("project") Project project, @Param("title") String title,
    @Param("description") String description);

最后要获取值(将自动分配给 pojo 的 id 属性),我使用:

projectRepository.createEmpty(p, "one", "two");
System.err.print(p.getProjectId() + "\n");

答案 2

您可以通过两种方式实现这一目标,

  1. 通过使用useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty引用 POJO 变量名称,并引用数据库中生成的列名keyColumn

  2. 通过使用内部插入标记<selectKey/>