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、首先来看一看我们的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):xml2、select last_insert_id()中的坑(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 select last_insert_id() insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
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中4、不用select last_insert_id()应该怎么做select last_insert_id() insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
当有特殊情况,必须使用@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",会报错,暂时还不知道是否能解决。