场景描述:
之前遇到两个问题,刚好今天两个问题同时出现,就做个记录了。
- 开发过程中,需要在插入的一条数据时,返回该条记录的主键用于后面的操作;
- 传入的参数为:实体和基本数据类型;
Mapper部分:
只需要实体和基本数据类型都加上@Param,并和xml中的值对应上即可。
int insert(@Param("orgNo")Integer orgNo,@Param("pubEmp")PubEmp pubEmp);
Mybatis部分:
由于业务规则需要修改主键的规则,如下函数。另外,由于参数为实体和其他参数,所以导致,不能直接在keyProperty使用id,不然实体类中id是为空的,所以需要使用实体.id,然后keyProperty需要与下面的values里的主键对应。
<insert id="insert" parameterType="java.lang.Object">
<selectKey keyProperty="pubEmp.id" order="BEFORE" resultType="java.lang.Integer">
select substr(#{orgNo,jdbcType=VARCHAR},0,3)||SEQ_PUB_EMP.NEXTVAL from dual
</selectKey>
insert into PUB_EMP (ID, CODE, NAME,
SEX, STATE, ID_CARD,
BIRTHDAY, WORK_UNIT, BRANCH_CODE,
TITLES_ID, JOB_TITLE_ID, MAJOR,
MOBILE_PHONE, FAMILY_PHONE, WORK_PHONE,
EMAIL, CREATE_EMPID, CREATE_TIME,
MODIFY_EMPID, MODIFY_TIME)
values (#{pubEmp.id,jdbcType=DECIMAL}, #{pubEmp.code,jdbcType=VARCHAR}, #{pubEmp.name,jdbcType=VARCHAR},
#{pubEmp.sex,jdbcType=DECIMAL}, #{pubEmp.state,jdbcType=DECIMAL}, #{pubEmp.idCard,jdbcType=VARCHAR},
#{pubEmp.birthday,jdbcType=TIMESTAMP}, #{pubEmp.workUnit,jdbcType=VARCHAR}, #{pubEmp.branchCode,jdbcType=VARCHAR},
#{pubEmp.titlesId,jdbcType=DECIMAL}, #{pubEmp.jobTitleId,jdbcType=DECIMAL}, #{pubEmp.major,jdbcType=VARCHAR},
#{pubEmp.mobilePhone,jdbcType=VARCHAR}, #{pubEmp.familyPhone,jdbcType=VARCHAR}, #{pubEmp.workPhone,jdbcType=VARCHAR},
#{pubEmp.email,jdbcType=VARCHAR}, #{pubEmp.createEmpid,jdbcType=DECIMAL}, #{pubEmp.createTime,jdbcType=TIMESTAMP},
#{pubEmp.modifyEmpid,jdbcType=DECIMAL}, #{pubEmp.modifyTime,jdbcType=TIMESTAMP})
</insert>