行级锁 - 行级锁的竞争,减库存实际上是我们的核心;
秒杀接口暴露 - 人家可能会不停地访问你的接口
InnoDB - 支持事务
联合主键:seckillId和userPhone, 通过insert ignore into过滤重复;第1次返回值是1,第2次返回值是0;
MySQL常见命令:
mysql -uroot -p;
CREATE DATABASE seckill;
use seckill;
CREATE TABLE;
show tables;
show create table seckill\G;
SELECT * FROM seckill;
ALTER TABLE seckill
DROP INDEX
add index
source babasport_table.sql;
Table对应我们Java中的Entity概念;
Dao对应的就是我们相应实体的增删改查,而在Mybatis中它的实现靠的就是Mapper;
而且dao对应的bean会自动注入spring容器,即动态实现Dao接口;
通过jdbc可以直接getGeneratedKeys,就是自动生成的主键;
像SeckillDao.xml这种xml的作用:
为DAO接口方法提供sql语句配置;
id=接口名称,比如:id="reduceNumber"
parameterType可以自己识别参数属性,resultType对于update来讲,肯定是int
#{seckillId} 是占位符
inner join是取两者都有的吗?是为了命中最广?
不是,是为了映射,如果用left join,未满足条件的字段会保存下来,从而导致映射失败;
在写包名的时候,我们写的是Seckill,而不是org.seckill.entiry.Seckill,是因为package scan帮助我们完成了这件事情,就是下面这个配置;
<property name="typeAliasesPackage" value="com.samemart.console.pojo;com.samemart.sso.pojo"/>
classpath指的到底是什么?
java和resource下都是classpath.
给bean配置id的目的是?
方便其它地方引用。
@Param这个注解是Mybatis给我们提供的;@Param("seckillId"),但多于1个参数时,要加这个注解用于识别
为什么要把seckill返回呢?
DAO层工作演变为:接口设计+SQL编写;
DAO拼接逻辑:放在service层完成;(比如减库存+插入购买明细);data access object
事务回滚只针对运行期异常RuntimeException,非运行期异常是不会执行回滚的;
//可以把所有编译期异常,转化为运行期异常;
还要小心不当的try-catch
站在“使用者”的角度去设计我们的业务接口;
service的接口写得真好;
为什么返回seckill,因为秒杀成功的记录可能是1对多的,比如同时秒杀成功2个秒杀产品,所以都返回去;
queryByIdWithSeckill
使用枚举表述常量数据字段
为什么要使用单例?单例还是工厂?
xml实现注入,主要是针对:实现类来自第3方库或需要命名空间;
注解实现注入:项目开发中使用的类;