赞
踩
MyBatis中,在大多数情况下,我们向数据库中插入一条数据之后,并不需要关注这条新插入数据的主键ID。我们也知道,正常在DAO中的插入语句虽然可以返回一个int类型的值,但是这个值表示的是插入影响的行数,而不是新插入数据的主键ID。
近期有一个需求,核心是保存一些巡检结果的报错信息,但是由于报错详情可能会比较多,所以计划首先将报错详情记录在一个扩展表中,然后将这个扩展表记录的主键ID保存在错误记录表中。因此这里就有一个问题,怎么在插入扩展表之后,能够直接获取到其主键ID呢?本文将简要记录两种常见的处理方式。
不论是用哪种方式,其核心点都是:
在insert里面配置“useGeneratedKeys”和“keyProperty”属性:
<insert id="insertDataErrorExtension" parameterType="com.xx.campaign.dataobject.DataErrorExtensionDO" useGeneratedKeys="true" keyProperty="id">
insert into data_error_extension
(group_id, page_id, module_id, tag_id, schedule_id, error_type, error_code, error_level, error_message, error_details, status, version, attr)
values (#{groupId}, #{pageId}, #{moduleId}, #{tagId}, #{scheduleId}, #{errorType},#{errorCode}, #{errorLevel}, #{errorMessage}, #{errorDetails}, #{status}, #{version}, #{attr})
</insert>
在Insert里面增加一个selectKey节点:
<insert id="insertDataErrorExtension" parameterType="com.xx.campaign.dataobject.DataErrorExtensionDO">
<selectKey resultType="long" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into data_error_extension
(group_id, page_id, module_id, tag_id, schedule_id, error_type, error_code, error_level, error_message, error_details, status, version, attr)
values (#{groupId}, #{pageId}, #{moduleId}, #{tagId}, #{scheduleId}, #{errorType},#{errorCode}, #{errorLevel}, #{errorMessage}, #{errorDetails}, #{status}, #{version}, #{attr})
</insert>
这里的重点是,DAO的insert方法一定要传对应的DO对象,示例方法签名如下:
/**
* 插入Data error extension
*
* @param dataErrorExtensionDO dataErrorExtensionDO
*
* @return 影响行数
*
* @throws Exception 插入异常
*/
Integer insertDataErrorExtension(DataErrorExtensionDO dataErrorExtensionDO) throws Exception;
然后调用DAO的insert方法后,就可以从DO对应中获取到自增主键id:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。