首先我们来看一下,这是一个普通的插入数据的演示
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);
}
结果如下
可以看到,这个时候,可以正常的插入数据。但是如果我们的sid是自增长的主键,我们不想人为设置呢?
<insert id="insertStaffKey2" parameterType="Staff">
insert into staff(sname,sex,phone,hireDate,flag) values(#{sname},#{sex},#{phone},#{hireDate},#{flag})
</insert>
同时我们也将测试方法中的staff.setSid(13);
删除,结果如下
我们可以看到,此时的sid值为零
但是数据库中出现了sid值为26的自增长过后的值
对于这种情况一般有两种解决办法:
方法一:我们通过使用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>
结果如下
方法二:
我们通过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>
结果如下