Java秒杀简单设计二:数据库表Dao层设计

上一篇中搭建springboot项目环境和设计数据库表  https://www.cnblogs.com/taiguyiba/p/9791431.html

在此基础上设计数据库表Dao层代码

1.数据库表设计

项目涉及到两张表,seckill:秒杀库存表,success_killed:秒杀成功明细表

seckill:秒杀库存表

  1. CREATE TABLE `seckill` (
  2. `seckill_id` bigint() NOT NULL AUTO_INCREMENT COMMENT '商品库存ID',
  3. `name` varchar() CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称',
  4. `number` int() NOT NULL COMMENT '库存数量',
  5. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  6. `start_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '秒杀开始时间',
  7. `end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '秒杀结束时间',
  8. PRIMARY KEY (`seckill_id`) USING BTREE,
  9. INDEX `idx_start_time`(`start_time`) USING BTREE,
  10. INDEX `idx_end_time`(`end_time`) USING BTREE,
  11. INDEX `idx_create_time`(`create_time`) USING BTREE
  12. ) ENGINE = InnoDB AUTO_INCREMENT = CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '秒杀库存表';

插入数据:

  1. INSERT INTO `seckill` VALUES (, '1000元秒杀iphone6', , '2018-10-14 22:36:57', '2016-01-01 00:00:00', '2016-01-02 00:00:00');
  2. INSERT INTO `seckill` VALUES (, '800元秒杀ipad', , '2018-10-14 22:36:57', '2016-01-01 00:00:00', '2016-01-02 00:00:00');
  3. INSERT INTO `seckill` VALUES (, '6600元秒杀mac book pro', , '2018-10-14 22:36:57', '2016-01-01 00:00:00', '2016-01-02 00:00:00');
  4. INSERT INTO `seckill` VALUES (, '7000元秒杀iMac', , '2018-10-14 22:36:57', '2016-01-01 00:00:00', '2016-01-02 00:00:00');

success_killed:秒杀成功明细表

  1. CREATE TABLE `success_killed` (
  2. `seckill_id` bigint() NOT NULL COMMENT '秒杀商品ID',
  3. `user_phone` bigint() NOT NULL COMMENT '用户手机号',
  4. `state` tinyint() NOT NULL DEFAULT - COMMENT '状态标识:-1:无效 0:成功 1:已付款 2:已发货',
  5. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  6. PRIMARY KEY (`seckill_id`, `user_phone`) USING BTREE,
  7. INDEX `idx_create_time`(`create_time`) USING BTREE
  8. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '秒杀成功明细表';

2.Dao设计

首先在 SeckillApplication.java文件中添加Mapper扫描注解@MapperScan("com.seckill.dao")

  1. package com.seckill;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @MapperScan("com.seckill.dao")
  7. public class SeckillApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(SeckillApplication.class, args);
  10. }
  11. }

创建SeckillDao.java文件:

包括减库存、查询、使用存储过程秒杀等方法

  1. package com.seckill.dao;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.Map;
  5. import org.apache.ibatis.annotations.Param;
  6. import com.seckill.entity.Seckill;
  7. public interface SeckillDao {
  8. /**
  9. * 减库存
  10. * @param seckillId
  11. * @param killTime
  12. * @return 如果影响行数>1,表示更新库存的记录行数
  13. */
  14. int reduceNumber(@Param("seckillId") long seckillId,@Param("killTime") Date killTime);
  15. /**
  16. * 根据id查询秒杀的商品信息
  17. * @param seckillId
  18. * @return
  19. */
  20. Seckill queryById(@Param("seckillId") long seckillId);
  21. /**
  22. * 根据偏移量查询秒杀商品列表
  23. * @param offset
  24. * @param limit
  25. * @return
  26. */
  27. List<Seckill> queryAll(@Param("offset") int offset,@Param("limit")int limit);
  28. /**
  29. * 使用存储过程执行秒杀
  30. * @param paramMap
  31. */
  32. void killByProcedure(Map<String,Object> paramMap);
  33. }

 注意:Java没有保存形参的记录,queryAll(int offset,int limit) ==> queryAll(arg0,arg1),所以在多个参数的时候,需要使用注解:@Param

创建 SuccessKilledDao.java文件

  1. package com.seckill.dao;
  2.  
  3. import org.apache.ibatis.annotations.Param;
  4.  
  5. import com.seckill.entity.SuccessKilled;
  6.  
  7. public interface SuccessKilledDao {
  8.  
  9. /**
  10. * 插入购买明细,可过滤重复
  11. * @param seckillId
  12. * @param userPhone
  13. * @return 插入的行数
  14. */
  15. int insertSuccessKilled(@Param("seckillId") long seckillId,@Param("userPhone") long userPhone);
  16. /**
  17. * 根据秒杀商品ID查询明细SuccessKilled对象, 携带了Seckill秒杀产品对象
  18. * @param seckillId
  19. * @param userPhone
  20. * @return
  21. */
  22. SuccessKilled queryByIdWithSeckill(@Param("seckillId") long seckillId,@Param("userPhone") long userPhone);
  23. }

创建SeckillDao.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="com.seckill.dao.SeckillDao">
  7. <update id="reduceNumber">
  8. UPDATE seckill
  9. SET number = number -
  10. WHERE seckill_id = #{seckillId}
  11. AND start_time <![CDATA[ <= ]]> #{killTime}
  12. AND end_time >= #{killTime}
  13. AND number >
  14. </update>
  15.  
  16. <select id="queryById" resultType="Seckill" parameterType="long">
  17. SELECT *
  18. FROM seckill
  19. WHERE seckill_id = #{seckillId}
  20. </select>
  21.  
  22. <select id="queryAll" resultType="Seckill">
  23. SELECT *
  24. FROM seckill
  25. ORDER BY create_time DESC
  26. limit #{offset},#{limit}
  27. </select>
  28. <!-- 使用mybatis调用存储过程 -->
  29. <select id="killByProcedure" statementType="CALLABLE">
  30. call execute_seckill(
  31. #{seckillId,jdbcType=BIGINT,mode=IN},
  32. #{phone,jdbcType=BIGINT,mode=IN},
  33. #{killTime,jdbcType =TIMESTAMP,mode=IN},
  34. #{result,jdbcType=INTEGER,mode=OUT}
  35. )
  36. </select>
  37. </mapper>

SuccessKilledDao.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="com.seckill.dao.SuccessKilledDao">
  7. <insert id="insertSuccessKilled">
  8. <!--当出现主键冲突时(即重复秒杀时),会报错;不想让程序报错,加入ignore-->
  9. INSERT ignore INTO success_killed(seckill_id,user_phone,state)
  10. VALUES (#{seckillId},#{userPhone},0)
  11. </insert>
  12.  
  13. <select id="queryByIdWithSeckill" resultType="SuccessKilled">
  14. <!--根据seckillId查询SuccessKilled对象,并携带Seckill对象-->
  15. <!--如何告诉mybatis把结果映射到SuccessKill属性同时映射到Seckill属性-->
  16. <!--可以自由控制SQL语句-->
  17. SELECT
  18. sk.seckill_id,
  19. sk.user_phone,
  20. sk.create_time,
  21. sk.state,
  22. s.seckill_id "seckill.seckill_id",
  23. s.name "seckill.name",
  24. s.number "seckill.number",
  25. s.start_time "seckill.start_time",
  26. s.end_time "seckill.end_time",
  27. s.create_time "seckill.create_time"
  28. FROM success_killed sk
  29. INNER JOIN seckill s ON sk.seckill_id = s.seckill_id
  30. WHERE sk.seckill_id=#{seckillId} and sk.user_phone=#{userPhone}
  31. </select>
  32. </mapper>

Java秒杀简单设计二:数据库表和Dao层设计的更多相关文章

  1. Java秒杀简单设计三:数据封装类

    上一篇https://www.cnblogs.com/taiguyiba/p/9828984.html 整合了数据库表和Dao层代码 这一篇继续设计数据封装类: 涉及到获取秒杀地址,查询,返回秒杀结果 ...

  2. Java秒杀简单设计一:搭建springboot环境

    项目参考:慕课网  https://www.imooc.com/learn/587 Java秒杀 开发环境 JDK1.8.Maven.Mysql.Eclipse.SpringBoot2.0.5.myb ...

  3. 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。

    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了.   步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...

  4. facade层,service 层,domain层,dao 层设计

    转自http://fei-6666.iteye.com/blog/446247,记录下来 一,Service->DAO,只能在Service中注入DAO. 二,DAO只能操作但表数据,跨表操作放 ...

  5. Java秒杀简单设计四:service层设计

    接上一篇 https://www.cnblogs.com/taiguyiba/p/9829191.html  封装了系统传递的数据类和异常类 本文继续设计service层设计: 1.SeckillSe ...

  6. java实现excel表格导入数据库表

    导入excel就是一个上传excel文件,然后获取excel文件数据,然后处理数据并插入到数据库的过程 一.上传excel 前端jsp页面,我的是index.jsp 在页面中我自己加入了一个下载上传文 ...

  7. java工具类–自动将数据库表生成javabean

    最近和数据库的表打交道挺多的,因为暂时做的是接口活. 在这过程中发现要把表转换成对应的javabean类型,字段少的表还行,如果不小心碰到几十个字段的他妈的写起来就有点麻烦了,万一碰到几百个的呢,那不 ...

  8. java开发_mysql中获取数据库表描述_源码下载

    功能描述: 在mysql数据库中,有两张表: data_element_config , test_table 我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_el ...

  9. EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)

    上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点 ...

随机推荐

  1. 英文版Ubuntu18.10安装搜狗输入法过程(图文并茂,亲自尝试!)

    英文版Ubuntu18.10安装搜狗输入法过程 过程比较艰辛,折腾了好长的时间,不过最终还是装好了,特记录一下! 首先去搜狗输入法网址下载Linux版本:https://pinyin.sogou.co ...

  2. python字符串 分片索引

    字符串是字符的有序集合,可以通过其位置来获得具体的元素.在python中,字符串中的字符是通过索引来提取的,索引从0开始. python可以取负值,表示从末尾提取,最后一个为-1,倒数第二个为-2,即 ...

  3. mysql中如何修改表的名字?修改表名?

    需求描述: 今天在进行mysql表的历史数据迁移,需要将某张表进行备份,修改表的名字,在此记录下操作过程. 操作过程: mysql> create table ts01 like ti_o_sm ...

  4. Sql server连接数据库报错相关

    情况一:此版本的 SQL Server 不支持用户实例登录标志. 解决方法: 方法1:在连接属性的设置里边,点高级,将User Instance 设置为false,默认的true(我在中没有找到相应的 ...

  5. python类和模块区别,python命名空间

    在python中,类可以提供模块级别之下的命名空间. 如果一个模块写很多函数,某些函数之间共同完成一组功能,用类会看起来更清晰,在调用时候也会更好,对于ide补全有更小范围的限定提示. 类提供 继承 ...

  6. [OpenCV] Samples 03: kmeans

    注意Mat作为kmeans的参数的含义. 扩展:高维向量的聚类. 一.像素聚类 #include "opencv2/highgui.hpp" #include "open ...

  7. C#客户端嵌入Chrome浏览器的实现

    https://blog.csdn.net/lanwilliam/article/details/79639823 客户端软件,也就是传统的Winform软件,在很多时候是很好用的.因为在做一些打印. ...

  8. Git Step by Step – (7) Git远程仓库(续)

    上一篇文章介绍了Git远程仓库的一些使用,但是还是有些东西需要补充一下,所以有了这个续篇. .gitignore 前一篇中,我们介绍了Git的patch功能,当我们生成patch之后,"gi ...

  9. 【代码审计】iZhanCMS_v2.1 前台GoodsController.php页面存在SQL注入漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  10. 【安全开发】Android安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...