XML映射中关于主键自增长的两种映射方法

首先我们来看一下,这是一个普通的插入数据的演示
xml映射文件

    <!--插入员工信息,自设id-->
    <insert id="insertStaff" parameterType="Staff">
        insert into staff(sid,sname,sex,phone,hireDate,flag) values(#{sid},#{sname},#{sex},#{phone},#{hireDate},#{flag})
    </insert>

测试方法

@Test
public void insertStaffTest() throws ParseException {
    Staff staff = new Staff();
    staff.setSid(13);
    staff.setSname("麦克斯");
    staff.setSex(1);
    staff.setPhone("18844465752");
    staff.setHireDate(new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-08"));
    staff.setFlag(2);
    int result = sqlSession.delete("insertStaff",staff);
    System.out.println(result+"---"+staff);
}

结果如下
XML映射中关于主键自增长的两种映射方法

可以看到,这个时候,可以正常的插入数据。但是如果我们的sid是自增长的主键,我们不想人为设置呢?

    <insert id="insertStaffKey2" parameterType="Staff">
        insert into staff(sname,sex,phone,hireDate,flag) values(#{sname},#{sex},#{phone},#{hireDate},#{flag})
    </insert>

同时我们也将测试方法中的staff.setSid(13);删除,结果如下
XML映射中关于主键自增长的两种映射方法
我们可以看到,此时的sid值为零
但是数据库中出现了sid值为26的自增长过后的值
XML映射中关于主键自增长的两种映射方法

对于这种情况一般有两种解决办法:
方法一:我们通过使用order属性搭配selectKey 来获取自增长后的sid值

    <!-- 插入员工信息,使用自增id  会获取到主键值映射给staff对象,order可以设置为AFTER或者BEFORE,我们通常设置为AFTER,这样会在生成主键后获取主键  -->
    <insert id="insertStaffKey" parameterType="Staff">
        <selectKey keyColumn="sid" keyProperty="sid" resultType="int" order="AFTER">
            select last_insert_id()
        </selectKey>
        insert into staff(sname,sex,phone,hireDate,flag) values(#{sname},#{sex},#{phone},#{hireDate},#{flag})
    </insert>

结果如下
XML映射中关于主键自增长的两种映射方法

方法二:
我们通过useGeneratedKeys属性和keyProperty属性来实现

<insert id="insertStaffKey2" parameterType="Staff" useGeneratedKeys="true" keyProperty="sid">
    insert into staff(sname,sex,phone,hireDate,flag) values(#{sname},#{sex},#{phone},#{hireDate},#{flag})
</insert>

结果如下
XML映射中关于主键自增长的两种映射方法

上一篇:MyBatis动态sql常用标签


下一篇:Sqoop的简单使用案例