mybatis SELECT LAST_INSERT_ID()总是返回1或者0

本文探讨了在使用MyBatis框架时,通过SELECT LAST_INSERT_ID()获取新插入记录主键的问题。揭示了由于keyProperty大小写不匹配导致的错误,并提供了正确的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

写代码的时候使用到了SELECT LAST_INSERT_ID(),发现每次返回的结果都是1,用PO取主键则每次都是0

public class ManagerPO {
		private int id;
		private String account;
		private String password;
		private String phone;
		private String name;
		private boolean deleted;
		private DateTime createTime;
		private DateTime updateTime;
}

ManagerPO 的mybatis配置如下:

  <insert id="create" useGeneratedKeys="true" keyProperty="ID">
        <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="ID">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO SIN_Manager (Account,Password,Name,Phone,Deleted)
        VALUES (#{account}, #{password},#{name},#{phone},0)
    </insert>

JAVA调用如下:

		ManagerPO managerPO = new ManagerPO();
		managerPO.setAccount(account);
		managerPO.setPassword(password);
		managerPO.setName(name);
		managerPO.setPhone(phone);

		int result= managerDAO.create(managerPO);
		System.out.println("result="+result);
		System.out.println("managerPOId="+managerPO.getId());

执行结果为:

result=1
managerPOId=0


注意点一:执行insert()方法,期望是每次返回上一次插入的数据的主键id,然而每次都返回1,经过一番检查后,发现"select last_insert_id()"已经执行了但是并不是这个方法的返回值,

而"select last_insert_id()"语句的结果被封装到了student对象中了,所以执行完sql语句后可以通过managerPO.getId();获得新插入记录的主键。
对比我们的输出结果返现有两个问题,第一个是取返回插入主键取错了。不应该取result,应该取managerPO.getId()。

那为什么这里managerPOId=0,答案在mybatis配置文件里忽略了keyProperty大小写问题。修改一下:

  <insert id="create" useGeneratedKeys="true" keyProperty="id">
        <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO SIN_Manager (Account,Password,Name,Phone,Deleted)
        VALUES (#{account}, #{password},#{name},#{phone},0)
    </insert>

执行结果如下,问题解决!

result=1
managerPOId=32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值