超市订单管理系统
GitHub: github.com/hsowan/somsSOMS
Supermarket Orders Management System 超市订单管理系统Day 01
使用MyBatisMyBatis 官方文档
Refer: www.mybatis.org/mybatis-3/z…类型别名
类型别名是你的好帮手。使用它们,你就可以不用输入类的完全限定名称了。比如: 复制代码log4j2
Refer: logging.apache.org/log4j/2.x/m…Eclipse for Mac 快捷键删除一行
Command + D
Refer: www.cnblogs.com/TankXiao/p/…格式化代码
Shift + Command + FDay 02
MyBatis 核心配置mybatis-config.xml 配置configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源)databaseIdProvider(数据库厂商标识)mappers(映射器)
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 block e.printStackTrace(); } } return sqlSessionFactory; } 复制代码MavenUsing JUnit
添加下面的插件到pom.xml中: org.apache.maven.plugins maven-surefire-plugin 3.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/8 char/16 short/16 int/32 float/32 long/64 double/64 boolean/~ 复制代码Day 03
动态SQL官方文档ifchoose (when, otherwise)trim (where, set)foreachbind
www.mybatis.org/mybatis-3/z…if
改写UserMapper.xml: 复制代码
改写单元测试 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: 复制代码
修改单元测试 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 04MyBatis 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.xmlspring-dao.xmlspring-service.xml使用MySQL8
修改依赖版本(pom.xml):8.0.16 复制代码
修改驱动路径(db.properties):driver=com.mysql.cj.jdbc.Driver 复制代码Day 05JWT + SpringSecurity
github.com/hsowan/jwt-…
作者:K8sCat
链接:https://juejin.cn/post/7056040075947147295
漫威银河护卫队新演示做出选择决定故事发展索尼官方公布了SE动作冒险新作漫威银河护卫队的新演示,展示了游戏玩法,一起来了解下吧。演示视频了解如何在探索中与成员们互动,做出选择以主导故事的发展,并通过解锁升级能力解锁服装来定
这些被奉为神作的游戏,为什么我却get不到点?8月5日,IGN评选出了Sony史上独占游戏Top10,本次入选到游戏都来自索尼第一方工作室,或者是在该特定游戏发布后收购的工作室,所以一些第三方制作的游戏如最终幻想7合金装备血源
LOL手游多不待见王者玩家,谩骂是常态相信这两天很多玩家都知道LOL手游上线的消息,不管是出于好奇,还是尝鲜,很多玩家确实入场尝试了这款游戏,其中有很大一部分的王者荣耀玩家,毕竟同样是moba手游,在国内不玩王者荣耀的
英雄联盟手游薇恩带什么符文在lol手游中薇恩带什么符文比较好呢?符文的选择方式内容又是什么样的呢?感兴趣的小伙伴们,下面就让我们一起来看一下吧!lol手游薇恩符文选择推荐方案1征服者,手游中征服者只需要5层
荣耀新三国甘宁太史慈攻略在荣耀新三国手游中甘宁太史慈究竟怎么样呢?甘宁太史慈玩法技巧还有不少玩家并不是很清楚呢!那么想了解的话,下面就来看一下吧!荣耀新三国甘宁太史慈攻略配将思路这里面就是利用太史慈和甘宁
我那溢价近2倍的PS5尚在吃灰,为何又义无反顾地抢了一台XSX?2020年11月,随着Sony和Microsoft两家次世代主机的正式发售,主机市场再次硝烟四起,新一轮大战一触即发。但与往次不同的是,今年的主机大战由于受全球新冠疫情影响,芯片产
云端觅鲜卡萨帝原石Homey系列冰箱耀世首发01Homey原石Homey原石,是宇宙的礼物是山川的眼睛未经人工雕琢却已鬼斧神工采撷冰山原石灵感回归极致自然本味今日,四川甘孜贡嘎雪山卡萨帝原石Homey系列冰箱耀世首发演绎雪山
市场,卡萨帝增速翻番家庭,卡萨帝全场景守护当企业做到行业绝对引领份额,还有向上发展的空间吗?卡萨帝以半年报数据证明,即使做到份额第一,依旧拥有增长潜力。卡萨帝上半年营收增幅达74。4,较之2020年Q4营收实现了增速翻番,
国庆在即,你选择与什么游戏共度假期?国庆假期长漫漫,何种游戏能作伴?为了应对假期游戏荒,研游说特地准备了一份游戏推荐表,包能助你愉快度过假期!DarkSouls黑暗之魂3作为魂系游戏的代表作,黑暗之魂3在各方面的表现
醉逍遥重阳佳节相伴永久九九望遥空,秋水生夕风在这金风送爽,丹桂飘香的时节,我们迎来了一年一度的传统佳节九九重阳节,这是一个登高秋游,敬老爱老,同时也代表着长长久久的节日在这重要的节日里,不彷携上三五好友
天山海世界求婚告白圣地遇见爱情,遇见你若人生是一场相遇,在素年锦时,我与你共一场胭脂醉,不醉不休,不停不止,若说世间所有的相遇都是久别重逢,那么每一次重逢,都该被认真纪念。王小波在爱你就像爱生命中写道我把我的整个灵魂都