问题描述
我有一个Java项目,该项目使用MyBatis访问PostgreSQL数据库. PostgreSQL允许在INSERT
语句之后返回新创建的行的字段,我想用它来返回新创建的记录的自动生成的BIGSERIAL
id
.因此,我更改了XML中的insert
命令以使用PostgreSQL的功能,向<insert>
标签添加了resultType="long"
属性,并且在映射器的Java接口中,我将插入方法设置为返回long
void
.
当我尝试运行此命令时,我得到一个org.xml.sax.SAXParseException
说Attribute "resultType" must be declared for element type "insert"
.
现在,当我将<insert>
标记更改为<select>
时,一切正常,但是让我感到困扰的是,我使用<select>
标记执行INSERT
语句.
是否有一种方法可以使映射到<insert>
标记的方法返回结果,或者MyBatis不是为此而设计的,我应该将它们保留为<select>
标记?
答案
映射插入方法的返回类型可以是void
或int
(在这种情况下,它将返回插入行的编号).您可以执行以下机制来返回生成的ID:
<insert id="insert" parameterClass="MyParameter">
<selectKey order="AFTER" keyProperty="id" resultType="long">
SELECT currval('my_seq')
</selectKey>
INSERT INTO mytable(col1, col2) VALUES (#{val1}, #{val2})
</insert>
这会将生成的id
列设置为参数类的id
属性.之后,您作为参数传递的对象将在其属性中生成id
设置.