SpringMVC+Spring+MyBatisによる秒殺システム【データベースインタフェース】

18180 ワード

前言
このチュートリアルでは、主にMyBatisが最下位のインタフェースを実現することに注目し、MyBatisをSpringに渡して管理しています.データベース接続プール用のc 3 p 0.データベース用MySQL.主に2つの大類がある:秒殺商品の照会、秒殺明細の挿入.
 
準備作業
     
1、データベース・スクリプト.データベースを初期化します.ここには主に2枚の表があります.seckill【秒殺商品表】、success_killed【秒殺記録集計表】.success_killedはデュアルプライマリキーseckillを採用id、user_phone.同じ商品で同じ携帯電話番号は1回しか秒殺できないが、不正な手段で業務インタフェースを通過すると、秒殺記録の明細を繰り返し挿入すると0に戻る.
--      
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 COMMENT '      ',
  `end_time`   TIMESTAMP   NOT NULL 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-01-01 00:00:00','2016-01-02 00:00:00'),
  ('800   ipad',200,'2016-01-01 00:00:00','2016-01-02 00:00:00'),
  ('6600   mac book pro',300,'2016-01-01 00:00:00','2016-01-02 00:00:00'),
  ('7000   iMac',400,'2016-01-01 00:00:00','2016-01-02 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:    2:   ',
  `create_time` TIMESTAMP NOT NULL COMMENT '    ',
  PRIMARY KEY(seckill_id,user_phone),/*    */
  KEY idx_create_time(create_time)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='       ';

2、MyBatisプロファイルを実現し、Springに管理される
mybatis-config.xml
xml version="1.0" encoding="UTF-8" ?>
DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <settings>
       
       <setting name="useGeneratedKeys" value="true"/>
       
       <setting name="useColumnLabel" value="true"/>
       
       <setting name="mapUnderscoreToCamelCase" value="true"/>
   settings>
configuration>

spring-dao.xml
ここで重要なのはsqlsessionfactoryの構成で、mybatisグローバルプロファイル、mapperを指定する必要があります.xmlファイルの場所.
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    
    <context:property-placeholder location="classpath:jdbc.properties"/>

    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        
        <property name="maxPoolSize" value="30" />
        
        <property name="minPoolSize" value="10"/>
        
        <property name="autoCommitOnClose" value="false"/>
        
        <property name="checkoutTimeout" value="1000"/>
        
        <property name="acquireRetryAttempts" value="3"/>
    bean>

    
    <bean id="sessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        
        <property name="typeAliasesPackage" value="com.seckill.entity"/>
        
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    bean>

    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        
        <property name="basePackage" value="com.seckill.dao"/>
        
        <property name="sqlSessionFactoryBeanName" value="sessionfactory"/>
    bean>
beans>

 
秒殺最下位インタフェース実装
1、インタフェースを実現する.ここでParam注記に注意してください.メソッドにパラメータが1つしかない場合は指定しません.mapperに複数のパラメータを渡す必要がある場合は、HashMapでパラメータを渡すこともできます.
public interface SeckillDao {

    /**   **/
    int reduceNumber(@Param("seckillId") long seckillId,@Param("killTime") Date killTime);

    /**        **/
    Seckill queryById(long seckillId);

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

}


public interface SuccessKillDao {

    /**
     *         
     * **/
    int insertSuccessKilled(@Param("seckillId") long seckillId,@Param("userPhone")  long userPhone);

    /**
     *     id        ,          
     * **/
    SuccessKilled queryByIdWithSeckill(@Param("seckillId") long seckillId,@Param("userPhone")  long userPhone);

}

2、秒殺が実現する.つまりmapperディレクトリの下の*です.xmlファイル.
SeckillDao.xml



    
        update seckill set number=number-1
        where seckill_Id=#{seckillId}
        and start_time  #{killTime}
        and end_time = ]]> #{killTime}
        and number>0
    
    
    
    
    


SuccessKillDao.xml





    
    

        insert ignore into  success_killed (seckill_id,user_Phone,state) values (#{seckillId},#{userPhone},0)
    

    


3、OK、準備が整い、ユニットテストの方法が実現できるようになりました.