当前位置 : 主页 > 编程语言 > c++ >

细说mybatis中 select last_insert_id(返回插入数据行的id) 的坑

来源:互联网 收集:自由互联 发布时间:2021-07-03
1、请勿误解select last_insert_id() 1、首先来看一看我们的User对象与xml与接口Mapper中的方法 (1):User对象 public class User { private long id; private String name; private String password; private String phone; priva
1、请勿误解select last_insert_id()
1、首先来看一看我们的User对象与xml与接口Mapper中的方法
    (1):User对象
        public class User {
            private long id;
            private String name;
            private String password;
            private String phone;
            private boolean is_lock;
            //省略get set方法
        }
    (2):xml
    
 
		 
  
		
  
    select last_insert_id() 
  
		insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
	
 
    (3)、接口Mapper中的方法
        public long create(User user); 
2、有几个重点
    (1)、select last_insert_id() &只适用于自增主键&;
    (2)、keyProperty="id" 这个“id”是你的Bean的字段,如这里,是我们的User对象的字段“id”;
    (3)、mybatis直接将我们的insert的id写入了User的字段“id”中;
    (4)、
        ▉ 我们获取所插入的id不是Mapper中的方法create(User user)的返回值,
         User user = new User();
         long id = mapper.create(user); ×是错的,这里返回的是影响的行数,也就是说一般返回1(插入一行) 或0(未成功插入)
         这里应该是 long effectRows = mapper.create(user);
        ▉ 我们获取所插入的id已经存到了user对象的“id”字段中,所以应该这么获取:
         User user = new User();
         mapper.create(user);
         user.getId();               √是对的,这里返回了插入的id
2、select last_insert_id()中的坑
1、有时我们会这么写
   ▉ 接口Mapper中
    public long create(@Param("user")User user);
   ▉ xml中
    insert into user(id,name,password,phone,is_lock) 
        values (#{user.id},#{user.name},#{user.password},#{user.phone},#{user.is_lock})
这么写的话last_insert_id()是不会成功的,似乎我们添加了@Param("user")后,mybatis就无法找到user插入返回id了,
但是数据库中插入的行数是有更新的;

2、我们应该这么写
   ▉ 接口Mapper中
    public long create(User user);//去掉@Param
   ▉ xml中
    insert into user(id,name,password,phone,is_lock) 
        values (#{id},#{name},#{password},#{phone},#{is_lock})
3、成功的例子
(1):User对象
    public class User {
        private long id;
        private String name;
        private String password;
        private String phone;
        private boolean is_lock;
        //省略get set方法
    }

(2):接口Mapper中
    public long create(User user);

(3):xml中
    
 
		
  
    select last_insert_id() 
  
		insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
	
 
4、不用select last_insert_id()应该怎么做
当有特殊情况,必须使用@Param(),而且要返回插入id应该怎么做呢,我们还有一种方法能返回插入id

(1)接口Mapper中:
    public void create(@Param("user")User user); 

(2)xml中
    
 

    
 
  
		insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
	
 

(3)以上的方法也能返回插入id,并且能起别名,但是也有一个缺点,就是不能有返回值,如果我们加上
   resultType="java.lang.Long",会报错,暂时还不知道是否能解决。
网友评论