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に戻る.
2、MyBatisプロファイルを実現し、Springに管理される
mybatis-config.xml
spring-dao.xml
ここで重要なのはsqlsessionfactoryの構成で、mybatisグローバルプロファイル、mapperを指定する必要があります.xmlファイルの場所.
秒殺最下位インタフェース実装
1、インタフェースを実現する.ここでParam注記に注意してください.メソッドにパラメータが1つしかない場合は指定しません.mapperに複数のパラメータを渡す必要がある場合は、HashMapでパラメータを渡すこともできます.
2、秒殺が実現する.つまりmapperディレクトリの下の*です.xmlファイル.
SeckillDao.xml
SuccessKillDao.xml
3、OK、準備が整い、ユニットテストの方法が実現できるようになりました.
このチュートリアルでは、主に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、準備が整い、ユニットテストの方法が実現できるようになりました.