【mybatis的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
    <insert id="create">
		 <!-- 
	        将insert插入的数据的主键返回到User对象中;
	        select last_insert_id():得到刚insert进去记录的主键值,只适用于自增主键;
	        keyProperty:将查询到的主键值,设置到parameterType指定的对象的那个属性
	        order:select last_insert_id()执行顺序,相对于insert语句来说它的执行顺序。
	        resultType:指定select last_insert_id()的结果类型,也就是id的类型;
	     -->
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
        	select last_insert_id()
    	</selectKey>
		insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
	</insert>
    (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

需要注意的点

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})

特殊情况不用select last_insert_id()

当有特殊情况,必须使用@Param(),而且要返回插入id应该怎么做呢,我们还有一种方法能返回插入id

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

(2)xml中
    <!-- insert例子:插入后返回插入数据行自增的ID
     要点:1、parameterType="com.amiu.shiro.db.User"
	     	 返回id所接收的类,必须写全,类中存在的字段,insert语句中也必须写全
	      2、keyProperty="user.id"传回的id存放的字段,user是Mapper中的参数
	                         引用传来的参数user的属性,必须写user.xxx
	      3、虽然id是自增的,但是我们下面也得写上
	        insert into user(id) values(#{user.id})
	      4、可直接写INSERT INTO user VALUES(xxx),必定插入本表的所有字段
	      
        parameterType:传入参数,也是ID接收参数,如本例是:create(@Param("user")User user),中的参数user
        useGeneratedKeys:是否使用id自增
        keyProperty:传回的id存放在user中的哪个字段中,本例是id字段
        特别提醒,如遇到数据库order这样的字段,要加上insert into user(`order`)(数据库保留字)
	 -->

    <insert id="create" parameterType="com.amiu.shiro.db.User" useGeneratedKeys="true" keyProperty="user.id" >
		insert into user(id,name,password,phone,is_lock) values (#{id},#{name},#{password},#{phone},#{is_lock})
	</insert>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值