摘要:前端
本篇博文是「Java秒殺系統實戰系列文章」的第三篇,本篇博文將主要介紹秒殺系統的總體業務流程,並根據相應的業務流程進行數據庫設計,最終採用Mybatis逆向工程生成相應的實體類Entity、操做Sql的接口Mapper以及寫動態Sql的配置文件Mapper.xml。java
內容:git
對於該秒殺系統的總體業務流程,相信機靈的小夥伴在看完第二篇博文的時候,就已經知道個大概了!由於在提供的源碼數據庫下載的連接中,Debug已經跟各位小夥伴介紹了該秒殺系統總體的業務流程,並且還以視頻形式給各位小夥伴進行了展現!該源碼數據庫的下載連接以下:https://gitee.com/steadyjack/... 在本篇博文中Debug將繼續花一點篇幅介紹介紹!數據庫
一圖以概之,以下圖所示爲該秒殺系統總體的業務流程:apache
從該業務流程圖中,能夠看出,後端接口在接收前端的秒殺請求時,其核心處理邏輯爲:後端
(1)首先判斷當前用戶是否已經搶購過該商品了,若是否,則表明用戶沒有搶購過該商品,能夠進入下一步的處理邏輯服務器
(2)判斷該商品可搶的剩餘數量,即庫存是否充足(便是否大於0),若是是,則進入下一步的處理邏輯微信
(3)扣減庫存,並更新數據庫的中對應搶購記錄的庫存(通常是減一操做),判斷更新庫存的數據庫操做是否成功了,若是是,則建立用戶秒殺成功的訂單,並異步發送短信或者郵件通知信息通知用戶mybatis
(4)以上的操做邏輯若是有任何一步是不知足條件的,則直接結束整個秒殺的流程,即秒殺失敗!app
以下圖所示爲後端處理「秒殺請求」時的核心處理邏輯:
綜合這兩個業務流程,下面進入「秒殺系統」的數據庫設計環節,其中,主要包含如下幾個表:商品信息表item、待秒殺信息表item_kill、秒殺成功記錄表item_kill_success以及用戶信息表user;固然,在實際的大型網站中,其所包含的數據庫表遠遠不止於此!本系統暫且濃縮出其中核心的幾張表!
以下圖所示爲該「秒殺系統」的數據庫設計模型:
緊接着,是採用Mybatis的逆向工程生成這幾個數據庫表對應的實體類Entity、操做Sql的接口Mapper以及寫動態Sql的配置文件Mapper.xml。以下圖所示:
下面,貼出其中一個實體類以及相對應的Mapper接口和Mapper.xml代碼,其餘的,各位小夥伴能夠點擊連接:https://gitee.com/steadyjack/... 前往下載查看!首先是實體類ItemKill的源代碼:
import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class ItemKill { private Integer id; private Integer itemId; private Integer total; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date startTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date endTime; private Byte isActive; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date createTime; private String itemName; //採用服務器時間控制是否能夠進行搶購 private Integer canKill; }
而後是ItemKillMapper接口的源代碼:
import com.debug.kill.model.entity.ItemKill; import org.apache.ibatis.annotations.Param; import java.util.List; public interface ItemKillMapper { List<ItemKill> selectAll(); ItemKill selectById(@Param("id") Integer id); int updateKillItem(@Param("killId") Integer killId); ItemKill selectByIdV2(@Param("id") Integer id); int updateKillItemV2(@Param("killId") Integer killId); }
<!--查詢待秒殺的活動商品列表--> <select id="selectAll" resultType="com.debug.kill.model.entity.ItemKill"> SELECT a.*, b.name AS itemName, ( CASE WHEN (now() BETWEEN a.start_time AND a.end_time AND a.total > 0) THEN 1 ELSE 0 END ) AS canKill FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id WHERE a.is_active = 1 </select> <!--獲取秒殺詳情--> <select id="selectById" resultType="com.debug.kill.model.entity.ItemKill"> SELECT a.*, b.name AS itemName, ( CASE WHEN (now() BETWEEN a.start_time AND a.end_time AND a.total > 0) THEN 1 ELSE 0 END ) AS canKill FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id WHERE a.is_active = 1 AND a.id= #{id} </select> <!--搶購商品,剩餘數量減一--> <update id="updateKillItem"> UPDATE item_kill SET total = total - 1 WHERE id = #{killId} </update> <!--獲取秒殺詳情V2--> <select id="selectByIdV2" resultType="com.debug.kill.model.entity.ItemKill"> SELECT a.*, b.name AS itemName, (CASE WHEN (now() BETWEEN a.start_time AND a.end_time) THEN 1 ELSE 0 END) AS canKill FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id WHERE a.is_active = 1 AND a.id =#{id} AND a.total>0 </select> <!--搶購商品,剩餘數量減一--> <update id="updateKillItemV2"> UPDATE item_kill SET total = total - 1 WHERE id = #{killId} AND total>0 </update> </mapper>
值得注意的是,上面實體類ItemKill、ItemKillMapper接口的相應方法及其對應的動態Sql的含義,各位小夥伴能夠暫且忽略,在後面介紹到相應的業務實戰時將會再次進行重點介紹。
至此,關於「秒殺系統」總體的業務流程、後端接口的核心處理邏輯以及Mybatis逆向工程的應用等就介紹到這裏了。下一節將進入實際的代碼實戰環節!
補充:
一、目前,這一秒殺系統的總體構建與代碼實戰已經所有完成了,完整的源代碼數據庫地址能夠來這裏下載:https://gitee.com/steadyjack/... 記得Fork跟Star啊!!!
二、實戰期間有任何問題均可以留言或者與Debug聯繫、交流;Debug的微信:debug0868 Debug的QQ:1948831260