点击上方“Java基基”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
作业调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
来源:http://t.cn/EoOnJbR
项目开发流程
项目环境的搭建
项目效果图
项目的运行
一个整合SSM框架的高并发和商品秒杀项目,学习目前较流行的Java框架组合实现高并发秒杀API
项目开发流程
本项目很适合学习一些技术的基础,这个项目的开发分为几个流程,很基础地教你接触到一个相对有技术含量的项目
Java高并发秒杀API之业务分析与DAO层
Java高并发秒杀API之web层
Java高并发秒杀API之Service层
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包,如果哪天替换版本也很方便
项目效果图
秒杀商品列表
![2aeaad51ce77cf8a2750c42e551a48df.png](https://img-blog.csdnimg.cn/img_convert/2aeaad51ce77cf8a2750c42e551a48df.png)
秒杀结束提示界面
![730c6b6b203ec5718a46345ae36d5fd4.png](https://img-blog.csdnimg.cn/img_convert/730c6b6b203ec5718a46345ae36d5fd4.png)
开始秒杀提示界面
![208565388150863ddbd85c4d26193d47.png](https://img-blog.csdnimg.cn/img_convert/208565388150863ddbd85c4d26193d47.png)
重复秒杀提示界面
![14c73f1d35fb6d0daba2a30e5259a514.png](https://img-blog.csdnimg.cn/img_convert/14c73f1d35fb6d0daba2a30e5259a514.png)
秒杀成功提示界面
![234ed97c2aa765808100d5bb3ab2ba61.png](https://img-blog.csdnimg.cn/img_convert/234ed97c2aa765808100d5bb3ab2ba61.png)
项目的运行
下载
clone
导入到IDE
这里因为是使用IDEA
创建的项目,所以使用IDEA
直接打开是很方便的,提前是你要配置好maven
的相关配置,以及项目JDK
版本,JDK
版本必须在1.8
以上,因为在项目中使用了Java8
的LocalDateTime
以及LocalDate
,所以低于这个版本编译会失败的
IDEA
直接在主界面选择Open
,然后找到项目所在路径,点击pom.xml
打开就可以了Eclipse 这个项目是基于
IDEA
创建,我这里把项目转成了Eclipse
的项目,如果你使用Eclipse的话也可以直接导入,只是步骤更繁琐一点,Eclipse导入步骤
(一)Java高并发秒杀APi之业务分析与DAO层代码编写
构建项目的基本骨架
首先我们要搭建出一个符合Maven约定的目录来,这里大致有两种方式,第一种:
第一种使用命令行手动构建一个maven结构的目录,当然我基本不会这样构建
mvn archetype:generate -DgroupId=com.suny.seckill -DartifactId=seckill -Dpackage=com.suny.seckill -Dversion=
这里要注意的是使用archetype:generate
进行创建,在Maven老版本中是使用archetype:create
,现在这种方法已经被弃用了,所以使用命令行创建的话注意了,稍微解释下这段语句的意思,就是构建一个一个maven-archetype-webapp
骨架的Webapp项目,然后groupId
为com.suny.seckill
,artifactId
为seckill
,这里是Maven相关知识,可以按照自己的情况进行修改
2.第二种直接在IDE中进行创建,这里以IDEA为例
点击左上角
File
然后在里面勾选
Create from archetype
,然后再往下拉找到org.apache.cocoon:cocoon-22-archetype-webapp
,选中它,注意要先勾选那个选项,否则选择不了,然后点击Next
继续
![42b6412ff2e553e4aedaa9cded49e61e.png](https://img-blog.csdnimg.cn/img_convert/42b6412ff2e553e4aedaa9cded49e61e.png)
+然后就填写你的Maven的那几个重要的坐标了,自己看着填吧
![711b85e32220c3dae615f3cba46fdd02.png](https://img-blog.csdnimg.cn/img_convert/711b85e32220c3dae615f3cba46fdd02.png)
+再就配置你的Maven的相关信息,默认应该是配置好的
![f64612274eb5cf81a46dd1aca199a522.png](https://img-blog.csdnimg.cn/img_convert/f64612274eb5cf81a46dd1aca199a522.png)
+之后就是点Finsh
,到此不出意外的话就应该创建成功了
构建pom文件
项目基本的骨架我们就创建出来了,接下来我们要添加一些基本的JAR包的依赖,也就是在pom.xml
中添加各种开源组件的三坐标了
<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/maven-v4_0_0.xsd">
建立数据库
在根目录下有一个sql文件夹里面有一个sql数据库脚本,如果你不想自己手写的话就直接导入到你的数据库里面去吧,不过还是建议自己手写一遍加深印象
-- 整个项目的数据库脚本
在建立数据库的,如果按照我这里的数据库脚本建立的话应该是没问题的,但是我按照视频里面的数据库脚本建表的话发生了一个错误
![f795263e58c81292c74678476dae0637.png](https://img-blog.csdnimg.cn/img_convert/f795263e58c81292c74678476dae0637.png)
这个报错看起来比较的诡异,我仔细检查sql
也没有错误,它总提示我end_time
要有一个默认的值,可我记得我以前就不会这样,然后视频里面也没有执行错误,然后我感觉可能时MySQL
版本的差异,我查看了下我数据库版本,在登录Mysql
控制台后输入指令,在控制台的我暂时知道的有两种方式:
select
我的输出结果如下:
![b0209fdf76a66d458df89998380703fb.png](https://img-blog.csdnimg.cn/img_convert/b0209fdf76a66d458df89998380703fb.png)
进控制台就已经可以看到版本了,我的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不了的同学,可以这样写:
COMMENT
关于timestamp的问题,需要先运行 set explicit_defaults_for_timestamp = 1,否则会报invalid default value错误
还需要注意的是SQL版本的问题会导致视频中seckill表创建会出错。只要将create_time放在start_time和end_time之前是方便的解决方法。
对比下我修改过后的跟视频里面的sql
片段:
![f5bf24d2befa31609ba3b226b9c035de.png](https://img-blog.csdnimg.cn/img_convert/f5bf24d2befa31609ba3b226b9c035de.png)
我们可以看到在这三个字段有一个小差别,那就是给start_time
,end_time
,create_time
三个字段都添加一个默认值,然后执行数据库语句就没问题了
这里我们需要修改下`web.xml`中的servlet版本为`3.0`
打开WEB-INF
下的web.xml
,修改为以下代码:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"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
接口的实现,,我们可以使用Listener
引入Spring
的ContextLoaderListener
举个栗子:
在
Servlet2.3
以前我们这样配置ContextLoaderListener
:
<servlet>
在
Servlet2.3
以后可以使用Listener
配置,也就是我们项目中使用的方法
<listener>
两种方法的效果都是一样的,主要不要同时使用,否则会报错的
建立实体类
首先建立
SuccessKilled
秒杀状态表
package com.suny.entity;
再建立
Seckill
秒杀商品信息
package com.suny.entity;
对实体类创建对应的mapper
接口,也就是dao
接口类
首先创建
SeckillMapper
,在我这里位于com.suny.dao
包下
package com.suny.dao;
再创建
SuccessKilledMapper
package com.suny.dao;
接下来书写xml
配置文件
建立对应的`mapper.xml`
首先在src/main/resources
建立com.suny.dao
这个包,也就是对应mapper
接口文件包一样的包名,这样符合Maven的约定,就是资源放置在Resource
包下,Java
包下则是放置java
类文件,编译后最后还是会在同一个目录下
![b84f3cd3d6451e276122f0fa1a977edc.png](https://img-blog.csdnimg.cn/img_convert/b84f3cd3d6451e276122f0fa1a977edc.png)
首先建立
SeckillMapper.xml
mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
建立
SuccessKilledMapper.xml
mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
建立
Mybatis
的配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
然后建立连接数据库的配置文件
jdbc.properties
,这里的属性要根据自己的需要去进行修改,切勿直接复制使用
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
包下创建applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
基础的部分我们搭建完成了,然后要开始测试了 在
IDEA
里面有一个快速建立测试的快捷键Ctrl+Shift+T
,在某个要测试的类里面按下这个快捷键就会出现Create new Test
,然后选择你要测试的方法跟测试的工具就可以了,这里我们使用Junit作为测试建立
SeckillMapperTest
文件,代码如下
package com.suny.dao;
测试中可能会出现Mybatis
参数绑定失败的错误,在mapper
接口中的方法里面添加@Param
的注解,显示的告诉mybatis参数的名称是什么,例如
List
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
如果你喜欢这篇文章,喜欢,转发。
生活很美好,明天见(。・ω・。)ノ♡