问题描述
数据库采用的是postgresql,以下面的rule表为例,该表的id设置为自增,那么经常有这样的需求,在执行insert操作后,紧接着需要获取该记录的自增id往中间表中插入数据,或者是再根据id做一些查询之类的。
解决办法
以下两种方法效果一致
1、采用selectKey做一个子查询,赋值给属性id,并设置order=“AFTER”让其是在INSERT之后再执行,这样才能获取到自增id。mapper代码如下。需要注意的是,这里的resultType要跟Rule实体中id的类型一致,否则会报错。
<insert id="insert" parameterType="com.yealink.ptms.pojo.Rule" >
<selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
SELECT currval('rule_id_seq')
</selectKey>
INSERT INTO rule (name, used_dimension)
VALUES (
#{name, jdbcType=VARCHAR},
#{usedDimension, jdbcType=OTHER, typeHandler=com.yealink.ptms.typeHandler.JSONTypeHandlerPg}
)
</insert>
2、采用useGeneratedKeys和keyProperty。useGeneratedKeys的取值范围true|false,默认值是:false。 含义:设置是否使用JDBC的getGenereatedKeys方法获取主键,并赋值到keyProperty设置的领域模型属性中。mapper代码如下。
<insert id="insert" parameterType="com.yealink.ptms.pojo.Rule" useGeneratedKeys="true" keyProperty="id">
INSERT INTO rule (name, used_dimension)
VALUES (
#{name, jdbcType=VARCHAR},
#{usedDimension, jdbcType=OTHER, typeHandler=com.yealink.ptms.typeHandler.JSONTypeHandlerPg}
)
</insert>
运行结果
两种方法均能取到自增的id。