01 整合IDEA+Maven+SSM框架的高并發(fā)的商品秒殺項(xiàng)目之業(yè)務(wù)分析與DAO層

作者:nnngu
項(xiàng)目源代碼:https://github.com/nnngu/nguSeckill


這是一個(gè)整合IDEA+Maven+SSM框架的高并發(fā)的商品秒殺項(xiàng)目画髓。我們將分為以下幾篇文章來進(jìn)行詳細(xì)的講解:

  • 01 Java高并發(fā)秒殺項(xiàng)目之業(yè)務(wù)分析與DAO層
  • 02 Java高并發(fā)秒殺項(xiàng)目之Service層
  • 03 Java高并發(fā)秒殺項(xiàng)目之web層
  • 04 Java高并發(fā)秒殺項(xiàng)目之高并發(fā)優(yōu)化

項(xiàng)目的效果圖

秒殺商品列表

秒殺商品列表
秒殺商品列表

開始秒殺提示界面

開始秒殺提示界面
開始秒殺提示界面

秒殺結(jié)束提示界面

秒殺結(jié)束提示界面
秒殺結(jié)束提示界面

新建一個(gè)Maven項(xiàng)目

以IntelliJ IDEA為例净宵,點(diǎn)擊File > New > Project > Maven

然后點(diǎn)擊Next繼續(xù);
然后點(diǎn)擊Next繼續(xù);

然后點(diǎn)擊Next繼續(xù)竣稽;

填寫相關(guān)信息撩穿,點(diǎn)擊Next;
填寫相關(guān)信息棺棵,點(diǎn)擊Next鲁豪;

填寫相關(guān)信息,點(diǎn)擊Next律秃;

最后點(diǎn)擊Finish爬橡,完成創(chuàng)建。
最后點(diǎn)擊Finish棒动,完成創(chuàng)建糙申。

最后點(diǎn)擊Finish,完成創(chuàng)建船惨。

如果右下角彈出下面這個(gè)提示柜裸,點(diǎn)擊Enable Auto-Import

如果彈出這個(gè)提示缕陕,點(diǎn)擊Enable Auto-Import
如果彈出這個(gè)提示,點(diǎn)擊Enable Auto-Import

創(chuàng)建webapp目錄

點(diǎn)擊File > Project Structure

步驟1

步驟2

步驟3

步驟4

步驟5

步驟6

步驟7

步驟8

構(gòu)建pom文件

Maven項(xiàng)目創(chuàng)建好了疙挺,接下來我們要添加一些jar包的依賴扛邑,也就是在pom.xml中添加各種開源組件的坐標(biāo)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.nnngu</groupId>
    <artifactId>nguSeckill</artifactId>
    <version>1.0-SNAPSHOT</version>

        <!-- 代碼省略铐然,請(qǐng)參照項(xiàng)目的源代碼 -->
        ... ...
        

完整的代碼蔬崩,請(qǐng)查看項(xiàng)目里的pom.xml文件

到此,我們項(xiàng)目的初始化工作完成搀暑。

秒殺系統(tǒng)業(yè)務(wù)分析

秒殺系統(tǒng)業(yè)務(wù)流程如下:

由圖可以發(fā)現(xiàn)沥阳,整個(gè)系統(tǒng)其實(shí)是針對(duì)庫存做的系統(tǒng)。用戶成功秒殺商品自点,對(duì)于我們系統(tǒng)的操作就是:

  1. 減庫存

  2. 記錄用戶的購買明細(xì)桐罕。下面看看我們用戶對(duì)庫存的業(yè)務(wù)分析:

記錄用戶的秒殺成功信息,我們需要記錄:1桂敛、誰購買成功了功炮。2、購買成功的時(shí)間/有效期术唬。3死宣、付款/發(fā)貨信息。這些數(shù)據(jù)組成了用戶的秒殺成功信息碴开,也就是用戶的購買行為毅该。

為什么我們的系統(tǒng)需要事務(wù)?看如下這些故障:1潦牛、若是用戶成功秒殺商品我們記錄了其購買明細(xì)卻沒有減庫存眶掌。導(dǎo)致商品的超賣。2巴碗、減了庫存卻沒有記錄用戶的購買明細(xì)朴爬。導(dǎo)致商品的少賣。對(duì)于上述兩個(gè)故障橡淆,若是沒有事務(wù)的支持召噩,損失最大的無疑是我們的用戶和商家。在MySQL中逸爵,它內(nèi)置的事務(wù)機(jī)制具滴,可以準(zhǔn)確的幫我們完成減庫存和記錄用戶購買明細(xì)的過程。

MySQL實(shí)現(xiàn)秒殺的難點(diǎn)分析:當(dāng)用戶A秒殺id為10的商品時(shí)师倔,此時(shí)MySQL需要進(jìn)行的操作是:1构韵、開啟事務(wù)。2、更新商品的庫存信息疲恢。3凶朗、添加用戶的購買明細(xì),包括用戶秒殺的商品id以及唯一標(biāo)識(shí)用戶身份的信息如電話號(hào)碼等显拳。4棚愤、提交事務(wù)。若此時(shí)有另一個(gè)用戶B也在秒殺這件id為10的商品杂数,他就需要等待宛畦,等待到用戶A成功秒殺到這件商品然后MySQL成功的提交了事務(wù)他才能拿到這個(gè)id為10的商品的鎖從而進(jìn)行秒殺,而同一時(shí)間是不可能只有用戶B在等待耍休,肯定是有很多很多的用戶都在等待拿到這個(gè)行級(jí)鎖。秒殺的難點(diǎn)就在這里货矮,如何高效的處理這些競爭羊精?如何高效的完成事務(wù)?在后面第4個(gè)模塊如何進(jìn)行高并發(fā)的優(yōu)化為大家講解囚玫。

我們這個(gè)系統(tǒng)需要完成秒殺的哪些功能喧锦?先來看看天貓的一個(gè)秒殺庫存系統(tǒng):

大家看了是不是覺得很復(fù)雜?當(dāng)然不用擔(dān)心抓督,我們只是實(shí)現(xiàn)秒殺的一些功能:1燃少、秒殺接口的暴露。2铃在、執(zhí)行秒殺的操作阵具。3、相關(guān)查詢定铜,比如說列表查詢阳液,詳情頁查詢。我們實(shí)現(xiàn)這三個(gè)功能即可揣炕。接下來進(jìn)行具體的編碼工作帘皿,首先是建立數(shù)據(jù)庫以及Dao層的編碼。

建立數(shù)據(jù)庫

-- 創(chuàng)建一個(gè)數(shù)據(jù)庫
CREATE DATABASE ngu_seckill;

-- 使用數(shù)據(jù)庫
USE ngu_seckill;

-- 省略...
... ...

完整的數(shù)據(jù)庫sql代碼畸陡,在項(xiàng)目的sql文件夾里的ngu_seckill.sql

創(chuàng)建實(shí)體類

先創(chuàng)建秒殺商品類com/nnngu/entity/Seckill.java

package com.nnngu.entity;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 秒殺商品
 */
public class Seckill implements Serializable {

    private static final long serialVersionUID = 2912164127598660137L;
    /* 主鍵ID*/
    private long seckillId;
    /*  秒殺商品名字 */
    private String name;
    
    /* 代碼省略鹰溜,請(qǐng)參照項(xiàng)目的源代碼 */
    ... ...
    

創(chuàng)建秒殺狀態(tài)類com/nnngu/entity/SuccessKilled.java

package com.nnngu.entity;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 秒殺后的狀態(tài)
 */
public class SuccessKilled implements Serializable {
    private static final long serialVersionUID = 1834437127882846202L;

    private long seckillId;
    
    /* 用戶的手機(jī)號(hào)碼*/
    private long userPhone;
    
    /* 代碼省略,請(qǐng)參照項(xiàng)目的源代碼 */
    ... ...
    

為實(shí)體類創(chuàng)建對(duì)應(yīng)的mapper接口丁恭,也就是dao接口

com/nnngu/dao/SeckillMapper.java

package com.nnngu.dao;

import com.nnngu.entity.Seckill;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface SeckillMapper {
    /* 代碼省略曹动,請(qǐng)參照項(xiàng)目的源代碼 */
    ... ...
    
}

com/nnngu/dao/SuccessKilledMapper.java

package com.nnngu.dao;

import com.nnngu.entity.SuccessKilled;
import org.apache.ibatis.annotations.Param;

public interface SuccessKilledMapper {
    /* 代碼省略,請(qǐng)參照項(xiàng)目的源代碼 */
    ... ...
    
}

創(chuàng)建對(duì)應(yīng)的mapper.xml

resources目錄下創(chuàng)建com.nnngu.dao包牲览,然后創(chuàng)建SeckillMapper.xmlSuccessKilledMapper.xml仁期,如下圖:

com.nnngu.dao/SeckillMapper.xml

<!-- 這里的代碼省略 -->
<!-- 請(qǐng)參照項(xiàng)目的源代碼 -->

com.nnngu.dao/SuccessKilledMapper.xml

<!-- 這里的代碼省略 -->
<!-- 請(qǐng)參照項(xiàng)目的源代碼 -->

創(chuàng)建Mybatis的配置文件mybatis-config.xml

mybatis-config.xml配置文件的內(nèi)容參照項(xiàng)目的源代碼

建立連接數(shù)據(jù)庫的配置文件jdbc.properties

注意: jdbc.properties 里面的屬性要根據(jù)自己的情況進(jìn)行修改。

建立Spring的dao的配置文件

創(chuàng)建applicationContext-dao.xml如下圖:

applicationContext-dao.xml文件的具體代碼請(qǐng)參照項(xiàng)目的源代碼。

測試

創(chuàng)建測試類 com/nnngu/dao/SeckillMapperTest.java 如下圖:

該文件的具體代碼請(qǐng)參照項(xiàng)目的源代碼跛蛋。

測試結(jié)果

測試查詢所有商品的方法queryAll()

測試結(jié)果如下:

到此熬的,我們成功完成了Dao層開發(fā)及測試。下篇文章 02 Java高并發(fā)秒殺項(xiàng)目之Service層

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊级,一起剝皮案震驚了整個(gè)濱河市押框,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌理逊,老刑警劉巖橡伞,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晋被,居然都是意外死亡兑徘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門羡洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挂脑,“玉大人,你說我怎么就攤上這事欲侮≌赶校” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵威蕉,是天一觀的道長刁俭。 經(jīng)常有香客問我,道長韧涨,這世上最難降的妖魔是什么牍戚? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮虑粥,結(jié)果婚禮上翘魄,老公的妹妹穿的比我還像新娘。我一直安慰自己舀奶,他們只是感情好暑竟,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著育勺,像睡著了一般但荤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涧至,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天腹躁,我揣著相機(jī)與錄音,去河邊找鬼南蓬。 笑死纺非,一個(gè)胖子當(dāng)著我的面吹牛哑了,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烧颖,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼弱左,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了炕淮?” 一聲冷哼從身側(cè)響起拆火,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涂圆,沒想到半個(gè)月后们镜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡润歉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年模狭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踩衩。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚼鹉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出九妈,到底是詐尸還是另有隱情反砌,我是刑警寧澤雾鬼,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布萌朱,位于F島的核電站,受9級(jí)特大地震影響策菜,放射性物質(zhì)發(fā)生泄漏晶疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一又憨、第九天 我趴在偏房一處隱蔽的房頂上張望翠霍。 院中可真熱鬧,春花似錦蠢莺、人聲如沸寒匙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锄弱。三九已至,卻和暖如春祸憋,著一層夾襖步出監(jiān)牢的瞬間会宪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國打工蚯窥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掸鹅,地道東北人塞帐。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像巍沙,于是被迫代替她去往敵國和親葵姥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容