maven 配置与安装
下载maven 文件
解压之后,将文件移动到\Applications
文件夹内
使用cd ~
进入根目录文件夹 用ls -a
列出文件夹内的所有文件,找到一个名称为.bash_profile
的文件,打开该文件来配置环境变量
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
export MAVEN_HOME=/Applications/apache-maven-3.5.4
export PATH=$PATH:$MAVEN_HOME/bin
配置完之后 添加/调整
商家 -> 库存
<-
发货/核账source .bash_profile
编译一下 然后在命令行之中用mvn - v
来检查一下是否安装成功
配置环境变量
注意默认的cd ~
可能不是根目录而是当前用户的目录 User\auguskong\
mvn archetype:generate -DgroupId=org.seckill -DartifactId=seckill -DarchetypeArtifactId=maven-archetype-webapp
修改servlet版本为3.1
秒杀系统业务分析
添加(+)/调整(+/-)
商家 -> 库存
<-
发货/核账
付款(-)/退货(+)
用户 -> 库存
<-
秒杀/预售
秒杀业务的核心在于库存的处理
用户:
【减库存 + 记录购买明细 】
|
【完整事务】 谁 + 时间/有效期 + 付款/发货信息
|
【数据落地】
为什么需要事务? -> 事务机制依然是最可靠的数据落地方案
考虑一下情景:
减库存没有记录购买明细?
记录了购买明细但是没有减库存?
出现超卖/少买?
秒杀系统难点分析 -> 竞争
同一时间多个用户购买
事务 + 行级锁
Start Transaction
Update 库存数量
Insert 购买明细
Commit
update table set num = num - 1 where id = 10 and num > 1
数据库设计与编码
数据库路径设置
export PATH=$PATH:/usr/local/mysql/bin/
BUG!! 中英文输入法的问号意义不一样 必须使用英文的问号!!
使用 mysql -u root -p
来打开mysql面板
show create table seckill\G
查看如何创建这个表
手写DDL
记录每次上线的DDL修改
--上线V1.1
ALTER TABLE seckill
DROP INDEX idx_create_time,
add index idx_c_s(start_time, create_time);
DAO实体和接口编码
TABLE -> ENTITY 表对应java类 列对应java类当中的属性
Command + N
打开generate 可以让编译器自动生成getter 和 setter 方法
MyBatis 映射
数据库 -> 映射 -> 对象
为什么可以过滤重复? 联合主键是??
联合主键里面有电话号码,由主键不允许重复的特性保证了不存在两个相同的电话号码,可以防止一个用户重复秒杀
4-3 基于MyBatis实现DAO理论
MyBatis, Hibernate, JDBC 都是做映射的工作 对象关系映射?
MyBatis 特点
需要提供参数 + SQL(SQL必须用户来写)
SQL写在哪?
1.【推荐】XML当中
2.注解提供SQL (注解本身还是Java源码 且SQL存在拼接时很麻烦) @SQL
Java 1.5之后提供
注解的缺点: 注解本质上也是Java源码,需要编译之后才能执行 复杂拼接逻辑会很复杂
如何实现DAO接口?
1.【推荐】Mapper 自动实现DAO接口 这样可以只关注于SQL接口,
2.API编程方式实现DAO接口
写三个SQL
自己控制SQL
MyBatis整合Spring的过程
目的:
使用更少的编码: 原则是只写接口,不写实现 (实现是MyBatis自动实现)
Seckill queryById(long id)
接口参数
名字代表行为
接口返回类型表示结果集
更少的配置:
* MyBatis 自动找到包名 减少了包名的代码
* 自动扫描配置文件 减去配置维护成本
保存足够的灵活性:自己定制 SQL + 自由传参
默认
DAO层单元测试编码和问题排查
import org.junit
文件包不存在的问题
//使用@Param 注解来告知MyBatis 相关参数的名字
List<Seckill> queryAll(@Param("offset") int offet, @Param("limit") int limit);
MyBatis和Spring的整合就在于配置文件的设置
public void insertSuccessKilled() {
long id = 1001L;
long phone = 13421234569L;
int insertCount = successKilledDao.insertSuccessKilled(id, phone);
System.out.println("insertCount= " + insertCount);
}
报错空指针异常
***
命令行命令:
ifconfig
可以查看本地IP地址
MySQL 8.0当中设置密码的新语法 SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
按两次shift
快速查找project当中的文件
bug log:
URL is not registered
mapper里面笔误 parameterType 改为resultType
mybatis config文件里面笔误
确定mysql的版本是和本机版本相同 进入mysql命令行之后 输入select version()
或 直接在进入时看初始加载信息
数据库连接失败可能原因:
- jdbc.properties 配置错误:
- jdbc.driver: 注意check manual确保命令正确
- jdbc.url:
- username + password
- 未授权远程访问或没有访问权限 需要通过SQL
GRANT
进行相关操作 - 项目未引入对应版本的驱动jar包,配置文件的设定
mysql-connector-java-5.1.6-bin.jar
因为没有设定时区而导致了bug, 这个有点扯淡了
jdbc.url=jdbc:mysql://localhost/seckill?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
DAO层编码
编写接口
逻辑代码一行没写
有什么好处?
DAO层演变为接口设计 + SQL编写
代码和SQL的分离
DAO拼接等逻辑在Service层完成 逻辑放在Service层当中
对远程存储系统做操作的 放在DAO层
秒杀Service接口设计
站在使用者的角度设计接口
配置是一次性工作