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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值