使用Mybatis进行insert操作的时候,我们可能会需要得到刚插入的id,对于Mysql,理论上如下配置即可:
<insert id="insert" parameterType="cn.***.beans.LogObject" > <!-- 注意这里的order属性,对于mysql,设为after,对于oracle,需要设置为before, 同时,oracle中没有last_insert_id(),需要使用下面的语句来获取最新产生的id select CUSTOMER_ID_SEQ.nextval from dual --> <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() AS ID </selectKey> INSERT INTO S_T_LOGS ( ID, USER_ID) VALUES ( #{id}, #{userId}) </insert>
但是,经过我的测试,发现返回的值总是1。
开始时怀疑是插入的对象包含复杂的属性(比如我们插入一个Student对象,该对象里面有个班级类型的属性class,我们在数据库中通常保存的是一个classId,所以,在mapper文件中可能会这样写#{class.id}),类似这样的配置可能会触发一次查询,导致我们的insert语句和selectKey语句之间有其他的select语句,从而导致select last_insert_id()返回值总是为1,因为在mybatis打印的sql语句中,发现insert和select last_insert_id()之间有一些select语句,但是在mysql中测试后发现insert后面的select语句并不影响selecct last_insert_id()的返回值。
其实,insert的返回值还是代表啦受影响的行数,而插入对象的主键已经赋给了插入的对象 ,我们通常是调用sqlSession的insert方法来进行插入操作,同时会传递一个要插入的对象,但是主键属性为空如下所示:
sqlSession.insert("com.xxx.xxx.save", o);
假如我们的配置没有问题,那么该方法执行后,如果在这行代码后面去打印o的主键属性,就会发现 该属性已经有值。