Mybatis中insert语句返回主键总是1

        使用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的主键属性,就会发现 该属性已经有值。

猜你喜欢

转载自shidan66.iteye.com/blog/2003796