国产午夜男女在线|欧美日本一道高清国产|亚洲日韩乱码中文字幕|麻豆国产97在线精品一区|日韩一区2区三区另类图片|亚洲精品国产99在线观看|亚洲国产午夜福利精品大秀在线|一级做a爰片性色毛片免费网站

          1. <form id="n2a4a"><nav id="n2a4a"></nav></form>
          2. 您當(dāng)前的位置 :寧夏資訊網(wǎng) > 資訊 >  內(nèi)容正文
            投稿

            分享一個整合SSM框架的高并發(fā)和商品秒殺項目!

            寧夏資訊網(wǎng) 2021-02-18 06:38:06 來源: 閱讀:-

            一個整合SSM框架的高并發(fā)和商品秒殺項目,學(xué)習(xí)目前較流行的Java框架組合實現(xiàn)高并發(fā)秒殺API

            項目開發(fā)流程

            本項目很適合學(xué)習(xí)一些技術(shù)的基礎(chǔ),這個項目的開發(fā)分為幾個流程,很基礎(chǔ)地教你接觸到一個相對有技術(shù)含量的項目

            1. Java高并發(fā)秒殺API之業(yè)務(wù)分析與DAO層
            2. Java高并發(fā)秒殺API之web層
            3. Java高并發(fā)秒殺API之Service層
            4. Java高并發(fā)秒殺API之高并發(fā)優(yōu)化


            按照上面幾個流程走下去,你要有基本的Maven認(rèn)識以及Java語法的一些概念,要不然可能不太理解

            其實這幾個流程也就是開發(fā)的流程,首先從DAO層開始開發(fā),從后往前開發(fā),開始Coding吧!

            項目總結(jié)可能比較長,由于公眾號文章的字?jǐn)?shù)限制今天只能先講解第一節(jié),如果這篇文章看得人多并且點贊數(shù)較高的話明天就繼續(xù)更新,哈哈~

            項目環(huán)境的搭建

            • 操作系統(tǒng) : Ubuntu 17.04
            • IDE :IntelliJ IDEA 2016.2.5 x64 用Eclipse也一樣的,工具時靠人用的
            • JDK : JDK1.8 建議使用JDK1.7以上版本,有許多語法糖用著挺舒服的
            • Web容器 : Tomcat 8.0
            • 數(shù)據(jù)庫 :Mysql-5.6.17-WinX64 實驗性的項目用Mysql就足夠啦
            • 依賴管理工具 : Maven 管理jar包真的很方便
            • 這里列出的環(huán)境不是必須的,你喜歡用什么就用什么,這里只是給出參考,不過不同的版本可能會引起各種不同的問題就需要我們自己去發(fā)現(xiàn)以及排查,在這里使用Maven的話時方便我們管理JAR包,我們不用跑去各種開源框架的官網(wǎng)去下載一個又一個的JAR包,配置好了Maven后添加pom文件坐標(biāo)就會從中央倉庫下載JAR包,如果哪天替換版本也很方便

            項目效果圖

            秒殺商品列表


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目


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


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目


            開始秒殺提示界面


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目


            重復(fù)秒殺提示界面


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            秒殺成功提示界面


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目


            項目的運(yùn)行

            下載

            Download Zip或者 git clone

            git clone https://github.com/Sunybyjava/seckill.git

            導(dǎo)入到IDE

            這里因為是使用IDEA創(chuàng)建的項目,所以使用IDEA直接打開是很方便的,提前是你要配置好maven的相關(guān)配置,以及項目JDK版本,JDK版本必須在1.8以上,因為在項目中使用了Java8的LocalDateTime以及LocalDate,所以低于這個版本編譯會失敗的

            • IDEA
            • 直接在主界面選擇Open,然后找到項目所在路徑,點擊pom.xml打開就可以了
            • Eclipse 這個項目是基于IDEA創(chuàng)建,我這里把項目轉(zhuǎn)成了Eclipse的項目,如果你使用Eclipse的話也可以直接導(dǎo)入,只是步驟更繁瑣一點,Eclipse導(dǎo)入步驟

            (一)Java高并發(fā)秒殺APi之業(yè)務(wù)分析與DAO層代碼編寫

            構(gòu)建項目的基本骨架

            • 首先我們要搭建出一個符合Maven約定的目錄來,這里大致有兩種方式,第一種:
            1. 第一種使用命令行手動構(gòu)建一個maven結(jié)構(gòu)的目錄,當(dāng)然我基本不會這樣構(gòu)建


            mvn archetype:generate -DgroupId=com.suny.seckill -DartifactId=seckill -Dpackage=com.suny.seckill -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp


            這里要注意的是使用archetype:generate進(jìn)行創(chuàng)建,在Maven老版本中是使用archetype:create,現(xiàn)在這種方法已經(jīng)被棄用了,所以使用命令行創(chuàng)建的話注意了,稍微解釋下這段語句的意思,就是構(gòu)建一個一個maven-archetype-webapp骨架的Webapp項目,然后groupId為com.suny.seckill ,artifactId為seckill,這里是Maven相關(guān)知識,可以按照自己的情況進(jìn)行修改

            2.第二種直接在IDE中進(jìn)行創(chuàng)建,這里以IDEA為例

            • 點擊左上角File>New>Project>Maven
            • 然后在里面勾選Create from archetype,然后再往下拉找到org.apache.cocoon:cocoon-22-archetype-webapp,選中它,注意要先勾選那個選項,否則選擇不了,然后點擊Next繼續(xù)


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            +然后就填寫你的Maven的那幾個重要的坐標(biāo)了,自己看著填吧


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            +再就配置你的Maven的相關(guān)信息,默認(rèn)應(yīng)該是配置好的


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            +之后就是點Finsh,到此不出意外的話就應(yīng)該創(chuàng)建成功了

            構(gòu)建pom文件

            項目基本的骨架我們就創(chuàng)建出來了,接下來我們要添加一些基本的JAR包的依賴,也就是在pom.xml中添加各種開源組件的三坐標(biāo)了

             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
            4.0.0
            com.suny.seckill
            seckill
            1.0-SNAPSHOT
            seckill Maven Webapp
            http://maven.apache.org



            junit
            junit
            4.12
            test



            ch.qos.logback
            logback-classic
            1.1.7


            org.slf4j
            slf4j-api
            1.7.21


            org.apache.logging.log4j
            log4j-core
            2.6.1




            mysql
            mysql-connector-java
            5.1.39



            c3p0
            c3p0
            0.9.1.2



            org.mybatis
            mybatis
            3.4.2


            org.mybatis
            mybatis-spring
            1.3.1



            taglibs
            standard
            1.1.2


            jstl
            jstl
            1.2



            com.fasterxml.jackson.core
            jackson-databind
            2.8.5


            javax.servlet
            javax.servlet-api
            3.1.0




            org.springframework
            spring-core
            4.3.6.RELEASE


            org.springframework
            spring-beans
            4.3.6.RELEASE


            org.springframework
            spring-context
            4.3.6.RELEASE


            org.springframework
            spring-jdbc
            4.3.7.RELEASE


            org.springframework
            spring-tx
            4.3.6.RELEASE


            org.springframework
            spring-web
            4.3.6.RELEASE


            org.springframework
            spring-webmvc
            4.3.7.RELEASE




            org.springframework
            spring-test
            4.2.7.RELEASE



            seckill



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

            在根目錄下有一個sql文件夾里面有一個sql數(shù)據(jù)庫腳本,如果你不想自己手寫的話就直接導(dǎo)入到你的數(shù)據(jù)庫里面去吧,不過還是建議自己手寫一遍加深印象

            -- 整個項目的數(shù)據(jù)庫腳本
            -- 開始創(chuàng)建一個數(shù)據(jù)庫
            CREATE DATABASE seckill;
            -- 使用數(shù)據(jù)庫
            USE seckill;
            -- 創(chuàng)建秒殺庫存表
            CREATE TABLE seckill(
            `seckill_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品庫存ID',
            `name` VARCHAR(120) NOT NULL COMMENT '商品名稱',
            `number` INT NOT NULL COMMENT '庫存數(shù)量',
            `start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '秒殺開啟的時間',
            `end_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '秒殺結(jié)束的時間',
            `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '創(chuàng)建的時間',
            PRIMARY KEY (seckill_id),
            KEY idx_start_time(start_time),
            KEY idx_end_time(end_time),
            KEY idx_create_time(create_time)
            )ENGINE =InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒殺庫存表';
            -- 插入初始化數(shù)據(jù)
            insert into
            seckill(name,number,start_time,end_time)
            values
            ('1000元秒殺iphone6',100,'2016-5-22 00:00:00','2016-5-23 00:00:00'),
            ('500元秒殺iPad2',200,'2016-5-22 00:00:00','2016-5-23 00:00:00'),
            ('300元秒殺小米4',300,'2016-5-22 00:00:00','2016-5-23 00:00:00'),
            ('200元秒殺紅米note',400,'2016-5-22 00:00:00','2016-5-23 00:00:00');
            -- 秒殺成功明細(xì)表
            -- 用戶登錄相關(guān)信息
            create table success_killed(
            `seckill_id` BIGINT NOT NULL COMMENT '秒殺商品ID',
            `user_phone` BIGINT NOT NULL COMMENT '用戶手機(jī)號',
            `state` TINYINT NOT NULL DEFAULT -1 COMMENT '狀態(tài)標(biāo)示:-1無效 0成功 1已付款',
            `create_time` TIMESTAMP NOT NULL COMMENT '創(chuàng)建時間',
            PRIMARY KEY (seckill_id,user_phone), /*聯(lián)合主鍵*/
            KEY idx_create_time(create_time)
            )ENGINE =InnDB DEFAULT CHARSET =utf8 COMMENT ='秒殺成功明細(xì)表'


            在建立數(shù)據(jù)庫的,如果按照我這里的數(shù)據(jù)庫腳本建立的話應(yīng)該是沒問題的,但是我按照視頻里面的數(shù)據(jù)庫腳本建表的話發(fā)生了一個錯誤


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            這個報錯看起來比較的詭異,我仔細(xì)檢查sql也沒有錯誤,它總提示我end_time要有一個默認(rèn)的值,可我記得我以前就不會這樣,然后視頻里面也沒有執(zhí)行錯誤,然后我感覺可能時MySQL版本的差異,我查看了下我數(shù)據(jù)庫版本,在登錄Mysql控制臺后輸入指令,在控制臺的我暫時知道的有兩種方式:

            select version(); 
            select @@version;


            我的輸出結(jié)果如下:


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            進(jìn)控制臺就已經(jīng)可以看到版本了,我的Mysql是5.7的,以前我用的時5.6的,然后去Google上搜索了下,找到了幾個答案,參考鏈接:

            • https://stackoverflow.com/questions/9192027/invalid-default-value-for-create-date-timestamp-field
            • mysql官方的解釋:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date
            • https://stackoverflow.com/questions/34570611/mysql-community-5-7-invalid-default-value-datetime-field-type


            總結(jié)出來一句話就是:

            mysql 5.7中,默認(rèn)使用的是嚴(yán)格模式,這里的日期必須要有時間,所以一定要給出默認(rèn)值,要么就修改數(shù)據(jù)庫設(shè)置

            然后網(wǎng)友評論里總結(jié)出來的幾種解決辦法,未經(jīng)測試!:

            • 下次有問題一定要先看一下評論?。?!create不了的同學(xué),可以這樣寫:


            `start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺開始時間',
            `end_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒殺結(jié)束時間',
            `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',


            • 關(guān)于timestamp的問題,需要先運(yùn)行 set explicit_defaults_for_timestamp = 1,否則會報invalid default value錯誤
            • 還需要注意的是SQL版本的問題會導(dǎo)致視頻中seckill表創(chuàng)建會出錯。只要將create_time放在start_time和end_time之前是方便的解決方法。


            對比下我修改過后的跟視頻里面的sql片段:


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目



            我們可以看到在這三個字段有一個小差別,那就是給start_time,end_time,create_time三個字段都添加一個默認(rèn)值,然后執(zhí)行數(shù)據(jù)庫語句就沒問題了


            這里我們需要修改下web.xml中的servlet版本為3.0

            打開WEB-INF下的web.xml,修改為以下代碼:

             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
            version="3.0"
            metadata-complete="true">


            修改的原因有以下幾點:

            • 高版本的Servlet支持更多的特性,更方便我們的Coding,特別是支持注解這一特性
            • 在Servlet2.3中新加入了Listener接口的實現(xiàn),,我們可以使用Listener引入Spring的ContextLoaderListener

            舉個栗子:

            • 在Servlet2.3以前我們這樣配置ContextLoaderListener:



            context
            org.springframework.context.ContextLoaderServlet
            1


            • 在Servlet2.3以后可以使用Listener配置,也就是我們項目中使用的方法



            org.springframework.context.ContextLoaderListener


            兩種方法的效果都是一樣的,主要不要同時使用,否則會報錯的

            建立實體類

            • 首先建立SuccessKilled 秒殺狀態(tài)表


            package com.suny.entity;
            import java.io.Serializable;
            import java.time.LocalDateTime;
            public class SuccessKilled implements Serializable {
            private static final long serialVersionUID = 1834437127882846202L;
            private long seckillId;
            /* 用戶的手機(jī)號碼*/
            private long userPhone;
            /* 秒殺的狀態(tài)*/
            private short state;
            /* 創(chuàng)建時間*/
            private LocalDateTime createTime;
            /* 多對一,因為一件商品在庫存中肯定有許多,對應(yīng)的購買信息也有很多*/
            private Seckill seckill;
            public SuccessKilled() {
            }
            public SuccessKilled(long seckillId, long userPhone, short state, LocalDateTime createTime, Seckill seckill) {
            this.seckillId = seckillId;
            this.userPhone = userPhone;
            this.state = state;
            this.createTime = createTime;
            this.seckill = seckill;
            }
            public long getSeckillId() {
            return seckillId;
            }
            public void setSeckillId(long seckillId) {
            this.seckillId = seckillId;
            }
            public long getUserPhone() {
            return userPhone;
            }
            public void setUserPhone(long userPhone) {
            this.userPhone = userPhone;
            }
            public short getState() {
            return state;
            }
            public void setState(short state) {
            this.state = state;
            }
            public LocalDateTime getCreateTime() {
            return createTime;
            }
            public void setCreateTime(LocalDateTime createTime) {
            this.createTime = createTime;
            }
            public Seckill getSeckill() {
            return seckill;
            }
            public void setSeckill(Seckill seckill) {
            this.seckill = seckill;
            }
            @Override
            public String toString() {
            return "SuccessKilled{" +
            "主鍵ID=" + seckillId +
            ", 手機(jī)號碼=" + userPhone +
            ", 秒殺狀態(tài)=" + state +
            ", 創(chuàng)建時間=" + createTime +
            ", 秒殺的商品=" + seckill +
            '}';
            }
            }


            • 再建立Seckill 秒殺商品信息


            package com.suny.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;
            /* 秒殺的商品編號 */
            private int number;
            /* 開始秒殺的時間 */
            private LocalDateTime startTime;
            /* 結(jié)束秒殺的時間 */
            private LocalDateTime endTime;
            /* 創(chuàng)建的時間 */
            private LocalDateTime createTIme;
            public Seckill() {
            }
            public Seckill(long seckillId, String name, int number, LocalDateTime startTime, LocalDateTime endTime, LocalDateTime createTIme) {
            this.seckillId = seckillId;
            this.name = name;
            this.number = number;
            this.startTime = startTime;
            this.endTime = endTime;
            this.createTIme = createTIme;
            }
            public long getSeckillId() {
            return seckillId;
            }
            public void setSeckillId(long seckillId) {
            this.seckillId = seckillId;
            }
            public String getName() {
            return name;
            }
            public void setName(String name) {
            this.name = name;
            }
            public int getNumber() {
            return number;
            }
            public void setNumber(int number) {
            this.number = number;
            }
            public LocalDateTime getStartTime() {
            return startTime;
            }
            public void setStartTime(LocalDateTime startTime) {
            this.startTime = startTime;
            }
            public LocalDateTime getEndTime() {
            return endTime;
            }
            public void setEndTime(LocalDateTime endTime) {
            this.endTime = endTime;
            }
            public LocalDateTime getCreateTIme() {
            return createTIme;
            }
            public void setCreateTIme(LocalDateTime createTIme) {
            this.createTIme = createTIme;
            }
            @Override
            public String toString() {
            return "com.suny.entity.Seckill{" +
            "主鍵ID=" + seckillId +
            ", 秒殺商品='" + name + '\'' +
            ", 編號=" + number +
            ", 開始秒殺時間=" + startTime +
            ", 結(jié)束秒殺時間=" + endTime +
            ", 創(chuàng)建時間=" + createTIme +
            '}';
            }
            }


            對實體類創(chuàng)建對應(yīng)的mapper接口,也就是dao接口類

            • 首先創(chuàng)建SeckillMapper,在我這里位于com.suny.dao包下


            package com.suny.dao;
            import com.suny.entity.Seckill;
            import org.apache.ibatis.annotations.Param;
            import java.time.LocalDateTime;
            import java.util.List;
            public interface SeckillMapper {
            /**
            * 根據(jù)傳過來的seckillId去減少商品的庫存.
            *
            * @param seckillId 秒殺商品ID
            * @param killTime 秒殺的精確時間
            * @return 如果秒殺成功就返回1,否則就返回0
            */
            int reduceNumber(@Param("seckillId") long seckillId, @Param("killTime") LocalDateTime killTime);
            /**
            * 根據(jù)傳過來的seckillId去查詢秒殺商品的詳情.
            *
            * @param seckillId 秒殺商品ID
            * @return 對應(yīng)商品ID的的數(shù)據(jù)
            */
            Seckill queryById(@Param("seckillId") long seckillId);
            /**
            * 根據(jù)一個偏移量去查詢秒殺的商品列表.
            *
            * @param offset 偏移量
            * @param limit 限制查詢的數(shù)據(jù)個數(shù)
            * @return 符合偏移量查出來的數(shù)據(jù)個數(shù)
            */
            List queryAll(@Param("offset") int offset, @Param("limit") int limit);
            }


            • 再創(chuàng)建SuccessKilledMapper


            package com.suny.dao;
            import com.suny.entity.SuccessKilled;
            import org.apache.ibatis.annotations.Param;
            public interface SuccessKilledMapper {
            /**
            * 插入一條詳細(xì)的購買信息.
            *
            * @param seckillId 秒殺商品的ID
            * @param userPhone 購買用戶的手機(jī)號碼
            * @return 成功插入就返回1, 否則就返回0
            */
            int insertSuccessKilled(@Param("seckillId") long seckillId, @Param("userPhone") long userPhone);
            /**
            * 根據(jù)秒殺商品的ID查詢SuccessKilled的明細(xì)信息.
            *
            * @param seckillId 秒殺商品的ID
            * @param userPhone 購買用戶的手機(jī)號碼
            * @return 秒殺商品的明細(xì)信息
            */
            SuccessKilled queryByIdWithSeckill(@Param("seckillId") long seckillId, @Param("userPhone") long userPhone);
            }


            接下來書寫xml配置文件

            建立對應(yīng)的mapper.xml

            首先在src/main/resources建立com.suny.dao這個包,也就是對應(yīng)mapper接口文件包一樣的包名,這樣符合Maven的約定,就是資源放置在Resource包下,Java包下則是放置java類文件,編譯后最后還是會在同一個目錄下


            分享一個整合SSM框架的高并發(fā)和商品秒殺項目


            • 首先建立SeckillMapper.xml


             PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">



            UPDATE seckill
            SET number = number - 1
            WHERE seckill_id = #{seckillId}
            AND start_time
            <=
            ]]>
            #{killTime}
            AND end_time >= #{killTime}
            AND number > 0





            • 建立SuccessKilledMapper.xml


             PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">



            INSERT IGNORE INTO success_killed (seckill_id, user_phone, state)
            VALUES (#{seckillId}, #{userPhone}, 0)





            • 建立Mybatis的配置文件mybatis-config.xml



            "-//mybatis.org//DTD MyBatis Generator Configuration 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd" >












            • 然后建立連接數(shù)據(jù)庫的配置文件jdbc.properties,這里的屬性要根據(jù)自己的需要去進(jìn)行修改,切勿直接復(fù)制使用


            jdbc.driver=com.mysql.jdbc.Driver
            jdbc.user=root
            jdbc.password=root
            jdbc.url=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf-8


            • 建立Spring的dao的配置文件,在resources包下創(chuàng)建applicationContext-dao.xml




            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">





































            • 基礎(chǔ)的部分我們搭建完成了,然后要開始測試了 在IDEA里面有一個快速建立測試的快捷鍵Ctrl+Shift+T,在某個要測試的類里面按下這個快捷鍵就會出現(xiàn)Create new Test,然后選擇你要測試的方法跟測試的工具就可以了,這里我們使用Junit作為測試
            • 建立SeckillMapperTest文件,代碼如下


            package com.suny.dao;
            import com.suny.entity.Seckill;
            import org.junit.Test;
            import org.junit.runner.RunWith;
            import org.springframework.test.context.ContextConfiguration;
            import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
            import javax.annotation.Resource;
            import java.time.LocalDateTime;
            import java.util.List;
            import static org.junit.Assert.*;
            @RunWith(SpringJUnit4ClassRunner.class)
            @ContextConfiguration({"classpath:spring/applicationContext-dao.xml"})
            public class SeckillMapperTest {
            @Resource
            private SeckillMapper seckillMapper;
            @Test
            public void reduceNumber() throws Exception {
            long seckillId=1000;
            LocalDateTime localDateTime=LocalDateTime.now();
            int i = seckillMapper.reduceNumber(seckillId, localDateTime);
            System.out.println(i);
            }
            @Test
            public void queryById() throws Exception {
            long seckillId = 1000;
            Seckill seckill = seckillMapper.queryById(seckillId);
            System.out.println(seckill.toString());
            }
            @Test
            public void queryAll() throws Exception {
            List seckills = seckillMapper.queryAll(0, 100);
            for (Seckill seckill : seckills) {
            System.out.println(seckill.toString());
            }
            }
            }


            測試中可能會出現(xiàn)Mybatis參數(shù)綁定失敗的錯誤,在mapper接口中的方法里面添加@Param的注解,顯示的告訴mybatis參數(shù)的名稱是什么,例如

            List queryAll(@Param("offset") int offset, @Param("limit") int limit);




            (正文已結(jié)束)

            推薦閱讀:臨沂熱線

            免責(zé)聲明及提醒:此文內(nèi)容為本網(wǎng)所轉(zhuǎn)載企業(yè)宣傳資訊,該相關(guān)信息僅為宣傳及傳遞更多信息之目的,不代表本網(wǎng)站觀點,文章真實性請瀏覽者慎重核實!任何投資加盟均有風(fēng)險,提醒廣大民眾投資需謹(jǐn)慎!

            網(wǎng)站簡介 - 聯(lián)系我們 - 營銷服務(wù) - XML地圖 - 版權(quán)聲明 - 網(wǎng)站地圖TXT
            Copyright.2002-2019 寧夏資訊網(wǎng) 版權(quán)所有 本網(wǎng)拒絕一切非法行為 歡迎監(jiān)督舉報 如有錯誤信息 歡迎糾正
            宜丰县| 竹北市| 蕉岭县| 临泉县| 新化县| 大厂| 喀什市| 揭阳市| 榆树市| 江达县| 竹溪县| 胶州市| 昌吉市| 卫辉市| 遂溪县| 永康市| 湘阴县| 大竹县| 若尔盖县| 奈曼旗| 开鲁县| 金坛市| 罗江县| 齐河县| 扶风县| 东阿县| 弥渡县| 闽侯县| 措勤县| 静安区| 岗巴县| 左云县| 文成县| 毕节市| 麟游县| 黄平县| 平顺县| 贵阳市| 诏安县| 赣州市| 江口县|