转载请标明出处:

http://blog.csdn.net/forezp/article/details/53730333

本文出自方志朋的博客

最近实在太忙,之前写的《rxjava系列文章》告一段落,还有两篇会在一月中旬补上,感谢大家。这篇文章讲述mybatis搭建DAO层,另外这系列文章是我看完《java高并发秒杀系列》的课程整理的,所以文章采用的例子也来源于这系列课程。

一.环境/工具

1.开发工具idea

2.数据库mysql

3.javaweb容器 tomcat

4.构建项目工具maven

关于这几个工具下载安装,环境的搭建就不介绍,自行百度。

二.采用maven 构建项目

采用命令构架,当然也可以采用ide 直接构建。

构建命令:

mvn archetype:generate -DgroupId=org.forezp -DartifactId=minnkill -DarchetypeArtifactId=maven-archetype-webapp

低版本maven需要将generate 改为create.

三.补全SSM框架相关依赖

下面是SSM框架所需的所有框架


  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.seckill</groupId>
  5. <artifactId>seckill</artifactId>
  6. <packaging>war</packaging>
  7. <version>1.0.0</version>
  8. <name>seckill Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <dependencies>
  11. <dependency>
  12. <!--使用junit4,4以上使用注解-->
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.11</version>
  16. <scope>test</scope>
  17. </dependency>
  18. <!--补全项目依赖-->
  19. <!--1:日志,java日志:slf4j,log4j,logback,common-logging
  20. 使用:slf4j+logBack
  21. -->
  22. <dependency>
  23. <groupId>org.slf4j</groupId>
  24. <artifactId>slf4j-api</artifactId>
  25. <version>1.5.6</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>ch.qos.logback</groupId>
  29. <artifactId>logback-core</artifactId>
  30. <version>1.1.1</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>ch.qos.logback</groupId>
  34. <artifactId>logback-classic</artifactId>
  35. <version>1.1.1</version>
  36. </dependency>
  37. <!--2:数据库相关依赖-->
  38. <dependency>
  39. <groupId>mysql</groupId>
  40. <artifactId>mysql-connector-java</artifactId>
  41. <version>5.1.35</version>
  42. <scope>runtime</scope>
  43. </dependency>
  44. <dependency>
  45. <groupId>c3p0</groupId>
  46. <artifactId>c3p0</artifactId>
  47. <version>0.9.1.2</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>commons-dbcp</groupId>
  51. <artifactId>commons-dbcp</artifactId>
  52. <version>1.4</version>
  53. </dependency>
  54. <!--DAO框架:MyBatis依赖-->
  55. <dependency>
  56. <groupId>org.mybatis</groupId>
  57. <artifactId>mybatis</artifactId>
  58. <version>3.3.0</version>
  59. </dependency>
  60. <!--myBatis自身实现的spring整合依赖-->
  61. <dependency>
  62. <groupId>org.mybatis</groupId>
  63. <artifactId>mybatis-spring</artifactId>
  64. <version>1.2.3</version>
  65. </dependency>
  66. <!--3:Servlet web相关依赖-->
  67. <dependency>
  68. <groupId>taglibs</groupId>
  69. <artifactId>standard</artifactId>
  70. <version>1.1.2</version>
  71. </dependency>
  72. <dependency>
  73. <groupId>jstl</groupId>
  74. <artifactId>jstl</artifactId>
  75. <version>1.2</version>
  76. </dependency>
  77. <dependency>
  78. <groupId>com.fasterxml.jackson.core</groupId>
  79. <artifactId>jackson-databind</artifactId>
  80. <version>2.5.4</version>
  81. </dependency>
  82. <dependency>
  83. <groupId>javax.servlet</groupId>
  84. <artifactId>javax.servlet-api</artifactId>
  85. <version>3.1.0</version>
  86. </dependency>
  87. <!--4:spring依赖-->
  88. <!--spring核心依赖-->
  89. <dependency>
  90. <groupId>org.springframework</groupId>
  91. <artifactId>spring-core</artifactId>
  92. <version>4.1.7.RELEASE</version>
  93. </dependency>
  94. <dependency>
  95. <groupId>org.springframework</groupId>
  96. <artifactId>spring-beans</artifactId>
  97. <version>4.1.7.RELEASE</version>
  98. </dependency>
  99. <!--spring dao层依赖-->
  100. <dependency>
  101. <groupId>org.springframework</groupId>
  102. <artifactId>spring-jdbc</artifactId>
  103. <version>4.1.7.RELEASE</version>
  104. </dependency>
  105. <dependency>
  106. <groupId>org.springframework</groupId>
  107. <artifactId>spring-tx</artifactId>
  108. <version>4.1.7.RELEASE</version>
  109. </dependency>
  110. <!--spring web相关依赖-->
  111. <dependency>
  112. <groupId>org.springframework</groupId>
  113. <artifactId>spring-web</artifactId>
  114. <version>4.1.7.RELEASE</version>
  115. </dependency>
  116. <dependency>
  117. <groupId>org.springframework</groupId>
  118. <artifactId>spring-webmvc</artifactId>
  119. <version>4.1.7.RELEASE</version>
  120. </dependency>
  121. <!--spring test相关依赖-->
  122. <dependency>
  123. <groupId>org.springframework</groupId>
  124. <artifactId>spring-test</artifactId>
  125. <version>4.1.7.RELEASE</version>
  126. </dependency>
  127. <!--引入一些工具类-->
  128. <dependency>
  129. <groupId>commons-collections</groupId>
  130. <artifactId>commons-collections</artifactId>
  131. <version>3.2</version>
  132. </dependency>
  133. </dependencies>
  134. <build>
  135. <finalName>seckill</finalName>
  136. </build>
  137. </project>

四.建数据库

仿java高并发秒杀系列》的视频,建了两张表,一张上库存表,一张上秒杀表,我直接贴sql语句了,比较简单。

  1. --创建数据库
  2. CREATE DATABASE seckill;
  3. --使用数据库
  4. use seckill;
  5. --库存表
  6. CREATE TABLE seckill(
  7. `seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
  8. `name` VARCHAR(120) NOT NULL COMMENT '商品名称',
  9. `number` int NOT NULL COMMENT '库存数量',
  10. `start_time` timestamp NOT NULL DEFAULT "2016-05-07 13:28:00",
  11. `end_time` timestamp NOT NULL DEFAULT "2016-05-07 13:28:00",
  12. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  13. PRIMARY KEY (seckill_id),
  14. key idx_start_time(start_time),
  15. key idx_end_time(end_time),
  16. key idx_create_time(create_time)
  17. )EnGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';
  18. ---初始化数据
  19. insert into seckill(name,number,start_time,end_time)
  20. VALUES
  21. ('1000元秒杀iphone6',100,'2015-11-01 00:00:00','2015-11-02 00:00:00'),
  22. ('500元秒杀ipad2',200,'2015-11-01 00:00:00','2015-11-02 00:00:00'),
  23. ('300元秒杀小米4',300,'2015-11-01 00:00:00','2015-11-02 00:00:00'),
  24. ('200元秒杀红米note',400,'2015-11-01 00:00:00','2015-11-02 00:00:00');
  25. --秒杀成功明细表
  26. --用户登录认证相关的信息
  27. create table success_killed(
  28. `seckill_id` bigint NOT NULL COMMENT '秒杀商品id',
  29. `user_phone` bigint NOT NULL COMMENT '用户手机号',
  30. `state` tinyint NOT NULL DEFAULT 0 COMMENT '状态标示:-1:无效 0:成功 1:已付款',
  31. `create_time` TIMESTAMP NOT NULL COMMENT '创建时间',
  32. PRIMARY KEY (seckill_id,user_phone),/*联合主键*/
  33. KEY idx_create_time(create_time)
  34. )EnGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='秒杀明细表';

五.DAO层实体编写和接口编写

1.创建org.forezp.entity包,根据数据库字段,编写实体。

下面是Seckill库存实体:


  1. public class Seckill {
  2. private long seckillId;
  3. private String name;
  4. private int number;
  5. private Date startTime;
  6. private Date endTime;
  7. private Date createTime;
  8. //这里省去了写getter setter方法,在实际项目补上
  9. }
  1. 创建org.forezp.dao包

    编写Seckill接口
  1. public interface SeckillDao {
  2. //减库存
  3. int reduceNumber(@Param("seckillId")long seckillId,@Param("killTime")Date killTime);
  4. //根据Id查询秒杀对象
  5. Seckill queryById(long seckillId);
  6. //根据偏移量查询秒杀列表
  7. List<Seckill> queryAll(@Param("offset")int offset,@Param("limit")int limit);

采用mapper实现接口

在resources目录下创建maaper文件夹,所有的接口实现类放在这里 ,另外项目采用xml的方式实现接口。采用这种方式的好处有很多,比如可以采用包扫描,更少的配置,所有的sql语句都放在这里,有利于统一规范,代码的可维护性和可读性也大大提高。


  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. <mapper namespace="org.forezp.dao.SeckillDao">
  6. <update id="reduceNumber">
  7. update
  8. seckill
  9. set
  10. number = number-1
  11. where seckill_id = #{seckillId}
  12. and
  13. start_time <![CDATA[ <= ]]>
  14. #{killTime}
  15. and end_time >= #{killTime}
  16. and number > 0;
  17. </update>
  18. <select id="queryById" resultType="Seckill" parameterType="long">
  19. select seckill_id,name,number,start_time,end_time,create_time from seckill
  20. where seckill_id = #{seckillId}
  21. </select>
  22. <select id="queryAll" resultType="Seckill">
  23. select seckill_id,name,number,start_time,end_time,create_time
  24. from seckill
  25. order by create_time desc
  26. limit #{offset},#{limit}
  27. </select>
  28. </mapper>

六. mybatis的配置

创建mybatis-config.xml 全局配置:


  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- 配置全局属性 -->
  6. <settings>
  7. <!--使用jdbc的getGeneratedKeys 获取数据库的自增主键值-->
  8. <setting name="useGeneratedKeys" value="true"/>
  9. <!--使用别名替换列名 默认true
  10. select name as title from table
  11. -->
  12. <setting name="useColumnLabel" value="true"/>
  13. <!--开启驼峰命名转换-->
  14. <setting name="mapUnderscoreToCamelCase" value="true"/>
  15. </settings>
  16. </configuration>

创建jdbc.properties文件

数据库配置文件和连接数据库驱动。

  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf8
  3. username=root
  4. password=123

七.mybatis和spring 整合

直接贴配置文件,文件已经写好了注释。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
  7. >
  8. <!--配置整合mybatis过程-->
  9. <!--1.配置数据库相关参数-->
  10. <context:property-placeholder location="classpath:jdbc.properties"/>
  11. <!--2.配置连接池属性-->
  12. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  13. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  14. <property name="url" value="jdbc:mysql://127.0.0.1:3306/seckill"/>
  15. <property name="username" value="root"/>
  16. <property name="password" value="123"/>
  17. </bean>
  18. <!--3.配置SqlSessionFactory对象-->
  19. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  20. <!--注入数据库连接池-->
  21. <property name="dataSource" ref="dataSource"/>
  22. <!--配置mybatis全局配置文件:mybatis-config.xml-->
  23. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  24. <!--扫描entity包,使用别名,多个用;隔开-->
  25. <property name="typeAliasesPackage" value="org.forezp.entity"/>
  26. <!--扫描sql配置文件:mapper需要的xml文件-->
  27. <property name="mapperLocations" value="classpath:mapper/*.xml"/>
  28. </bean>
  29. <!--4:配置扫描Dao接口包,动态实现DAO接口,注入到spring容器-->
  30. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  31. <!--注入SqlSessionFactory-->
  32. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  33. <!-- 给出需要扫描的Dao接口-->
  34. <property name="basePackage" value="org.forezp.dao"/>
  35. </bean>
  36. </beans>

就这样mybatis和spring就整合好了,spring 提供了的ioc容器,为我们管理bean,我们不需要管理bean的生命周期.

八.单元测试

采用junit单元测试,spring 对junit做了很好的支持。只需要配置注解久可以了,


  1. /**
  2. * 配置spring和junit整合,junit启动时加载springIOC容器
  3. */
  4. @RunWith(SpringJUnit4ClassRunner.class)
  5. @ContextConfiguration(locations = {"classpath*:spring/spring-dao.xml"})
  6. public class SeckillDaoTest {
  7. @Test
  8. public void reduceNumber() throws Exception {
  9. Date killTIme=new Date();
  10. int updateCount =seckillDao.reduceNumber(1000L,killTIme);
  11. System.out.println(updateCount);
  12. //结果第一次执行为1 后面为0
  13. }
  14. //注入Dao实现类依赖
  15. @Resource
  16. private SeckillDao seckillDao;
  17. @Test
  18. public void queryById() throws Exception {
  19. long id=1001;
  20. Seckill seckill=seckillDao.queryById(id);
  21. System.out.println(seckill.getName());
  22. System.out.println(seckill);
  23. //运行结果
  24. /** 500元秒杀ipad2*/
  25. /** Seckill{seckillId=1001, name='500元秒杀ipad2',number=200, startTime=Sun Nov 01 00:00:00 CST 2015, endTime=Mon Nov 02 00:00:00 CST 2015, createTime=Sun Nov 27 10:44:30 CST 2016}*/
  26. }
  27. @Test
  28. public void queryAll() throws Exception {
  29. //java没有保存形参的记录,queryAll(int offeset,int limit)->queryAll(arg0,arg1),通过@param注解来解决
  30. List<Seckill> seckills=seckillDao.queryAll(0,100);
  31. for(Seckill seckill:seckills){
  32. System.out.println(seckill);
  33. }
  34. }
  35. }

到此为止,mybatis实现数据库的连接,和dao层代码的编写以及mybatis 和spring的整合 。我觉得学习路上虽然很孤单,但如果有一个分享的心态和持续学习的动力,生活也算是充实的,自己成长了,技术也提高了,回报也高了,生活品质也随之提高。所以无论做什么,自己快乐,并且能提高自己的快乐,且以此为目的就够了,祝自己好运。

源码下载

优秀文章推荐:

一篇SSM框架整合友好的文章(一)的更多相关文章

  1. 一篇SSM框架整合友好的文章(三)

    ###一.SpringMVC理论 它始终是围绕 handler. 数据模型 model. 页面view进行开发的. 运行流程图: 通过mvc配置文件,配置"中央处理器"dispat ...

  2. 一篇SSM框架整合友好的文章(二)

    上一篇讲述了DAO 层,mybatis实现数据库的连接,DAO层接口设计,以及mybtis和spring的整合.DAO层采用接口设计方式实现,接口和SQL实现的分离,方便维护.DAO层所负责的仅仅是接 ...

  3. 接入上一篇SSM框架整合示例

    需要创建相应的包与文件夹 Book数据表作为本示例数据 搭建项目开始 首先有bean后 private int id; private String name; private int cnt; 第一 ...

  4. SSM框架整合练习——一个简单的文章管理系统

    使用SSM框架搭建的简易文章管理系统,实现了简单的增删改查功能. @ 目录 开发工具版本: 最终的项目结构 IDEA+Maven搭建项目骨架 1. 新建Maven项目: 2. 在新建的项目中添加所需要 ...

  5. SpringMVC--从理解SpringMVC执行流程到SSM框架整合

    前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...

  6. SSM框架整合环境构建——基于Spring4和Mybatis3

    目录 环境 配置说明 所需jar包 配置db.properties 配置log4j.properties 配置spring.xml 配置mybatis-spring.xml 配置springmvc.x ...

  7. springmvc(二) ssm框架整合的各种配置

    ssm:springmvc.spring.mybatis这三个框架的整合,有耐心一步步走. --WH 一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后 ...

  8. ssm框架整合-过程总结(第二次周总结)

    距离上次写博客已经有4.5天的时间了. 这次写博客目的是总结一下项目开始到现在,过程中遇到的问题.和学到的知识.经验. 初略总结下自己从中学到的: Spring :在学习中被反复强调的Ioc(反转控制 ...

  9. SSM框架整合项目 :租房管理系统

    使用ssm框架整合,oracle数据库 框架: Spring SpringMVC MyBatis 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastj ...

随机推荐

  1. Android NDK开发 JNI类型签名和方法签名(六)

    在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下: 1.primitive types ---- ...

  2. Unity Animation动画倒播

  3. SharePreferences的用法

    1.创建 sharepreferences的方法: 首先创建该对象: 例如:(注意现在后面的模式7.0可以使用的只有 MODE_PRIVATE,其他全过时了 ) SharedPreferences s ...

  4. linux下追查线上问题常用命令

    (1)查占用cpu最多的进程方法一:核心指令:ps实际命令:ps H -eo pid,pcpu | sort -nk2 | tail执行效果如下:[work@test01 ~]$ ps H -eo p ...

  5. VUE中给template组件加背景

    <template> <div class="index_background" > </div> </template> < ...

  6. 学习Spring.Net_1

    Spring.Net是一个轻量级的控制反转(IoC)和面向切面编程(AOP)技术的容器框架  一.控制反转(Inversion of Control,IoC),也叫依赖注入(Dependency In ...

  7. $.ajax、$.post

    jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...

  8. Java中的阻塞队列-ArrayBlockingQueue(一)

    最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...

  9. webpack-webpackConfig-配置说明-多页面

    入口文件entry 配置 /* 例子: 项目目录结构: ├─src # 当前项目的源码 ├─pages # 各个页面独有的部分,如入口文件.只有该页面使用到的css.模板文件等 │ ├─alert # ...

  10. RDF类型报表-PDF中文乱码

    在Oracle R12中,遇到了客户一张客户化的报表: 报表的输出格式是布局在RDF文件(非RTF)中,在并发请求输出时,PDF会出现中文乱码,而HTML和excel显示正常: 根据资料: 查看$OA ...