MyBatis UPDATE语句使用RETURNING返回指定值的问题
解决MyBatis中UPDATE语句返回指定值的问题
问题原因
你当前返回-1是因为MyBatis默认情况下,update标签对应的接口方法返回的是受影响的行数,但当使用PostgreSQL的RETURNING子句时,驱动会返回结果集而非单纯的行数,此时用int类型接收就会得到异常值(比如-1)。
正确实现方式
MyBatis完全支持从UPDATE语句返回指定值,核心是利用RETURNING返回的结果集,通过以下步骤实现:
修改Mapper接口的返回类型
把原来返回int的方法改成返回你需要的字符串类型,同时给参数加上@Param注解确保映射正确:String updateRoleValues( @Param("roleId") int roleId, @Param("roleName") String roleName, @Param("description") String description, @Param("active") boolean active );调整XML中的SQL标签
将原来的<update>标签替换为<select>标签(因为RETURNING会生成结果集,select标签可以直接映射结果),并指定resultType为字符串类型,同时修改RETURNING后的列名为你需要的唯一字符串列:<select id="updateRoleValues" resultType="java.lang.String"> UPDATE sandbox.roles SET rolename = #{roleName}, description = #{description}, active = #{active}, obsolete = false WHERE role_id = #{roleId} RETURNING your_unique_string_column </select>(把
your_unique_string_column替换成你实际要返回的字符串类型唯一值的列名)
效果说明
- 当存在匹配
roleId的记录时,方法会返回RETURNING指定列的字符串值; - 当没有匹配的记录(即未执行更新)时,方法返回
null。
另一种可选方式(用<update>+<selectKey>)
如果坚持要用<update>标签,可以通过<selectKey>来捕获返回值,但需要用Map或自定义对象作为参数来承载返回结果:
<update id="updateRoleValues" parameterType="map"> <selectKey keyProperty="returnedUniqueValue" resultType="java.lang.String" order="AFTER"> UPDATE sandbox.roles SET rolename = #{roleName}, description = #{description}, active = #{active}, obsolete = false WHERE role_id = #{roleId} RETURNING your_unique_string_column </selectKey> </update>
调用时传入包含所有参数的Map,执行后可以从Map中取出returnedUniqueValue对应的结果。不过这种方式不如<select>标签直接返回结果直观。
内容的提问来源于stack exchange,提问作者Mark Smith
相关产品推荐
相关产品推荐

