GitHub: github.com/hsowan/soms
SOMS
Supermarket Orders Management System 超市订单管理系统
Day 01
使用MyBatis
MyBatis 官方文档
Refer: www.mybatis.org/mybatis-3/z…
类型别名
类型别名是你的好帮手。使用它们,你就可以不用输入类的完全限定名称了。比如:
select id, username, hashedPassword from some_table where id = #{id}复制代码
log4j2
Refer: logging.apache.org/log4j/2.x/m…
Eclipse for Mac 快捷键
删除一行
Command + D
Refer: www.cnblogs.com/TankXiao/p/…
格式化代码
Shift + Command + F
Day 02
MyBatis 核心配置
mybatis-config.xml 配置
- configuration(配置)
Refer: www.mybatis.org/mybatis-3/z…
mapper.xml 配置
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
- resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
- sql – 可被其他语句引用的可重用语句块。
- cache – 对给定命名空间的缓存配置。
- cache-ref – 对其他命名空间缓存配置的引用。
Refer: www.mybatis.org/mybatis-3/z…
使用单例模式创建SqlSessionFactory
/** * 主配置文件路径 */private static String config = “mybatis-config.xml”;private static SqlSessionFactory sqlSessionFactory;/** * 使用单例模式获取SqlSessionFactory * @return */private static synchronized SqlSessionFactory getSqlSessionFactory() {if (sqlSessionFactory == null) {try {// 创建输入流读取配置文件InputStream is = Resources.getResourceAsStream(config);// 创建SQLSession工厂sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return sqlSessionFactory;}复制代码
Maven
Using JUnit
添加下面的插件到pom.xml中:
org.apache.maven.pluginsmaven-surefire-plugin3.0.0-M3复制代码
执行单元测试: mvn test
Refer: maven.apache.org/surefire/ma…
Skipping Tests
mvn install -DskipTests
Refer: maven.apache.org/surefire/ma…
JSP 九大内置对象+四大域对象
Refer: my.oschina.net/u/3805464/b…
Java 八大基本类型
byte/8char/16short/16int/32float/32long/64double/64boolean/~复制代码
Day 03
动态SQL
官方文档
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
- bind
www.mybatis.org/mybatis-3/z…
if
改写UserMapper.xml:
select id, username, passwordfrom userwhere username like #{username}limit #{start}, #{count}复制代码
改写单元测试 testListByUsername(使用map进行传参):
Map params = new HashMap();params.put(“username”, “%user%”);List users = session.selectList(“com.ncucoder.mapper.UserMapper.listByUsername”, params);复制代码
执行结果:
==> Preparing: select id, username, password from user where username like ? ==> Parameters: %user%(String)复制代码
添加单元测试 testListByUsernameUsingLimit:
Map params = new HashMap();params.put(“username”, “%user%”);params.put(“start”, 0);params.put(“count”, 2);List users = session.selectList(“com.ncucoder.mapper.UserMapper.listByUsername”, params);复制代码
执行结果:
==> Preparing: select id, username, password from user where username like ? limit ?, ? ==> Parameters: %user%(String), 0(Integer), 2(Integer)复制代码
bind 模糊查询
修改UserMapper.xml:
select id, username, passwordfrom userwhere username like #{username}limit #{start}, #{count}复制代码
修改单元测试 testListByUsername():
Map params = new HashMap();// params.put(“username”, “%user%”);params.put(“username”, “user”);List users = session.selectList(“com.ncucoder.mapper.UserMapper.listByUsername”, params);复制代码
执行结果:
==> Preparing: select id, username, password from user where username like ? ==> Parameters: %user%(String)复制代码
SQL优化 in
查询user表中id小于5的记录
使用in的查询执行计划(QEP):
mysql> explain select id, username, password from user where id in (1, 2, 3, 4, 5);+—-+————-+——-+————+——+—————+——+———+——+——+———-+————-+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+—-+————-+——-+————+——+—————+——+———+——+——+———-+————-+| 1 | SIMPLE | user | NULL | ALL | PRIMARY | NULL | NULL | NULL | 10 | 50.00 | Using where |+—-+————-+——-+————+——+—————+——+———+——+——+———-+————-+1 row in set, 1 warning (0.00 sec)复制代码
使用<的QEP:
mysql> explain select id, username, password from user where id < 6;+—-+————-+——-+————+——-+—————+———+———+——+——+———-+————-+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+—-+————-+——-+————+——-+—————+———+———+——+——+———-+————-+| 1 | SIMPLE | user | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 5 | 100.00 | Using where |+—-+————-+——-+————+——-+—————+———+———+——+——+———-+————-+1 row in set, 1 warning (0.00 sec)复制代码
使用between的QEP:
mysql> explain select id, username, password from user where id between 1 and 5;+—-+————-+——-+————+——-+—————+———+———+——+——+———-+————-+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+—-+————-+——-+————+——-+—————+———+———+——+——+———-+————-+| 1 | SIMPLE | user | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 5 | 100.00 | Using where |+—-+————-+——-+————+——-+—————+———+———+——+——+———-+————-+1 row in set, 1 warning (0.00 sec)复制代码
- type表示对表所使用的访问方式(最优到最差: NULL > system > const > eq_ref > ref > range > index > All)
- key表示MySQL Query Optimizer从possible_keys中所选择使用的索引
- rows表示MySQL Query Optimizer通过系统收集到的统计信息估算出来的结果集记录条数, 简单理解为查询需要扫描的记录数
分析: 使用in作为查询条件时没有使用索引而进行了全表扫描(ALL), 使用<和between作为查询条件时使用到主键索引以及索引范围扫描, 所以三者比较in的执行效率是最低的
MySQL 批量插入测试数据
— 获取指定长度的随机字符串drop function if exists `rand_string`;create function `rand_string`(n int) returns varchar(255) charset ‘utf8’begin DECLARE chars_str varchar(100) DEFAULT ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789’; DECLARE return_str varchar(255) DEFAULT ”; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str, substring(chars_str, FLOOR(1 + RAND() * 62), 1)); SET i = i + 1; END WHILE; RETURN return_str;end;– 插入指定数量的用户drop procedure if exists `create_users`;create procedure `create_users`(n int)begin declare i int default 0; while (i < n) do insert into user(username, password) values (rand_string(10), rand_string(32)); set i = i + 1; end while;end;– 调用存储过程call create_users(1000);复制代码
Day 04
MyBatis Generator
官方文档
www.mybatis.org/generator/c…
问题:
- 改用MySQL8时, 与其他数据库(mysql库)表名相同时出现错误
添加依赖和插件
mybatis-generator-core:
org.mybatis.generator mybatis-generator-core ${mybatis-generator.version}复制代码
mybatis-generator-maven-plugin:
org.mybatis.generator mybatis-generator-maven-plugin ${mybatis-generator.version} true true 复制代码
添加配置文件
- generatorConfig.xml
生成对应的映射文件、实体类和接口类
cd ${your_project}mvn mybatis-generator:generator复制代码
Refer:
- www.cnblogs.com/hhhshct/p/9…
- blog.csdn.net/liyonghong3…
集成SpringMVC
添加依赖
org.springframework spring-core ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-beans ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-test ${spring.version} test org.springframework spring-jdbc ${spring.version} org.springframework spring-tx ${spring.version} org.mybatis mybatis-spring ${mybatis-spring.version} com.alibaba druid ${druid.version}复制代码
修改web.xml配置文件
soms-dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring/spring-*.xml 1 true soms-dispatcher / encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /*复制代码
添加Spring的配置文件
- spring-web.xml
- spring-dao.xml
- spring-service.xml
使用MySQL8
修改依赖版本(pom.xml):
8.0.16复制代码
修改驱动路径(db.properties):
driver=com.mysql.cj.jdbc.Driver复制代码
Day 05
JWT + SpringSecurity
github.com/hsowan/jwt-…
作者:K8sCat链接:https://juejin.cn/post/7056040075947147295