<insert id="insertUser" parameterType="com.test.User">
<!-- selectKey将主键返回,需要再返回 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username)
values(#{username});
</insert>


  其中部分标签解释如下:

  1. selectKey:将插入到数据库的某条记录的主键,返回到指定的对象(user)对应属性中。需要注意的是order属性,如Mysql一类支持自动增长的数据库中,order需要设置为AFTER才能获取到正确的值,但是如Oracle取序列的情况,就需要设置为before。其次在使用Spring管理事务时,selectKey和插入在同一事务当中,因而Mysql这样的情况由于数据尚未插入到数据库中,所以得不到自动增长的key,此时需要取消事务管理方可解决问题。

  2. keyProperty:指定返回的主键,存储在对象(user)中的哪个属性。需要注意的是keyProperty中对应的是对象的属性名,而非数据库的字段名。其次,添加该属性并非改变insert的返回值,insert还是返回新增的结果,也就是受影响的行数。

  3. order:相对于insert语句,selectKey标签中的sql的执行顺序(after或者before)。由于mysql的自增原理,执行完insert语句后才会生成主键,所以执行顺序是after。

  4. resultType:sql语句返回类型所对应的Java类型。

  5. LAST_INSERT_ID():mysql的函数返回auto_increment自增列新记录id值。