正文
Long id;
private
Long userId;
private
Double amount;
private
Timestamp sendDate;
private
Integer total;
private
Double unitAmount;
private
Integer stock;
private
Integer version;
private
String note;
}
抢红包信息
package
com.artisan.redpacket.pojo;
import
java.io.Serializable;
import
java.sql.Timestamp;
public
class
UserRedPacket
implements
Serializable
{
private
static
final
long
serialVersionUID =
7049215937937620886L
;
private
Long id;
private
Long redPacketId;
private
Long userId;
private
Double amount;
private
Timestamp grabTime;
private
String note;
}
Dao层实现
MyBatis Dao接口类及对应的Mapper文件
使用 MyBatis 开发,先来完成大红包信息的查询先来定义一个 DAO 对象
package
com.artisan.redpacket.dao;
import
org.springframework.stereotype.Repository;
import
com.artisan.redpacket.pojo.RedPacket;
@Repository
public
interface
RedPacketDao
{
public
RedPacket
getRedPacket
(Long id)
;
public
int
decreaseRedPacket
(Long id)
;
}
其中的两个方法 , 一个是查询红包,另一个是扣减红包库存。
抢红包的逻辑是,先查询红包的信息,看其是否拥有存量可以扣减。如果有存量,那么可以扣减它,否则就不扣减。
接着将对应的Mapper映射文件编写一下
xml version=
"1.0"
encoding=
"UTF-8"
?>
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<
mapper
namespace
=
"com.artisan.redpacket.dao.RedPacketDao"
>
<
select
id
=
"getRedPacket"
parameterType
=
"long"
resultType
=
"com.artisan.redpacket.pojo.RedPacket"
>
select id, user_id as userId, amount, send_date as
sendDate, total,
unit_amount as unitAmount, stock, version, note from
T_RED_PACKET
where id = #{id}
select
>
<
update
id
=
"decreaseRedPacket"
>
update T_RED_PACKET set stock = stock - 1 where id =
#{id}
update
>
mapper
>
这里getRedPacket并没有加锁这类动作,目的是为了演示超发红包的情况。
然后是抢红包的设计了 ,先来定义插入抢红包的 DAO ,紧接着是Mapper映射文件
package
com
.artisan
.redpacket
.dao
;
import
org
.springframework
.stereotype.Repository
;
import
com
.artisan
.redpacket
.pojo
.UserRedPacket
;
@
Repository
public interface UserRedPacketDao {
public
int
grapRedPacket
(
UserRedPacket
userRedPacket
);
}
xml version=
"1.0"
encoding=
"UTF-8"
?>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<
mapper
namespace
=
"com.artisan.redpacket.dao.UserRedPacketDao"
>
<
insert
id
=
"grapRedPacket"
useGeneratedKeys
=
"true"
keyProperty
=
"id"
parameterType
=
"com.artisan.redpacket.pojo.UserRedPacket"
>
insert into T_USER_RED_PACKET( red_packet_id, user_id, amount, grab_time, note)
values (#{redPacketId}, #{userId}, #{amount}, now(), #{note})
insert
>
mapper
>
这里使用了 useGeneratedKeys 和 keyPrope町,这就意味着会返回数据库生成的主键信息,这样就可以拿到插入记录的主键了 , 关于 DAO 层就基本完成了。
别忘了单元测试!!!
Service层实现
接下来定义两个 Service 层接口,分别是 UserRedPacketService和RedPacketService
package
com.artisan.redpacket.service;
import
com.artisan.redpacket.pojo.RedPacket;
public
interface
RedPacketService
{
public
RedPacket
getRedPacket
(Long id)
;
public
int
decreaseRedPacket
(Long id)
;
}
package
com.artisan.redpacket.service;
public
interface