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接口##
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实现
- 自动实现DAO接口
- 自动注入spring容器
足够的灵活性
- 自己定制SQL
- 自由传参