eclipse 导入maven项目_分享一个整合 SSM 框架的高并发和商品秒杀项目

  • 项目开发流程
  • 项目环境的搭建
  • 项目效果图
  • 项目的运行

一个整合SSM框架的高并发和商品秒杀项目,学习目前较流行的Java框架组合实现高并发秒杀API

项目开发流程

本项目很适合学习一些技术的基础,这个项目的开发分为几个流程,很基础地教你接触到一个相对有技术含量的项目

  1. Java高并发秒杀API之业务分析与DAO层
  2. Java高并发秒杀API之web层
  3. Java高并发秒杀API之Service层
  4. Java高并发秒杀API之高并发优化

按照上面几个流程走下去,你要有基本的Maven认识以及Java语法的一些概念,要不然可能不太理解

其实这几个流程也就是开发的流程,首先从DAO层开始开发,从后往前开发,开始Coding吧!

项目总结可能比较长,由于公众号文章的字数限制今天只能先讲解第一节,如果这篇文章看得人多并且点赞数较高的话明天就继续更新,哈哈~

项目环境的搭建

  • 操作系统 : Ubuntu 17.04
  • IDE :IntelliJ IDEA 2016.2.5 x64 用Eclipse也一样的,工具时靠人用的
  • JDK : JDK1.8 建议使用JDK1.7以上版本,有许多语法糖用着挺舒服的
  • Web容器 : Tomcat 8.0
  • 数据库 :Mysql-5.6.17-WinX64 实验性的项目用Mysql就足够啦
  • 依赖管理工具 : Maven 管理jar包真的很方便
  • 这里列出的环境不是必须的,你喜欢用什么就用什么,这里只是给出参考,不过不同的版本可能会引起各种不同的问题就需要我们自己去发现以及排查,在这里使用Maven的话时方便我们管理JAR包,我们不用跑去各种开源框架的官网去下载一个又一个的JAR包,配置好了Maven后添加pom文件坐标就会从中央仓库下载JAR包,如果哪天替换版本也很方便

项目效果图

秒杀商品列表

b8e89c580d7db5e6c93420580471ab8e.png

img

秒杀结束提示界面

1be8d71d938feb1e0c8cc08fb7a05cf2.png

img

开始秒杀提示界面

fab1bb0db7874e4ae7b2566dbac9df84.png

img

重复秒杀提示界面

11ebc41c45a84f6c482dad40382bb6d1.png

img

秒杀成功提示界面

3bd90fce1f2a60023d8ffbbe2ff20183.png

img

项目的运行

下载

Download Zip`或者 `git clonegit clone https://github.com/Sunybyjava/seckill.git

导入到IDE

这里因为是使用IDEA创建的项目,所以使用IDEA直接打开是很方便的,提前是你要配置好maven的相关配置,以及项目JDK版本,JDK版本必须在1.8以上,因为在项目中使用了Java8的LocalDateTime以及LocalDate,所以低于这个版本编译会失败的

  • IDEA
  • 直接在主界面选择Open,然后找到项目所在路径,点击pom.xml打开就可以了
  • Eclipse 这个项目是基于IDEA创建,我这里把项目转成了Eclipse的项目,如果你使用Eclipse的话也可以直接导入,只是步骤更繁琐一点,Eclipse导入步骤

(一)Java高并发秒杀APi之业务分析与DAO层代码编写

构建项目的基本骨架

  • 首先我们要搭建出一个符合Maven约定的目录来,这里大致有两种方式,第一种:
  1. 第一种使用命令行手动构建一个maven结构的目录,当然我基本不会这样构建
mvn archetype:generate -DgroupId=com.suny.seckill -DartifactId=seckill -Dpackage=com.suny.seckill -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp

这里要注意的是使用archetype:generate进行创建,在Maven老版本中是使用archetype:create,现在这种方法已经被弃用了,所以使用命令行创建的话注意了,稍微解释下这段语句的意思,就是构建一个一个maven-archetype-webapp骨架的Webapp项目,然后groupId为com.suny.seckill,artifactId为seckill,这里是Maven相关知识,可以按照自己的情况进行修改

2.第二种直接在IDE中进行创建,这里以IDEA为例

  • 点击左上角File>New>Project>Maven
  • 然后在里面勾选Create from archetype,然后再往下拉找到org.apache.cocoon:cocoon-22-archetype-webapp,选中它,注意要先勾选那个选项,否则选择不了,然后点击Next继续
8b768237654d281c79d34cbe39d614cf.png

img

+然后就填写你的Maven的那几个重要的坐标了,自己看着填吧

56183f0325d22d7114c5077c599c885f.png

img

+再就配置你的Maven的相关信息,默认应该是配置好的

8843fe21f8f447c7cbbdb92ae39686ca.png

img

+之后就是点Finsh,到此不出意外的话就应该创建成功了

构建pom文件

项目基本的骨架我们就创建出来了,接下来我们要添加一些基本的JAR包的依赖,也就是在pom.xml中添加各种开源组件的三坐标了

4.0.0com.suny.seckill seckill 1.0-SNAPSHOTseckill Maven Webapphttp://maven.apache.orgjunit junit 4.12testch.qos.logback logback-classic 1.1.7org.slf4j slf4j-api 1.7.21org.apache.logging.log4j log4j-core 2.6.1mysql mysql-connector-java 5.1.39c3p0 c3p0 0.9.1.2org.mybatis mybatis 3.4.2org.mybatis mybatis-spring 1.3.1taglibs standard 1.1.2jstl jstl 1.2com.fasterxml.jackson.core jackson-databind 2.8.5javax.servlet javax.servlet-api 3.1.0org.springframework spring-core 4.3.6.RELEASEorg.springframework spring-beans 4.3.6.RELEASEorg.springframework spring-context 4.3.6.RELEASEorg.springframework spring-jdbc 4.3.7.RELEASEorg.springframework spring-tx 4.3.6.RELEASEorg.springframework spring-web 4.3.6.RELEASEorg.springframework spring-webmvc 4.3.7.RELEASEorg.springframework spring-test 4.2.7.RELEASEseckill

建立数据库

在根目录下有一个sql文件夹里面有一个sql数据库脚本,如果你不想自己手写的话就直接导入到你的数据库里面去吧,不过还是建议自己手写一遍加深印象

-- 整个项目的数据库脚本-- 开始创建一个数据库CREATE DATABASE seckill;-- 使用数据库USE seckill;-- 创建秒杀库存表CREATE TABLE seckill( `seckill_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品库存ID', `name` VARCHAR(120) NOT NULL COMMENT '商品名称', `number` INT NOT NULL COMMENT '库存数量', `start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '秒杀开启的时间', `end_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '秒杀结束的时间', `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '创建的时间', 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='秒杀库存表';-- 插入初始化数据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');-- 秒杀成功明细表-- 用户登录相关信息create table success_killed( `seckill_id` BIGINT NOT NULL COMMENT '秒杀商品ID', `user_phone` BIGINT NOT NULL COMMENT '用户手机号', `state` TINYINT NOT NULL DEFAULT -1 COMMENT '状态标示:-1无效 0成功 1已付款', `create_time` TIMESTAMP NOT NULL COMMENT '创建时间', PRIMARY KEY (seckill_id,user_phone), /*联合主键*/ KEY idx_create_time(create_time))ENGINE =InnDB DEFAULT CHARSET =utf8 COMMENT ='秒杀成功明细表'

在建立数据库的,如果按照我这里的数据库脚本建立的话应该是没问题的,但是我按照视频里面的数据库脚本建表的话发生了一个错误

60af360716eafd155d017235cf94a548.png

img

这个报错看起来比较的诡异,我仔细检查sql也没有错误,它总提示我end_time要有一个默认的值,可我记得我以前就不会这样,然后视频里面也没有执行错误,然后我感觉可能时MySQL版本的差异,我查看了下我数据库版本,在登录Mysql控制台后输入指令,在控制台的我暂时知道的有两种方式:

select version();select @@version;

我的输出结果如下:

ca31dc9b8ef64b369323f873b5f88ee2.png

img

进控制台就已经可以看到版本了,我的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

总结出来一句话就是:

mysql 5.7中,默认使用的是严格模式,这里的日期必须要有时间,所以一定要给出默认值,要么就修改数据库设置

然后网友评论里总结出来的几种解决办法,未经测试!:

  • 下次有问题一定要先看一下评论!!!create不了的同学,可以这样写:
`start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒杀开始时间', `end_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '秒杀结束时间', `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  • 关于timestamp的问题,需要先运行 set explicit_defaults_for_timestamp = 1,否则会报invalid default value错误
  • 还需要注意的是SQL版本的问题会导致视频中seckill表创建会出错。只要将create_time放在start_time和end_time之前是方便的解决方法。

对比下我修改过后的跟视频里面的sql片段:

d7ac9d37ef6425ce863df5fe17d5e1be.png

img

我们可以看到在这三个字段有一个小差别,那就是给start_time,end_time,create_time三个字段都添加一个默认值,然后执行数据库语句就没问题了


这里我们需要修改下`web.xml`中的servlet版本为`3.0`

打开WEB-INF下的web.xml,修改为以下代码:

修改的原因有以下几点:

  • 高版本的Servlet支持更多的特性,更方便我们的Coding,特别是支持注解这一特性
  • 在Servlet2.3中新加入了Listener接口的实现,,我们可以使用Listener引入Spring的ContextLoaderListener

举个栗子:

  • 在Servlet2.3以前我们这样配置ContextLoaderListener:
contextorg.springframework.context.ContextLoaderServlet1
  • 在Servlet2.3以后可以使用Listener配置,也就是我们项目中使用的方法
org.springframework.context.ContextLoaderListener

两种方法的效果都是一样的,主要不要同时使用,否则会报错的

建立实体类

  • 首先建立SuccessKilled 秒杀状态表
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; /* 用户的手机号码*/ private long userPhone; /* 秒杀的状态*/ private short state; /* 创建时间*/ private LocalDateTime createTime; /* 多对一,因为一件商品在库存中肯定有许多,对应的购买信息也有很多*/ 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 + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值