商品页以及秒杀功能实现
商品页面的一些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来指定