Java电商秒杀系统及其优化(三)

商品页面的一些sql语句

秒杀逻辑


商品页面的一些sql语句

查询所有商品

注意这里的商品表和秒杀商品的表是两个独立的表,之所以不放在一起的原因是,秒杀商品可能随时变动或添加。我要获取这两个独立表的所有信息,先创建了一个GoodsVo,让他去继承Goods类,再写上秒杀商品特有的参数,这样就集合了所有参数,查询也利用了连表左查询。

public class GoodsVo extends Goods{
	private Double miaoshaPrice;
	private Integer stockCount;
	private Date startDate;
	private Date endDate;
	}
@Select("select g.*,mg.stock_count, mg.start_date, mg.end_date,mg.miaosha_price from miaosha_goods mg left join goods g on mg.goods_id = g.id")
	public List<GoodsVo> listGoodsVo();

根据id查询

@Select("select g.*,mg.stock_count, mg.start_date, mg.end_date,mg.miaosha_price from miaosha_goods mg left join goods g on mg.goods_id = g.id where g.id = #{goodsId}")
	public GoodsVo getGoodsVoByGoodsId(@Param("goodsId")long goodsId);

秒杀逻辑

先判断user,若没有返回登录页面,有继续判断是否还有库存,没有返回失败页面添加库存不足信息,有库存则继续判断用户是否参加过秒杀,从秒杀订单中查询用户id和商品id,若则返回失败页面,无则开始秒杀。

秒杀过程

先减库存,然后在秒杀订单中添加用户id和商品id,并插入普通订单。这个过程要执行事务,因为必须同时成功或失败,用@Transactional注解。

流程图(转载自https://blog.csdn.net/qq_46225886/article/details/107306110,方便理解)

在这里插入图片描述

插入订单的sql语句

@Select("select * from miaosha_order where user_id=#{userId} and goods_id=#{goodsId}")
	public MiaoshaOrder getMiaoshaOrderByUserIdGoodsId(@Param("userId")long userId, @Param("goodsId")long goodsId);

	@Insert("insert into order_info(user_id, goods_id, goods_name, goods_count, goods_price, order_channel, status, create_date)values("
			+ "#{userId}, #{goodsId}, #{goodsName}, #{goodsCount}, #{goodsPrice}, #{orderChannel},#{status},#{createDate} )")
	@SelectKey(keyColumn="id", keyProperty="id", resultType=long.class, before=false, statement="select last_insert_id()")
	public long insert(OrderInfo orderInfo);

@SelectKey注解

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题。

数据库主键包括自增和非自增,有时候新增一条数据不仅仅知道成功就行了,后边的逻辑可能还需要这个新增的主键,这时候再查询数据库就有点耗时耗力,我们可以采用selectKey来帮助我们获取新增的主键。

keyProperty 表示查询结果赋值给代码中的哪个对象

keyColumn 表示将查询结果赋值给数据库表中哪一列

before 可以设置为 true 或false。要运行的SQL语句。
before=true表示插入之前进行查询,可以将查询结果赋给keyProperty和keyColumn,赋给keyColumn相当于更改数据库。
before=false表示先插入,再查询,这时只能将结果赋给keyProperty。

statementType 要运行的SQL语句,它的返回值通过resultType来指定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值