Mybatis插入字段并返回主键的小问题

使用背景

这几天在写秒杀项目,其中有一个需求是生成订单并返回订单号(主键)然后再生成秒杀订单将刚刚返回的订单号作为某个字段插入秒杀订单中,也就是秒杀订单表中的order_id。这其中就使用到了插入信息并返回主键。

我使用的是Mybatis逆向工程生成的Mapper文件,其中自动生成的insert方法返回的是影响的行数,我在使用的时候一直返回给我的是1,导致报错。

相关Mapper的编写

其中最关键的就是在insert标签上增加useGeneratedKeys和keyProperty

1
2
3
4
5
6
7
8
9
10
  <insert id="insertOrderAndReturnOrderId" useGeneratedKeys="true" keyProperty="id" parameterType="com.lgq.miaosha.domain.OrderInfo">
insert into t_order_info (id, user_id, goods_id,
delivey_addr_id, goods_name, goods_count,
goods_price, order_channel, status,
create_date, pay_date)
values (#{id,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT},
#{deliveyAddrId,jdbcType=BIGINT}, #{goodsName,jdbcType=VARCHAR}, #{goodsCount,jdbcType=INTEGER},
#{goodsPrice,jdbcType=DECIMAL}, #{orderChannel,jdbcType=TINYINT}, #{status,jdbcType=TINYINT},
#{createDate,jdbcType=TIMESTAMP}, #{payDate,jdbcType=TIMESTAMP})
</insert>

其中keyProperty=”id”,这个id就是传入对象中的某个属性值,比如说这里就是OrderInfo对象,执行成功之后就会自动将主键的值赋给对象中的id属性。然后原本作为参数的OrderInfo对象中的id就得到了更新,这时候我们再取这个对象的id字段就可以获取到主键的值了。

使用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  /**
* 生成订单
* @param user 用户
* @param goodsVo 商品
* @return 订单详情
*/
@Transactional
public OrderInfo createOrder(User user, GoodsVo goodsVo) {
//这里主要就是生成OrderInfo对象
OrderInfo orderInfo=new OrderInfo();
orderInfo.setCreateDate(new Date());
orderInfo.setDeliveyAddrId(0L);
orderInfo.setGoodsCount(1);
orderInfo.setGoodsId(goodsVo.getId());
orderInfo.setGoodsName(goodsVo.getGoodsName());
orderInfo.setGoodsPrice(goodsVo.getMiaoshaPrice());
byte b=1;
orderInfo.setOrderChannel(b);
b=0;
orderInfo.setStatus(b);
orderInfo.setUserId(user.getId());
//插入订单
orderInfoMapper.insertOrderAndReturnOrderId(orderInfo);
//最关键的一步
//获取到刚刚对象中的id字段就是主键的值了
Long orderId=orderInfo.getId();
MiaoshaOrder miaoshaOrder=new MiaoshaOrder();
miaoshaOrder.setGoodsId(goodsVo.getId());
//这里不是很严谨,意思是将MiaoShaOrder的id设置成和OrderInfo的id一样
miaoshaOrder.setId(orderId);
miaoshaOrder.setUserId(user.getId());
//将miaosha_order表中的order_id字段设置为order_id表中的主键
miaoshaOrder.setOrderId(orderId);
miaoshaOrderMapper.insert(miaoshaOrder);
return orderInfo;
}
}
-------------本文结束感谢阅读-------------