关于Mybatis执行插入语句后返回主键id的一种实现

关于Mybatis执行插入语句后返回主键id的一种实现

执行Mybatis执行INSERT语句时,返回的是更改的行数,在源码中可以知道这是mapper.xml修改不了的。

case INSERT: {
  Object param = method.convertArgsToSqlCommandParam(args);
    // rowCount字面理解就是记录行数
  result = rowCountResult(sqlSession.insert(command.getName(), param));
  break;
}

既然改不了返回值,那么Mybatis提供了一种方法:改传入的参数(或对象)

假如一个mapper的方法定义如下:

void insertOneUser(User user);

此方法参数为一个User类的对象,若要实现执行插入语句后可以获取主键id的功能,Mybatis操作如下:

  1. 获取传入的参数,如user;
  2. 将user的id属性设置为自增id的值。

mapper.xml书写方式:

<insert id="insertOneUser" parameterType="正常写">
    <selectKey resultType="java.lang.Long" keyProperty="id" keyColumn="id" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO
        user_t(username, password, age)
    VALUES
       (#{username}, #{password}, #{age})
</insert>

selectKey标签属性:

  • 对于传入的参数对象(user):
    • resultType:在user中,存储主键id的类型是什么?
    • keyProperty:在user中,对应表内主键id的属性名是什么?
  • 对于表:
    • keyColumn:主键id在表内的字段是什么?
  • 操作:
    • order:AFTER:在插入语句之后查询主键id并设置,BEFORE反之。

标签包裹的内容:返回一个值,为最近一次insert生成的主键id

SELECT LAST_INSERT_ID()

此处定义的insert块执行顺序:

  1. 执行INSERT语句,将user内的数据插入表中;
  2. 执行selectKey标签内的语句,找到最近插入的主键id;
  3. 将查到的主键id通过反射(set与设置的keyProperty拼成方法名)找到对应setter方法,执行user的setter方法。

使用方法如下:

User u;
userMapper.insertOneUser(u = userDetails2User(user)); // 假设User对象u此时的id为null
Long id = u.getId(); // 执行后再获取id,id非空且为此次插入生成的主键id
assert id != null; // 断言通过
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值