大家早已熟知MVC模型,所以接下来按照这个模型来写,见天介绍DAO层的搭建,由于这篇开始会涉及到大量的代码,所以文末给出Github的地址,不再贴出过多的代码。对于数据库设计和项目介绍请阅读以下两篇文章
项目整体介绍
数据库设计和项目搭建
实体类设计
这个系统主要包括两个主要的实体类:Seckill【秒杀商品的实体类】和Seckilled【秒杀成功实体类】,
Seckill(秒杀实体类)
//秒杀商品的ID
private long seckillId;
//秒杀商品的名字
private String name;
//秒杀商品的数量
private int number;
//秒杀开始的时间
private Date startTime;
//秒杀结束的时间
private Date endTime;
//秒杀创建的时间
private Date createTime;
Seckilled(秒杀成功实体类)
//秒杀的商品的ID
private long seckillId;
//秒杀用户的电话
private long userPhone;
//秒杀商品的状态
private short state;
//秒杀成功的时间
private Date creteTime;
// 多对一的复合属性
private Seckill seckill;
在秒杀成功实体类中包含一个复合属性,在设计表的时候我们就知道,seckillId是一个外键,所以在展示的时候为了能将选出来的秒杀成功的实体类中包含商品的信息我们设置一个Seckill的对象用来存储相关的信息。
DAO层接口设计
由于使用的是Mybatis,所以需要首先设计接口,主要包括两个接口一个是用来操作商品的,一个是用来操作秒杀成功相关信息的
SeckillDao
/**
* 减库存
*
* @param seckillId
* @param killTime
* @return 如果影响行数等于>1,表示更新的记录行数
*/
int reduceNumber(@Param("seckillId") long seckillId, @Param("killTime") Date killTime);
/**
* 根据id查询秒杀对象
*
* @param seckillId
* @return
*/
Seckill queryById(long seckillId);
/**
* 根据偏移量查询秒杀商品列表
*
* @param offset
* @param limit
* @return
*/
List queryAll(@Param("offset") int offset, @Param("limit") int limit);
SuccessKilledDao
/**
* 插入购买明细,可过滤重复
*
* @param seckillId
* @param userPhone
* @return 插入的行数
*
*/
int insertSuccessKilled(@Param("seckillId") long seckillId, @Param("userPhone") long userPhone);
/**
* 根据id查询SuccessKilled并携带秒杀产品对象实体
*
* @param seckillId
* @param userPhone
* @return
*/
SuccessKilled queryByIdWithSeckill(@Param("seckillId") long seckillId, @Param("userPhone") long userPhone);
到这里主要的东西都介绍完了,接下来是一些配置文件的书写,包括mapper文件的书写和Spring SpringMVC Mybatis的一些配置,由于都是一些大致相同的配置,所以给出源代码的具体地址和详细的注释,如果有不明白的可以留言解答
Mapper文件配置
SeckillDao.xml
UPDATE seckill
SET number = number - 1
WHERE
seckill_id = #{seckillId}
AND start_time #{killTime}
AND end_time >= #{killTime}
AND number > 0
SuccessKilledDao.xml
INSERT ignore INTO success_killed (seckill_id, user_phone, state)
VALUES (#{seckillId}, #{userPhone}, 0)
Mybatis配置文件
数据库配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/seckill?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=
日志配置文件
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
Spring配置文件