secKillDao - juedaiyuer/researchNote GitHub Wiki

#秒杀系统---DAO层#

目录结构

main
	java
		org
			seckill
				entity
				dao

##实体层---entity##

Seckill

private long seckillId;

private String name;

private int number;

private Date startTime;

private Date endTime;

private Date createTime;


getter/setter

自动生成toString方法

SucessKilled

private long seckillId;

private long userPhone;

private short state;

private Date createTime;

//多对一
private Seckill seckill;

getter/setter

自动生成toString方法

##DAO层##

SeckillDao

package org.seckill.dao;

import java.util.Date;
import java.util.List;

import org.seckill.entity.Seckill;

public interface SeckillDao {

	 //	减库存	 
	int reduceNumber(long seckillId,Date killTime);

	//根据id查询秒杀对象
	Seckill queryById(long seckillId);

	//根据偏移量查询秒杀商品列表
	List<Seckill> queryAll(int offset,int limit);

}

SuccesskilledDao

package org.seckill.dao;

import org.seckill.entity.SucessKilled;

public interface SuccessKilledDao {

	//插入购买明细,可过滤重复
	int insertSuccessKilled(long seckillId,long userPhone);

	//根据id查询SuccessKilled并携带秒杀产品实体对象
	SucessKilled queryByIdWithSeckill(long seckillId);

}

##mybatis实现DAO接口##

mybatis文档

resources
	mybatis-config.xml
	mapper

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

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>
  	<!--使用JDBC的getGenerateKeys 获取数据库自增主键值  -->
  	<setting name="useGenerateKeys" value="true"/>
  	<!-- 使用列别名替换别名
  		select name as title from table
  	 -->
  	 <setting name="userColumnLabel" value="true"/>
  	 
  	 <!-- 开启驼峰命名转换:Table(create_time) ->Entity(createTime) -->
  	 <setting name="mapUnderscoreCamelCase" value="true"/>

  </settings>
  </configuration>

SeckillDao.xml

XML文档的CDATA区

不想被解析程序解析的原始数据,解析器不对CDATA区的内容进行解析

<![CDATA[ ... ]]>


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
	
<mapper namespace="org.seckill.dao.SeckillDao">
	<!-- 目的:为DAO接口方法提供sql语句配置 -->

	<update id="reduceNumber">
		update 
			seckill
		set
			number = number-1
		where seckill_id=#{seckillId}
		and start_time <![CDATA[  <=  ]]>#{killTime},
		and end_time>=#{killTime}
		and number > 0;
	</update>

	<select id="queryById" resultType="Seckill" parameterType="long">
			select * from seckill
			where seckill_id=#{seckillId}
	</select>

	<select id="queryAll" resultType="Seckill" >
		select * from seckill
		order by create_time desc
		limit #{offset},#{limit}
	</select>

</mapper>   

SuccessKilledDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
	
<mapper namespace="org.seckill.dao.SuccessKilledDao">

	<insert id="insertSuccessKilled" >
		<!-- 主键冲突会报错,ignore关键字,主键冲突,不报错返回0,方便业务逻辑处理 -->

		insert ignore  into success_killed(seckill_id,user_phone)
		values(#{seckillId},#{userPhone})
	</insert>

	<select id="queryByIdWithSeckill"  resultType="SuccessKilled">
		<!-- 告诉mybatis把结果映射到SuccessKilled同时映射seckill属性 -->
		<!-- mybatis可以自由控制SQL -->
	
		select 
			sk.seckill_id,
			sk.user_phone,
			sk.create_time,
			sk.state,
			s.seckill_id as  "seckill.seckill_id",
			s.number as "seckill.number",
			s.start_time as "seckill.start_time",
			s.end_time as "seckill.end_time",
			s.create_time as "seckill.create_time"
		from success_killed sk
		inner join seckill s on sk.seckill_id = s.seckill_id
		where sk.seckill_id = #{seckillId}

	</select>

</mapper> 

##mybatis整合Spring理论##

mybatis实现DAO层,只写接口,不写实现类

接口能说明很多事

Seckill queryById(long id);	

接口能说明很多事

更少的配置-别名

更少的配置-配置扫描

更少的配置-dao实现

  1. 自动实现DAO接口
  2. 自动注入spring容器

足够的灵活性

  1. 自己定制SQL
  2. 自由传参
⚠️ **GitHub.com Fallback** ⚠️