文章目录

  • day01
    • 数据库
    • SQL
    • DBMS
    • 如何连接数据库执行SQL语句
    • 数据库和表的概念
    • SQL语句格式:
    • 数据库相关的SQL语句
    • 数据库相关练习题:
    • 表相关的SQL语句
    • 表相关练习题:
    • UTF8字符集
    • 检查自己电脑的MySQL服务是否开启
    • 表相关SQL(续)
    • 表相关SQL语句回顾:
    • 数据相关SQL
  • day02
    • 内容回顾:
    • 数据相关SQL
    • 综合练习题:
    • 主键约束
    • 主键约束+自增
    • SQL语句分类
    • 数据类型
    • 导入\*.sql批处理文件
    • 去重distinct
    • is null和is not null
    • and 和 or
    • 比较运算符 \> \< \>= \<= = !=和\<\>
    • between x and y 两者之间
    • in关键字
    • 综合练习题
    • 模糊查询like
    • 排序order by
    • 分页查询
    • 综合练习题
    • 别名
    • 聚合函数
    • 数值计算 + - \* / %
    • 晚课练习题:
  • day03
    • 内容回顾:
    • 分组查询 group by
    • having
    • 各个关键字的书写顺序
    • 子查询(嵌套查询)
    • 关联关系
    • 关联查询
    • 关联查询之等值链接
    • 关联查询之内连接
    • 关联查询之外连接
    • 关联查询总结:
    • 如何查询多对多表中的数据
    • JDBC
    • 执行SQL语句的对象Statement
  • day04
    • 数据库连接池DBCP
    • 注册登录
    • PreparedStatement预编译的SQL执行对象
    • 数据库常见错误
  • SpringBoot
      • Web服务软件做了那些事儿?
      • SSM三大框架
      • SpringBoot框架
      • 如何创建SpringBoot工程
    • **任务: 依次创建至少5个工程将创建工程的流程熟练掌握(每次运行新工程之前需要关闭之前的工程,不然会出现端口被占用的问题)**
      • 表设计面试题
  • day02
    • 客户端发出请求的几种方式
    • 工程中使用数据库需要做的几件事:
    • Mybatis框架
    • Mybatis框架添加英雄步骤:
    • 删除英雄步骤:
    • 修改英雄步骤:
    • 查询英雄步骤:
  • day03
    • 商品表的增删改查
    • 同步请求和异步请求
    • 客户端发出请求的几种方式
    • 客户端如何发出异步请求
    • Get请求和Post请求
    • 注册登录步骤: 至少写3遍以上
    • 端口被占用
  • day04
    • 后端的MVC设计模式
    • 前后端分离
    • JSON
    • 服务器和客户端之间如何传递复杂数据
    • 商品管理添加商品步骤:
    • 商品管理商品列表步骤:
    • 商品管理删除商品步骤:
    • 商品管理修改商品步骤:
  • day05
    • 微博练习步骤
    • 会话管理
    • 如何通过Session对象记住登录状态
  • Day06
    • 上传图片注意事项
    • 酷鲨商城项目步骤:
    • 登录功能步骤:
    • 首页分类展示功能步骤:
    • 首页轮播图展示步骤:
    • 后台管理页面分类管理步骤
    • 添加分类步骤:
    • 管理页面轮播图展示
    • 删除轮播图
    • 项目峰会
  • day07
    • 网站图标ico
    • 删除轮播图同时删除文件
    • 添加商品步骤:
    • 管理页面商品列表展示功能
    • 删除商品步骤: 整体流程参考删除轮播图
    • 首页展示商品步骤:
    • 排行榜步骤:
    • 在application.properties里面配置自定义的值
    • 点击分类查看分类下的商品
  • day08
    • 搜索功能步骤:
    • 结果页面的搜索功能
    • 商品详情页面
    • 浏览量
    • 当浏览量发生改变发布时间跟着改变的原因
    • 后台管理页面显示当前登录的用户信息
    • 退出登录步骤:
    • 过滤器Filter
    • urlPatterns的配置方式
    • 工作中查询数据时不推荐使用\*
    • 删除分类时删除商品
    • 表设计之权限管理
    • 权限管理关联查询相关练习题
  • SpringBoot常见错误列表:
      • 解决问题的思路:
      • 如果上传的图片不显示按照以下步骤检查:
        • 问问题需要给老师提交的内容包括: 错误效果截图,错误提示信息截图, 相关代码截图(截图中要包含行号)
    • 不要启动老师的工程 ,如果更新完老师代码报错 要刷新maven 和ReBuild工程

day01

数据库

  • 学习数据库主要学习的是如何对数据进行增删改查操作.

SQL

Structured Query Language: 结构化查询语言, 通过此语言让程序员和数据库软件进行交流

刘德华 30 5000

insert into emp values(“刘德华”,30,5000);

DBMS

DataBaseManagementSystem: 数据库管理系统(数据库软件)

  • 常见的几种DBMS:

    • MySQL: Oracle公司产品, 08年被Sun公司收购, 09年Sun公司被Oracle收购. 开源产品 , MaraDB实际上就是MySQL的一个分支使用方式和MySQL一样. 市占率排名第一

    • Oracle: Oracle公司产品, 闭源产品 ,性能最强 价格最贵, 市占率排名第二

    • SQLServer: 微软公司产品, 闭源产品 , 市占率第三

    • DB2: IBM公司产品

    • SQLite: 轻量级数据库, 安装包几十K ,只具备最基础的增删改查功能.

如何连接数据库执行SQL语句

  • 执行SQL语句需要先和数据库软件建立链接之后
  1. 从开始菜单中找到MariaDB或MySQL,然后打开找到里面的MySQL Client 打开 , 然后输入密码后回车

退出指令: exit

登录指令: mysql -uroot -p

数据库和表的概念

  • 在MySQL数据库软件中保存数据,需要先建库,然后在库里面建表,然后把数据保存到表中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cs43ADiK-1654327052411)(media/image1.png)]{width=“5.5in” height=“2.6371883202099737in”}

SQL语句格式:

  1. 以;号结尾

  2. 关键字不区分大小写

  3. 可以有空格或换行但一定要以;结尾

数据库相关的SQL语句

  1. 查询所有数据库
  • 格式: show databases;
  1. 创建数据库
  • 格式: create database 数据库名 charset=utf8/gbk;

  • 举例:

    • create database db1;

    • create database db2 charset=utf8;

    • create database db3 charset=gbk;

  1. 查看数据库信息
  • 格式: show create database 数据库名;

  • 举例:

    • show create database db1;

    • show create database db2;

    • show create database db3;

  1. 删除数据库
  • 格式: drop database 数据库名;

  • 举例:

    • drop database db3;

    • drop database db2;

    • show databases;

  1. 使用数据库
  • 执行表相关和数据相关的SQL语句之前必须先使用了某个数据库

  • 格式: use 数据库名;

  • 举例:

    • use db1;

数据库相关练习题:

1. 创建 mydb1和mydb2 数据库 字符集分别为utf8和gbk

create database mydb1 charset=utf8;

create database mydb2 charset=gbk;

  1. 查询所有数据库检查是否创建成功

show databases;

  1. 检查两个数据库的字符集是否正确

show create database mydb1;

show create database mydb2;

  1. 先使用mydb2 再使用 mydb1

use mydb2;

use mydb1;

  1. 删除两个数据库

drop database mydb2;

drop database mydb1;

表相关的SQL语句

  • 执行表相关的SQL语句必须已经使用了某个数据库

use db1;

  1. 创建表
  • 格式: create table 表名(字段1名 类型,字段2名 类型,…);

  • 举例:

    • create table person(name varchar(50),age int);

    • create table student(name varchar(50),chinese int,math int,english int)charset=utf8;

  • 创建一个员工表emp 保存名字,工资和工作

create table emp(name varchar(50),salary int,job varchar(20));

  1. 查询所有表
  • 格式: show tables;
  1. 查询表信息
  • 格式: show create table 表名;

  • 举例:

    • show create table emp;
  1. 查询表字段
  • 格式: desc 表名;
  1. 修改表名
  • 格式: rename table 原名 to 新名;

  • 举例:

    • rename table student to stu;
  1. 删除表
  • 格式: drop table 表名;

表相关练习题:

1. 创建数据库mydb3 字符集gbk 并使用

create database mydb3 charset=gbk;

use mydb3;

2. 创建t_hero英雄表, 有名字和年龄字段 默认字符集

create table t_hero(name varchar(20),age int);

3. 修改表名为hero

rename table t_hero to hero;

4. 查看表的字符集 show create table hero;

5. 查询表字段 desc hero;

6. 删除表 drop table hero;

7. 删除数据库 drop database mydb3;

UTF8字符集

  • 目前utf8 和utf8mb3 一样 ,代表的是 用3个字节表示一个字符 (mb3=most byte 3)

  • utf8mb4 最多不超过4个字节表示一个字符

检查自己电脑的MySQL服务是否开启

  • 在我的电脑/此电脑上右键->管理 检查MySQL服务服务是否正在运行

表相关SQL(续)

使用db1数据库 use db1;

  1. 添加表字段
  • 最后面添加格式: alter table 表名 add 字段名 类型;

  • 最前面添加格式: alter table 表名 add 字段名 类型 first;

  • 在xxx字段后面添加: alter table 表名 add 字段名 类型 after xxx;

  • 举例:

    • alter table emp add gender varchar(5);

    • alter table emp add id int first;

    • alter table emp add dept varchar(20) after name;

  1. 删除表字段
  • 格式: alter table 表名 drop 字段名;

  • 举例:

    • alter table emp drop dept;
  1. 修改表字段
  • 格式: alter table 表名 change 原名 新名 新类型;

  • 举例:

    • alter table emp change job dept varchar(5);

表相关SQL语句回顾:

  1. 创建表 create table t1(name varchar(20),age int) charset=utf8/gbk;

  2. 查询所有表 show tables;

  3. 查询表信息 show create table t1;

  4. 查询表字段 desc t1;

  5. 删除表 drop table t1;

  6. 修改表名 rename table t1 to t2;

  7. 添加表字段 alter table t1 add age int first/after xxx;

  8. 删除表字段 alter table t1 drop age;

  9. 修改表字段 alter table t1 change 原名 新名 新类型;

表相关练习题:

  1. 创建数据库mydb4 字符集utf8并使用

create database mydb4 charset=utf8;

use mydb4;

  1. 创建teacher表 有名字字段

create table teacher(name varchar(50));

  1. 添加表字段: 最后添加age 最前面添加id , age前面添加salary工资

alter table teacher add age int;

alter table teacher add id int first;

alter table teacher add salary int after name;

  1. 删除age字段

alter table teacher drop age;

  1. 修改表名为t

rename table teacher to t;

  1. 删除表 drop table t;

  2. 删除数据库 drop database mydb4;

数据相关SQL

  • 操作数据必须保证已经使用了某个数据库并且已经准备好了保存数据的表

  • create database mydb5 charset=utf8;

  • use mydb5;

  • create table person(name varchar(50),age int)charset=utf8;

  1. 往表中插入数据
  • 全表插入格式: insert into 表名 values(值1,值2);

  • 指定字段插入格式: insert into 表名(字段1名,字段2名)values(值1,值2);

  • 举例:

    • insert into person values(‘tom’,18);

    • insert into person(name) values(‘jerry’);

    • insert into person values(‘aaa’,10),(‘bbb’,20),(‘ccc’,30);

    • insert into person(name) values(‘xxx’),(“yyy”),(“zzz”);

day02

内容回顾:

  1. 数据库相关
  • 查询所有: show databases;

  • 创建: create database db1 charset=utf8/gbk;

  • 查看数据库信息: show create database db1;

  • 删除数据库: drop database db1;

  • 使用数据库: use db1;

  1. 表相关
  • 创建: create table t1(name varchar(20),age int)charset=utf8/gbk;

  • 查询所有: show tables;

  • 查看表信息: show create table t1;

  • 表字段: desc t1;

  • 删除表: drop table t1;

  • 修改表名: rename table t1 to t2;

  • 添加字段: alter table t1 add age int first/ after xxx;

  • 删除字段: alter table t1 drop age;

  • 修改字段: alter table t1 change 原名 新名 新类型;

  1. 数据相关
  • 插入数据: insert into t1(字段1名,字段2名) values(值1,值2),(值1,值2),(值1,值2);

数据相关SQL

create database day2db charset=utf8;

use day2db;

create table person(name varchar(50),age int)charset=utf8;

insert into person values(“刘德华”,50);

中文问题:

  • 错误原因是客户端和MySQL之间编解码字符集不一致导致的

  • 解决方案: 修改MySQL的解码字符集为gbk

set names gbk;

  1. 查询数据
  • 格式: select 字段信息 from 表名 where 条件;

  • 举例:

insert into person values(‘刘备’,40),(‘关羽’,30),(‘悟空’,20),(‘八戒’,10),(‘张学友’,5);

  • select name from person;

  • select name,age from person;

  • select * from person;

  • select * from person where age=50;

  • select age from person where name=“悟空”;

  1. 修改数据
  • 格式: update 表名 set 字段名=值 where 条件;

  • 举例:

    • update person set age=88 where name=‘刘备’;

    • update person set name=‘张飞’,age=18 where name=‘关羽’;

    • update person set name=‘黎明’ where age=5;

  1. 删除数据
  • 格式: delete from 表名 where 条件;

  • 举例:

    • delete from person where name=‘张飞’;

    • delete from person where age<30;

    • delete from person;

综合练习题:

1. 创建数据库day1db 字符集utf8并使用

create database day1db charset=utf8;

use day1db;

2. 创建t_hero表, 有name字段 字符集utf8

create table t_hero(name varchar(50))charset=utf8;

3. 修改表名为hero

rename table t_hero to hero;

4. 最后面添加价格字段money, 最前面添加id字段, name后面添加age字段

alter table hero add money int;

alter table hero add id int first;

alter table hero add age int after name;

5. 表中添加以下数据: 1,李白,50,6888 2,赵云,30,13888 3,刘备,25,6888

insert into hero values(1,‘李白’,50,6888),(2,‘赵云’,30,13888),(3,‘刘备’,25,6888);

6. 查询价格为6888的英雄名

select name from hero where money=6888;

7. 修改刘备年龄为52岁

update hero set age=52 where name=‘刘备’;

8. 修改年龄小于等于50岁的价格为5000

update hero set money=5000 where age<=50;

9. 删除价格为5000的信息

delete from hero where money=5000;

10. 删除表, 删除数据库

drop table hero;

drop database day1db;

主键约束

  • 主键: 表示数据唯一性的字段称为主键

  • 约束: 创建表时给表字段添加的限制条件

  • 主键约束: 限制主键的值 唯一且非空

  • 如何使用:

    • use day2db;

    • create table t1 (id int primary key,name varchar(50))charset=utf8;

    • insert into t1 values(1,“aaa”);

    • insert into t1 values(1,“bbb”); //报错 主键值重复

    • insert into t1 values(null,“ccc”);

主键约束+自增

  • 自增规则: 从历史最大值基础上+1

  • 如何使用: create table t2(id int primary key auto_increment,name varchar(50))charset=utf8;

  • insert into t2 values(null,“aaa”);

  • insert into t2 values(null,“bbb”);

  • insert into t2 values(10,“ccc”);

  • insert into t2 values(null,“ddd”);

  • delete from t2 where id>=10;

  • insert into t2 values(null,“eee”);

SQL语句分类

  • DDL: 数据定义语言,包括数据库相关和表相关的SQL语句

  • DML: 数据操作语言, 包括增删改查

  • DQL: 数据查询语言, 只包含select查询相关的SQL语句

  • TCL: 事务控制语言

  • DCL: 数据控制语言

数据类型

  1. 整数: int(m)和bigint(m) m代表显示长度, m=5 存18 查询得到00018

create table t3(age int(5) zerofill);

insert into t3 values(18);

select * from t3;

  1. 浮点数: double(m,d) m代表总长度,d代表小数长度 , 存23.212 m=5 d=3

create table t5(price double(5,3));

insert into t5 values(23.32123);

insert into t5 values(233.32123); //报错

  1. 字符串:

    a. char(m), 固定长度, m=10 存abc 占10, 执行效率略高, 当保存数据的长度相对固定时使用, 最大值255

    b. varchar(m),可变长度,m=10 存abc 占3,更节省空间, 最大值65535 但推荐保存短的数据(255以内)

    c. text(m),可变长度, 最大值65535,建议保存长度大于255的

  2. 日期:

    a. date, 只能保存年月日

    b. time, 只能保存时分秒

    c. datetime, 保存年月日时分秒, 默认值为null , 最大值 9999-12-31

    d. timestamp(时间戳,距离1970年1月1日的毫秒数),保存年月日时分秒,默认值为当前系统时间,最大值 2038-1-19

create table t6(t1 date,t2 time,t3 datetime,t4 timestamp);

insert into t6 values(“2022-5-15”,null,null,null);

insert into t6 values(null,“14:20:25”,“2011-10-22 10:20:30”,null);

导入*.sql批处理文件

  1. 从老师工程中得到emp.zip 从idea中复制粘贴到 某个磁盘的根目录 ,然后右键解压到当前文件夹, 在根目录下出现emp.sql文件

  2. 在客户端中 执行 source f:/emp.sql;

  3. 执行以下SQL语句 检查是否成功

show tables; //检查是否出现了 emp和dept两个表

select * from emp; //检查是否出现了数据, 如果出现乱码 执行set names utf8; 如果格式错乱 正常

去重distinct

  1. 查询员工表中所有不同的工作

select distinct job from emp;

  1. 查询员工表中出现了哪几个不同的部门id?

select distinct dept_id from emp;

is null和is not null

  1. 查询有领导的员工姓名和领导id

select name,manager from emp where manager is not null;

  1. 查询没有领导的员工姓名

select name from emp where manager is null;

and 和 or

  1. 查询1号部门工资高于2000的员工信息

select * from emp where dept_id=1 and sal>2000;

  1. 查询3号部门或工资等于5000的员工信息

select * from emp where dept_id=3 or sal=5000;

  1. 查询出孙悟空和猪八戒的员工信息

select * from emp where name=“孙悟空” or name=“猪八戒”;

比较运算符 > < >= <= = !=和<>

  1. 查询工资大于等于3000的员工信息

select * from emp where sal>=3000;

  1. 查询工作不是程序员的员工信息(两种写法)

select * from emp where job!=“程序员”;

select * from emp where job<>“程序员”;

between x and y 两者之间

  1. 查询工资在2000到3000之间的员工信息

select * from emp where sal>=2000 and sal<=3000;

select * from emp where sal between 2000 and 3000;

select * from emp where sal not between 2000 and 3000;

in关键字

  1. 查询工资等于5000,1500,3000的员工信息

select * from emp where sal=5000 or sal=1500 or sal=3000;

select * from emp where sal in(5000,1500,3000);

select * from emp where sal not in(5000,1500,3000);

综合练习题

  1. 查询1号部门有哪几种不同的工作

select distinct job from emp where dept_id=1;

  1. 查询1号部门中有上级领导的员工信息

select * from emp where dept_id=1 and manager is not null;

  1. 查询工作是程序员,销售和人事的员工信息

select * from emp where job in(“程序员”,“销售”,“人事”);

  1. 查询工资不在1000-2000之间的员工信息

select * from emp where sal not between 1000 and 2000;

  1. 查询有奖金的员工信息

select * from emp where comm>0;

模糊查询like

  • %: 代表0或多个未知字符

  • _:代表1个未知字符

  • 举例:

    • 以x开头 x%

    • 以x结尾 %x

    • 包含x %x%

    • 第二个字符是x _x%

    • 以x开头以y结尾 x%y

    • 第二个是x倒数第三个是y _x%y__

  1. 查询名字姓孙的员工信息

select * from emp where name like “孙%”;

  1. 查询名字以精结尾的员工姓名

select name from emp where name like “%精”;

  1. 查询工作第二个字是售的员工姓名和工作

select name,job from emp where job like “_售%”;

  1. 查询名字中包含僧并且工资大于2000的员工姓名和工资

select name,sal from emp where name like “%僧%” and sal>2000;

排序order by

  • 格式: order by 字段名 asc(升序默认)/desc(降序)

description描述

descend 降序

  1. 查询所有员工姓名和工资并按照工资升序排序

select name,sal from emp order by sal;

select name,sal from emp order by sal asc;

  1. 查询所有员工姓名和工资并按照工资降序排序

select name,sal from emp order by sal desc;

  1. 查询所有员工姓名,工资和部门id并且按照部门id升序排序,如果部门id一致则按照工资降序排序

select name,sal,dept_id from emp order by dept_id,sal desc;

分页查询

  • 格式: limit 跳过的条数,请求的条数(每页的条数)

  • 跳过的条数=(请求的页数-1)*请求的条数(每页条数)

  • 举例:

    • 查询第1页的5条数据(1-5条) limit 0, 5

    • 查询第2页的5条数据(6-10条) limit 5, 5

    • 请求第1页的10条数据 limit 0,10

    • 请求第3页的10条数据 limit 20,10

    • 请求第8页的10条数据 limit 70,10

    • 请求第6页的8条数数据 limit 40,8

  1. 查询工资最低的3个员工信息

查询按照工资升序排序的第一页的3条数据

select * from emp order by sal limit 0,3;

  1. 按照入职日期(hiredate) 升序排序 查询第3页的3条数据

select * from emp order by hiredate limit 6,3;

  1. 查询工资最高的员工信息

select * from emp order by sal desc limit 0,1;

  1. 查询按照工资降序第2页的5条数据

select * from emp order by sal desc limit 5,5;

综合练习题

1. 查询员工表中3号部门工资高于1500的员工信息

select * from emp where dept_id=3 and sal>1500;

2. 查询2号部门员工或者没有领导的员工信息

select * from emp where dept_id=2 or manager is null;

3. 查询有领导的员工姓名,工资按照工资降序排序

select name,sal from emp

where manager is not null order by sal desc;

4. 查询2号和3号部门的员工姓名和入职日期hiredate按照入职日期降序排序

select name,hiredate from emp where dept_id in(2,3) order by hiredate desc;

5. 查询名字中包含僧和包含精的员工姓名

select name from emp where name like “%僧%” or name like “%精%”;

6. 查询工资高于2000的工作有哪几种?

select distinct job from emp where sal>2000;

  1. 查询工资升序第4页的2条数据

select * from emp order by sal limit 6,2;

别名

select name as “姓名” from emp ;

select name “姓名” from emp ;

select name 姓名 from emp ;

聚合函数

  • 通过聚合函数可以对查询的多条数据进行统计查询,统计查询的方式包括:求平均值, 求最大值,求最小值,求和,计数
  1. 平均值avg(字段名)
  • 查询1号部门的平均工资

select avg(sal) from emp where dept_id=1;

  • 查询销售的平均工资

select avg(sal) from emp where job=“销售”;

  1. 最大值max(字段名)
  • 查询程序员的最高工资

select max(sal) from emp where job=“程序员”;

  1. 最小值min(字段名)
  • 查询3号部门的最低工资

select min(sal) from emp where dept_id=3;

  1. 求和sum(字段名)
  • 查询2号部门的工资总和

select sum(sal) from emp where dept_id=2;

  1. 计数count(*)
  • 查询程序员的数量

select count(*) from emp where job=“程序员”;

数值计算 + - * / %

  1. 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)

select name,sal,sal*5 年终奖 from emp;

  1. 给3号部门的员工每人涨薪5块钱

update emp set sal=sal+5 where dept_id=3;

晚课练习题:

1. 查询工资大于等于3000的员工姓名和工资

2. 查询1号部门的员工姓名和工作

3. 查询不是程序员的员工姓名和工作(两种写法)

4. 查询奖金等于300的员工姓名,工资和工作

5. 查询1号部门工资大于2000的员工信息

6. 查询3号部门或工资等于5000的员工信息

7. 查询出CEO和项目经理的名字

8. 查询工资为3000,1500和5000的员工信息

9. 查询工资不等于3000,1500和5000的员工信息

10. 查询工资在1000到2000之间的员工信息

11. 查询工资在1000到2000以外的员工信息

12. 查询有领导的员工姓名和领导id

13. 查询没有领导的员工姓名和领导id

14. 查询员工表中出现了哪几种不同的工作

15. 查询员工表中出现了那几个部门的id

16. 查询姓孙的员工姓名

17. 查询名字最后一个字是精的员工信息

18. 查询工作中包含销售的员工信息

19. 查询工作中第二个字是售的员工信息

20. 查询名字中包含僧的员工并且工资高于2000的员工信息

21. 查询1号和2号部门中工作以市开头的员工信息

22. 查询所有员工的姓名和工资 按照工资升序排序

23. 查询所有员工的姓名和工资 按照工资降序排序

24. 查询所有员工姓名 工资和部门id 按照部门id降序排序,如果部门id一致则按照工资升序排序

25. 查询员工表中3号部门工资高于1500的员工信息

26. 查询2号部门员工或者没有领导的员工信息

27. 查询有领导的员工姓名,工资按照工资降序排序

28. 查询2号和3号部门的员工姓名和入职日期hiredate 按照入职日期降序排序

29. 查询名字中包含僧和包含精的员工姓名

30. 查询工资高于2000的工作有哪几种?

31. 查询工资最高的前三个员工

32. 查询员工表按照id排序, 第2页的5条数据

33. 查询员工表按照id排序, 第3页的4条数据

34. 查询3号部门工资最低的员工姓名和工资

35. 查询工作不是人事的员工中工资降序第二页的3条数据

36. 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)

37. 给3号部门所有员工涨薪5块钱

38. 查询没有领导的员工和3号部门的员工,工资降序取前三条

39. 查询2号部门的最高工资

40. 查询有领导的员工中工资在1000到2000之间的人数

41. 查询3号部门的工资总和

42. 查询程序员和销售的总人数

43. 查询1号部门有领导的员工的平均工资

44. 查询1号部门的最低工资和最高工资

45. 查询和销售相关的工作人数

46. 查询工资不是1500和3000的员工人数

47. 查询1号部门出现了哪几种工作

day03

内容回顾:

  1. 数据库相关SQL
  • 查询所有 show databases;

  • 创建 create database db1 charset=utf8/gbk;

  • 查询信息 show create database db1;

  • 删除 drop database db1;

  • 使用 use db1;

  1. 表相关SQL
  • 创建 create table t1(name varchar(20)) charset=utf8/gbk;

  • 查询所有 show tables;

  • 查询表信息 show create table t1;

  • 表字段 desc t1;

  • 删除表 drop table t1;

  • 修改表名 rename table t1 to t2;

  • 添加字段 alter table t1 add age int first/ after xxx;

  • 删除字段 alter table t1 drop age;

  • 修改字段 alter table t1 change 原名 新名 新类型;

  1. 数据相关SQL
  • 插入数据 insert into t1(字段1名,字段2名) values(值1,值2),(值1,值2),(值1,值2);

  • 查询数据 select 字段信息 from 表名 where 条件;

  • 修改数据 update 表名 set xxx=xxx,xxx=xxx where 条件;

  • 删除数据 delete from 表名 where 条件;

  1. SQL语句分类
  • DDL: 数据定义语言 包括 数据库相关和表相关的SQL

  • DML: 数据操作语言 包括 增删改查

  • DQL: 数据查询语言 包括 select查询

  • TCL: 事务控制语言

  • DCL: 数据控制语言

  1. 去重distinct

  2. and or not

  3. between x and y 两者之间

  4. in(xxx,xxx)

  5. 模糊查询like %0或多个未知字符 _1个未知字符

  6. 排序 order by 字段名 asc/desc,字段名 asc/desc

  7. 分页 limit 跳过的条数,请求条数(每页条数)

  8. 别名 select name 名字 from emp;

  9. 聚合函数: 求平均值avg(), 最大值max(), 最小值min(),求和sum(),计数count(*)

分组查询 group by

  • 格式: group by 分组的字段名
  1. 查询每个部门的平均工资

select dept_id,avg(sal) from emp group by dept_id;

  1. 查询每个部门的最高工资

select dept_id,max(sal) from emp group by dept_id;

  1. 查询每种工作的最高工资

select job,max(sal) from emp group by job;

  1. 查询每种工作的人数

select job,count(*) from emp group by job;

  1. 查询每个部门工资高于2000的人数

select dept_id,count(*) from emp where sal>2000 group by dept_id;

  1. 查询每个部门有领导的员工的人数

select dept_id,count(*) from emp where manager is not null group by dept_id;

having

  • where后面只能写普通字段的条件,不能包含聚合函数

  • having后面可以包含聚合函数的条件,需要和group by结合使用,写在group by的后面

  1. 查询每个部门的平均工资要求平均工资高于2000

select dept_id,avg(sal) from emp group by dept_id having avg(sal)>2000;

  1. 查询每种工作的人数,只查询人数大于1 的

select job,count(*) from emp group by job having count(*)>1;

select job,count(*) c from emp group by job having c>1;

  1. 查询每个部门的工资总和,只查询有领导的员工, 并且要求工资总和大于5400

select dept_id,sum(sal) s from emp where manager is not null group by dept_id having s>5400;

4. 查询每个部门的平均工资, 只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的

select dept_id,avg(sal) a from emp where sal between 1000 and 3000 group by dept_id having a>=2000;

各个关键字的书写顺序

select 查询的字段信息 from 表名 where 普通字段条件 group by 分组字段名 having 聚合函数条件 order by 排序字段名 limit 跳过条数,请求条数;

子查询(嵌套查询)

  1. 查询工资大于2号部门平均工资的员工信息

select avg(sal) from emp where dept_id=2;

select * from emp where sal>(select avg(sal) from emp where dept_id=2);

  1. 查询工资高于程序员最高工资的员工信息

select max(sal) from emp where job=“程序员”;

select * from emp where sal>(select max(sal) from emp where job=“程序员”);

  1. 查询工资最高的员工信息

select max(sal) from emp;

select * from emp where sal=(select max(sal) from emp);

  1. 查询和孙悟空相同工作的员工信息

select job from emp where name=“孙悟空”;

select * from emp where job=(select job from emp where name=“孙悟空”) and name!=“孙悟空”;

  1. 查询拿最低工资员工的同事们的信息(同事指同一部门)

select min(sal) from emp;

select dept_id from emp where sal=(select min(sal) from emp);

select * from emp where dept_id=(select dept_id from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);

关联关系

  • 指创建的表和表之间存在的业务关系

  • 有哪几种关系?

    • 一对一: 有AB两张表,A表中的一条数据对应B表中的一条数据, 同时B表中的一条数据也对应A表中的一条数据
  • 一对多:有AB两张表,A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据对应A表中的一条数据

    • 多对多:有AB两张表,A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据也对应A表中的多条数据
  • 表和表之间如何建立关系 ,通过外键字段建立关系

    • 一对一: 在任意表中添加一个建立关系的字段指向另外一张表的主键 .

    • 一对多: 在多的表中添加建立关系的字段(外键) 指向另外一张表的主键 .

    • 多对多: 需要创建一个单独的关系表,里面至少包含两个字段分别指向另外两个表的主键.

关联查询

  • 同时查询多张表数据的查询方式称为关联查询
  • 关联查询包括: 等值链接, 内连接和外连接

关联查询之等值链接

  • 格式: select * from A,B where 关联关系
  1. 查询工资高于2000的员工姓名和对应的部门名

select e.name,d.name,sal

from emp e,dept d where e.dept_id=d.id and sal>2000;

关联查询之内连接

  • 格式: select * from A join B on 关联关系
  1. 查询工资高于2000的员工姓名和对应的部门名

select e.name,d.name,sal from emp e join dept d on e.dept_id=d.id where sal>2000;

关联查询之外连接

  • 等值链接和内连接查询到的都是两张表的交集数据

  • 外连接查询的是一张表的全部和另外一张表的交集数据

  • 格式: select * from A left/right join B on 关联关系

insert into emp(name,sal) values(“灭霸”,5);

  1. 查询所有员工姓名和对应的部门名

select e.name,d.name from emp e left join dept d on e.dept_id=d.id;

  1. 查询所有部门的名称,地点和对应的员工姓名和工资

select d.name,loc,e.name,sal

from emp e right join dept d on e.dept_id=d.id;

关联查询总结:

  1. 如果需要同时查询多张表的数据使用关联查询

  2. 关联查询包括:等值链接,内连接和外连接

  3. 等值链接和内连接查询的是两个表的交集数据, 推荐使用内连接

  4. 如果需要查询一张表的全部和另外一张表的交集时 使用外连接,只需要掌握左外即可,因为表的位置可以交换

如何查询多对多表中的数据

  • 创建表:

create table student(id int primary key auto_increment,name varchar(50))charset=utf8;

create table teacher(id int primary key auto_increment,name varchar(50))charset=utf8;

create table t_s(tid int,sid int);

  • 插入数据

insert into teacher values(null,“苍老师”),(null,“传奇哥”);

insert into student values(null,“小明”),(null,“小红”),(null,“小绿”),(null,“小狗”),(null,“小黄”);

insert into t_s values(1,1),(1,5),(1,4),(2,2),(2,3),(2,1),(2,5);

  1. 查询每个老师对应的学生

select t.name,s.name

from teacher t join t_s ts on t.id=ts.tid

join student s on s.id=ts.sid;

  1. 查询苍老师的学生都有谁?

select s.name

from teacher t join t_s ts on t.id=ts.tid

join student s on s.id=ts.sid

where t.name=“苍老师”;

  1. 查询小明的老师是谁?

select t.name

from teacher t join t_s ts on t.id=ts.tid

join student s on s.id=ts.sid

where s.name=“小明”;

JDBC

  • JavaDataBaseConnectivity: Java数据库链接

  • 学习JDBC主要学习的就是如何通过Java语言和MySQL数据库进行链接并执行SQL语句.

  • JDBC是Sun公司提供的一套专门用于Java语言和数据库进行链接的API(Application Programma Interface应用程序编程接口)

  • 为什么使用JDBC?

Sun公司为了避免Java程序员,每一种数据库软件都学习一套全新的方法,通过JDBC接口将方法名定义好, 让各个数据库厂商根据此接口中的方法名写各自的实现类(就是一个jar文件, 称为数据库的驱动) ,这样Java程序员只需要掌握JDBC接口中方法的调用,即可访问任何数据库软件.

  • 如何通过JDBC链接数据库并执行SQL语句

    • 创建Maven工程

    • 在工程的pom.xml文件中 添加MySQL驱动的依赖坐标

    • 创建cn.tedu.Demo01.java文件 添加以下代码

//1.创建链接对象 异常抛出

Connection conn =

DriverManager.getConnection(“jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false”,

“root”,“root”);

System.out.println(“链接对象:”+conn);

//2.创建执行SQL语句的对象

Statement s = conn.createStatement();

//3.执行SQL语句 execute执行

s.execute(“create table jdbct1(age int)”);

//4.关闭资源

conn.close();

System.out.println(“执行完成!”);

执行SQL语句的对象Statement

  • execute(“sql”); 此方法可以执行任意SQL语句, 但建议执行DDL(数据库相关和表相关的SQL语句)

  • int row = executeUpdate(“sql”); 此方法用来执行增删改相关的SQL语句, 返回值表示生效的行数

  • ResultSet rs = executeQuery(“sql”); 此方法用来执行查询相关的SQL语句,返回值ResultSet叫做结果集对象,查询到的数据都装在此对象中

day04

数据库连接池DBCP

  • DataBaseConnectionPool, 数据库连接池

  • 作用: 将连接重用,从而提高执行效率

  • 如何使用数据库连接池?

//创建连接池对象

DruidDataSource ds = new DruidDataSource();

//设置数据库连接信息 url 用户名 密码

ds.setUrl(“jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false”);

ds.setUsername(“root”);

ds.setPassword(“root”);

//设置初始连接数量

ds.setInitialSize(3);

//设置最大连接数量

ds.setMaxActive(5);

//从连接池中获取连接 异常抛出

Connection conn = ds.getConnection();

System.out.println(“连接对象:”+conn);

注册登录

  • 创建用户表

use empdb;

create table user(id int primary key auto_increment,username varchar(50),password varchar(50),nick varchar(50))charset=utf8;

select count(*) from user where username=‘tom’ and password=‘123456’;

  • SQL注入: 往本应该传值的地方,传递进来的SQL语句,导致原有SQL语句的逻辑发生改变, 这个过程称为SQL注入

select count(*) from user

where username=‘abcd’ and password=‘’ or ‘1’=‘1’

PreparedStatement预编译的SQL执行对象

  • 此对象可以将编译SQL语句的时间点提前,提前后可以将SQL语句逻辑部分提前锁死, 用户输入的内容将不能影响原有SQL语句的逻辑部分,从而解决了SQL注入的问题

  • 如果SQL语句中存在变量,则必须使用PreparedStatement,解决SQL注入问题, 而且可以提高开发效率(避免了拼接字符串)

  • 如果SQL语句中没有变量,可以使用Statement或PreparedStatement

数据库常见错误

  1. 用户名或密码错误: 检查用户名或密码

  2. 值的数量 和字段数量不匹配, 检查表的字段是否正确,检查插入的值是否正确

  3. 主键值重复了

  4. 值不能为null

  5. JDBC链接数据库时的报错: 代表没有启动MySQL服务, 在我的电脑上右键管理 找到Mysql服务右键开启即可

  6. 个别MySQL版本出现的SSL异常, 在连接数据库的url上面添加&useSSL=false 即可解决

  7. SQL语句拼写错误

  8. 参数位置超出范围, ?的数量和替换问号时?的位置不匹配

SpringBoot

Web服务软件做了那些事儿?

  • web服务软件就是传奇老师带着写的webServer, 也就是Tomcat
  1. 负责建立底层的网络连接

  2. 根据客户端请求的静态资源路径找到对应的静态资源文件并把该文件返回给客户端

举例:http://localhost:8080/index.html

  1. 根据客户端请求的动态资源路径找到对应的Controller里面的方法并且执行

举例:http://localhost:8080/hello

  • Web服务软件自身不提供任何业务功能,通过Controller给工程添加具体的业务功能

SSM三大框架

  • Spring框架(第四阶段讲)

  • SpringMVC框架(第二阶段到第四阶段)

  • Mybatis框架(第三阶段到第四阶段)

SpringBoot框架

  • 如果创建一个空工程,在此工程中使用SSM框架时需要添加大量的依赖和书写大量的配置文件, 通过SpringBoot框架可以更加便捷的让工程中引入各种框架, SpringBoot框架帮助我们构建工程.

如何创建SpringBoot工程

  1. 第一个页面中可以修改创建工程的网址

    a. https://start.spring.io 默认

    b. https://start.springboot.io 备用1

    c. https://start.aliyun.com 备用2

  2. 设置 以下内容

  3. 选择创建工程时添加的依赖

  4. 点击Finishi等待下载内容

  5. 如何检查工程是否创建成功?

在idea的底部 找到Build 然后看里面是否出现绿色的对勾

6. 如果第五步没有绿色对勾 , 刷新maven

  1. 检查maven是否已经改成aliyun的配置文件

  2. 如果已经改成aliyun的 还有错的话, 找到.m2文件夹下的repository文件夹删除 ,删除完之后再次重复第6步 刷新maven

  3. 在工程的static文件夹中添加index.html 页面中显示HelloSpringBoot 启动工程 通过浏览器访问http://localhost:8080 检查是否显示了此页面

  4. 创建controller.HelloController类 在里面添加hello方法处理/hello请求,给客户端响应一句话, 重启工程,浏览器访问http://localhost:8080/hello 测试是否成功

任务: 依次创建至少5个工程将创建工程的流程熟练掌握(每次运行新工程之前需要关闭之前的工程,不然会出现端口被占用的问题)

boot1-1

boot1-2

boot1-3

boot1-4

表设计面试题

2021年过年时小明在这些天都收到了许多亲戚\朋友还有同事的红包,也发出了一些红包,有的是微信,有的是支付宝也有现金,请参考下面的题目帮小明设计表格保存红包的信息

(至少包含一张流水表) 先列出需要保存的数据有哪几种

关系,红包类型,红包金额,时间,性别,名字

1. 设计表

流水表: id,红包金额,时间,红包类型,人物id

create table trade(id int primary key auto_increment,money int,time date,type varchar(10),person_id int)charset=utf8;

人物表: id,名字,性别,关系

create table person(id int primary key auto_increment,name varchar(50),gender char(1),rel varchar(5))charset=utf8;

  • 准备数据

- 插入人物数据: 人物表,刘德华 男 亲戚 ,杨幂 女 亲戚 ,马云 男 同事,特朗普 男 朋友, 貂蝉 女 朋友

insert into person values(null,‘刘德华’,‘男’,‘亲戚’),(null,‘杨幂’,‘女’,‘亲戚’),(null,‘马云’,‘男’,‘同事’),(null,‘特朗普’,‘男’,‘朋友’),(null,‘貂蝉’,‘女’,‘朋友’);

- 插入流水数据:

刘德华 微信 收1000 2021-03-20杨幂 现金 收500 发50 2021-04-14马云 支付宝 收20000 发5 2021-03-11特朗普 微信 收2000  2021-05-18貂蝉 微信 发20000 2021-07-22

insert into trade values(null,1000,“2021-03-20”,“微信”,1),

(null,500,“2021-04-14”,“现金”,2),(null,-50,“2021-04-14”,“现金”,2),

(null,20000,“2021-03-11”,“支付宝”,3),(null,-5,“2021-03-11”,“支付宝”,3),(null,2000,“2021-05-18”,“微信”,4),

(null,-20000,“2021-07-22”,“微信”,5);

2. 统计2021年2月15号到现在的所有红包收益

select sum(money) from trade where time>“2021-2-15”;

3. 查询2021年2月15号到现在 金额大于100 所有女性亲戚的名字和金额

select name,money from person p join trade t on p.id=t.person_id where time>“2021-2-15” and money not between -100 and 100 and gender=“女” and rel=“亲戚”;

4. 查询三个平台(微信,支付宝,现金)分别收入的红包金额

select type,sum(money) from trade where money>0 group by type;

day02

客户端发出请求的几种方式

  1. 通过浏览器的地址栏中发出请求

  2. 通过html页面中的超链接发出请求

  3. 通过html页面中的form表单发出请求

  4. 通过前端框架发出请求

工程中使用数据库需要做的几件事:

  1. 在pom.xml中添加 MySQL依赖和数据库连接池依赖,从jdbc01工程中去复制两个依赖粘贴到新工程中, 然后刷新maven(必须做)

  2. 把jdbc01工程中的DBUtils 复制到新工程的utils包下面

Mybatis框架

  • 此框架是目前最流行的数据持久层框架,是对JDBC代码进行了封装, 程序员只需要通过注解或配置文件的方式提供需要执行的SQL语句,框架会自动根据SQL语句生成出JDBC代码,从而提高执行效率

  • 如何使用Mybatis框架?

  1. 创建boot2-1工程 , 创建工程时需要勾选3个内容分别是:

    a. Web->Spring Web

    b. SQL-> Mybatis Framework

    c. SQL-> MySQL Driver

  2. 在application.properties配置文件中书写连接数据库的信息

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.url=jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false

Mybatis框架添加英雄步骤:

  1. 创建boot2-3 打钩 3个

  2. 在application.properties配置文件中添加内容

  3. 停止之前工程, 运行新工程测试是否能正常运行

  4. 创建index.html 页面 里面添加超链接 添加英雄 访问地址为add.html

  5. 创建add.html页面 里面添加form表单 请求地址为 /add

  6. 创建controller.HeroController, 里面添加@Controller注解,添加@RequestMapping注解处理 /add请求 并添加add方法,

  7. 创建entity.Hero实体类 并提供get和set方法 还有tostring方法

  8. 在HeroController的add方法参数列表中声明Hero对象 用来接收传递过来的参数 ,此时打桩输出hero对象 检查是否接收到了参数

  9. 创建mapper.HeroMapper接口, 里面添加@Mapper注解, 声明一个insert方法通过@Insert注解修饰,注解里面添加插入数据的SQL语句

  10. 在HeroController里面 通过@Autowired注解把HeroMapper装配进来, 在add方法里面调用mapper.insert方法把接收到的hero对象传递进去, 重启工程测试即可!

删除英雄步骤:

  1. 在首页中添加删除英雄超链接 访问地址为 delete.html

  2. 创建delete.html页面 在里面添加form表单 提交地址为/delete

  3. 在HeroController 中创建delete方法 处理路径为/delete 参数列表中声明name 接收页面传递过来的名字

  4. 在HeroMapper里面添加deleteByName方法 通过@Delete注解修饰,里面填写 删除的SQL语句

  5. 在HeroController里面的delete方法中调用mapper的deleteByName方法

修改英雄步骤:

  1. 在首页添加修改英雄超链接, 地址为update.html页面

  2. 创建update.html页面 并添加form表单 提交地址为/update

  3. 在Controller中添加update方法 处理/update请求

  4. 在HeroMapper里面添加update方法 通过@Update注解进行修饰,里面添加修改的SQL语句

  5. 在HeroController里面的update方法中调用mapper的update方法把接收到的hero对象传递到方法中

查询英雄步骤:

  1. 在首页添加查询的超链接,请求地址为/select

  2. 在HeroController中添加select方法处理/select请求

  3. 在HeroMapper里面添加select方法用@Select注解进行修饰,里面写查询的SQL语句

  4. 在HeroController的select方法中 调用mapper的select方法,把查询到的List集合返回给客户端展示

day03

商品表的增删改查

  • 创建商品表

use empdb;

create table product(id int primary key auto_increment,title varchar(100),price double(10,2),sale_count int)charset=utf8;

  1. 创建boot3-1工程 打3个勾

  2. 从别的工程中复制application.properties配置文件的信息到新工程, 启动工程测试是否成功.

同步请求和异步请求

  • 同步: 指单线程依次做几件事

  • 异步: 指多线程同时做几件事

  • 同步请求: 指客户端浏览器只有一个主线程, 此线程负责页面的渲染和发出请求等操作, 如果此主线程发出请求的话则停止渲染而且会清空页面显示的内容 直到服务器响应了数据后才能再次显示, 由于主线程清空了原有显示的内容所以只能实现页面的整体刷新(整体改变)

  • 异步请求: 指客户端的主线程只负责页面渲染相关操作,发请求的事儿由新的子线程操作, 这样子线程发出请求时页面不需要清空,而且可以将查询回来的数据展示在原有页面基础之上, 这样实现的效果就叫做页面的局部刷新

客户端发出请求的几种方式

  1. 通过浏览器的地址栏中发出请求 同步请求

  2. 通过html页面中的超链接发出请求 同步请求

  3. 通过html页面中的form表单发出请求 同步请求

  4. 通过前端框架发出请求 异步请求

客户端如何发出异步请求

  1. 通过Axios框架发出异步请求

  2. 此框架就是一个普通的js文件 页面需要使用此框架时需要将此文件引入到页面中

  3. 从苍老师文档服务器中找到axios框架地址

<script src=“https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js”></script>

Get请求和Post请求

  • 从字面意思理解, Get是跟服务器要数据, Post是给服务器传数据

  • Get: 请求参数写在请求地址的后面(可见),请求参数有大小限制只能穿几k的数据(不能处理文件上传)

    • 应用场景: 查询请求一般都会使用get, 删除也会使用get请求
  • Post:请求参数放在请求体里面(不可见),参数没有大小限制

    • 应用场景: 文件上传, 带有敏感信息的请求(比如注册登录时有密码)

注册登录步骤: 至少写3遍以上

  1. 创建工程boot3-2 打钩3个

  2. 从之前工程中复制application.properties里面的连接数据库的信息 ,复制完之后立即启动工程 测试是否创建成功, 如果工程启动不起来 检查报错是不是因为端口被占用, 如果不是 刷新maven 再次启动 ,如果还是启动不了 删除工程重新创建新工程 直至启动成功.

  3. 创建index.html页面 在里面添加两个超链接访问注册和登录页面

  4. 创建reg.html页面 在页面中引入vue和axios两个框架文件 从之前工程中复制js文件夹(检查里面是不是包含这两个框架文件) 在页面中 点击按钮时向/reg发出异步请求,同时把用户输入的信息提交给服务器,然后在then方法里面判断返回的response.data值为1代表注册成功 显示首页 值为2代表用户名已存在

  5. 创建controller.UserController 并且创建entity.User实体类

  6. 在Controller里面添加reg方法处理/reg请求 声明User变量用来接收传递过来的用户信息

  7. 创建mapper.UserMapper 在里面提供两个方法 分别是 selectByUsername 和 insert两个方法

  8. 回到Controller里面把UserMapper通过@Autowired装配进来,在reg方法中先调用mapper里面的selectByUsername方法 判断返回值是否有值 如果有值则给客户端返回2代表用户名已存在 如果没有值 则调用mapper的insert方法 把用户信息保存到数据库,最后返回1 代表注册成功

  9. 下一步开始实现登录功能, 步骤类似注册 先创建login.html页面 然后在页面中通过Vue对内容进行管理 当点击登录按钮的时候 向/login发出异步请求 同样把输入的用户信息提交给服务器, 在then方法中判断response.data的值为1代表登录成功显示首页 值为2 代表用户名不存在, 值为3 代表密码错误

  10. 在Controller里面添加login方法处理/login请求,声明User对象接收传递过来的用户信息, 在方法中调用mapper的selectByUsername 通过用户输入的用户名查询对应的用户信息,如果没有查询到 直接返回2代表用户名不存在,如果查询到了 继续通过输入的密码和查询到的密码比较如果一致返回1代表登录成功, 如果不一致返回2 代表密码错误.

端口被占用

  1. 检查是不是有其它正在运行的工程, 将其关闭后再运行新工程

  2. 如果没有正在运行的工程,可通过以下几种方式:

    a. 重启电脑

    b. 修改工程的端口号

c. 在命令行中 执行以下指令找到占用8080端口的进程,然后执行杀掉该进程的指令, 释放出8080端口
netstat -o -n -a | findstr :8080
taskkill /F /PID 进程号

day04

后端的MVC设计模式

  • 把实现一个业务的代码划分为三部分,分别是: 页面相关(V),业务逻辑相关©,数据相关(M)

  • M:Model 数据模型, 对应的代码是数据库相关的Mapper部分

  • V:View 视图, 对应所有页面相关内容

  • C:Controller 控制器,对应的是Controller相关代码

  • 实现一个业务的顺序: V页面相关代码->C Controller相关代码->M 数据库Mapper相关代码

  • 排错时也是从这三部分代码中找问题

  • 后端MVC涉及模式中的V页面相关,前端工程师将页面又划分为了MVC三部分

前后端分离

  • 如果前后端不分离, 后端服务器需要两套代码来应对 手机客户端和浏览器客户端, 因为不同的客户端的需求内容是不一样的,这样后端的开发效率就会受影响.

  • 前后端分离:指在Controller中不再处理页面相关内容, 浏览器客户端需要先请求页面,页面加载完之后从页面中再次发出请求获取数据, 得到数据后把数据展示在页面中,这个过程属于页面的局部刷新, 同步请求只能实现页面的整体刷新无法实现局部刷新, 所以以后不再使用同步请求, 全部使用异步请求,因为以后工作基本全是前后端分离思想.

JSON

  • JSON是一种轻量级的数据交换格式(数据封装格式)

  • 客户端和服务器之间需要互相传递数据,当需要传递复杂数据时需要按照特定的格式将数据进行封装,JSON就是这样一个通用格式.

登录成功

用户名已存在

密码错误

1

2

3

“id=1, title=手机 , price=1000, saleCount=500”

[{“id”:1,“title”:“阿迪袜子”,“price”:10.0,“saleCount”:1000},{“id”:3,“title”:“裤子”,“price”:50.0,“saleCount”:400},{“id”:4,“title”:“袜子”,“price”:5.0,“saleCount”:100}]

服务器和客户端之间如何传递复杂数据

商品管理添加商品步骤:

  1. 创建工程 3个打钩 修改application.properties配置文件, 启动工程测试是否成功

  2. 创建index.html首页 和 insert.html页面

  3. 在insert.html页面中添加三个文本框和一个添加按钮, 通过Vue对页面内容进行管理,此时需要把之前工程中的js文件夹复制到新工程, 当点击添加按钮时向/insert地址发出异步post请求把用户输入的商品信息提交

  4. 创建controller.ProductController 添加insert方法处理/insert请求 创建Product实体类 在insert方法中声明用来接收传递过来的参数(此参数需要通过@RequestBody注解进行修饰

  5. 创建ProductMapper 在里面添加insert方法通过@Insert注解修饰

  6. 在Controller中将ProductMapper装配进来, 在insert方法中调用mapper的insert方法把接收到的Product对象传递过去

商品管理商品列表步骤:

  1. 在index.html页面中添加商品列表超链接 请求地址为/list.html页面

  2. 创建list.html页面, 在页面中添加表格,并且通过Vue进行管理,在Vue的created方法中发出异步的get请求,把请求回来的数据交给一个数组变量, 然后让页面中表格的内容和数据变量进行绑定, 当数组有值时页面会自动显示数据

  3. 在ProductController中添加select方法 处理/select请求,方法中调用mapper的select方法 把得到的List集合直接返回给客户端

  4. 实现 mapper里面的select方法

商品管理删除商品步骤:

  1. 在商品列表页面中添加删除的超链接 ,废掉超链接的跳转功能添加点击事件,调用del方法, 在方法中向/delete发出异步get请求并且把商品的id传递过去

  2. 在ProductController中 添加delete方法处理/delete请求在方法中调用mapper的deleteById方法把接收到的id传递进去

  3. 实现mapper里面的deleteById方法

商品管理修改商品步骤:

  1. 给列表页面添加 修改超链接 往/update.html页面跳转 并且传递过去商品id

  2. 创建update.html页面 在Vue的created方法中得到传递过来的id 然后向/selectById 发出异步的get请求 把id传递过去 把服务返回的数据用一个product对象接收, 并且页面内容和此对象进行绑定 这样对象有值页面就能跟着显示

  3. 在ProductController里面添加selectById方法 处理/selectById请求, 在方法中调用Mapper的selectById方法

  4. 实现mapper里面的selectById方法

  5. 给update.html页面中的修改按钮添加点击事件, 点击时向/update地址发出异步的post请求把商品的信息一起提交

  6. 在ProductController里面添加update方法处理/update请求,在方法中掉用mapper的update方法

  7. 实现mapper里面的update方法 .

day05

微博练习步骤

  1. 创建boot5-1工程 3个打钩

  2. 配置文件中添加以下内容(empdb改成weibo) ,并启动工程检查是否能够成功运行

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.url=jdbc:mysql://localhost:3306/weibo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false

#设置文件上传大小的限制

spring.servlet.multipart.max-file-size=10MB

  1. 创建数据库和表

create database weibo charset=utf8;

use weibo;

create table user(id int primary key auto_increment,username varchar(50),password varchar(50),nick varchar(50))charset=utf8;

  1. 在工程中添加首页index.html 在工程中添加js和css文件夹(从4-2工程中复制),添加完之后 Buil->ReBuild
  2. 创建微博表

use weibo;

create table weibo(id int primary key auto_increment,content varchar(100),url varchar(255),nick varchar(50),created timestamp,user_id int)charset=utf8;

会话管理

  • 客户端和服务器之间进行数据传输遵循的是HTTP协议,此协议属于无状态协议(一次请求对应一次响应,响应完之后链接就会断开) 服务器是无法跟踪客户端的请求.通过Cookie服务器可以给客户端添加一个标识,当客户端再次发出请求时会带着这个Cookie这样服务器就能识别此客户端了, 但是由于Cookie是保存在客户端的存在被篡改的风险,Session的出现解决了此问题

  • Cookie: 打孔式会员卡, 数据保存在客户端

    • 只能保存字符串数据

    • 默认数据是保存在浏览器内存中,当会话结束(浏览器关闭)数据会删除, 也可以设置自定义的保存时长,设置完之后数据会保存在磁盘中时间到了之后清除.

    • 应用场景: 需要长时间保存的数据,比如:记住用户名和密码

  • Session:相当于银行卡, 数据保存在服务器内存中(工程重新启动会清空所有Session)

    • 可以保存任意对象类型的数据

    • 默认数据只能保存半小时左右,而且不建议修改保存时长,因为数据是保存在服务器的内存中的, 服务器只有一个所以不能占用太多的内存.

    • 应用场景: 保存登录状态,涉及敏感数据,因为数据保存在服务器会更安全

如何通过Session对象记住登录状态

  1. 在登录成功时把当前客户端登录的user用户对象保存到当前客户端所对应的Session对象里面,

  2. 每个客户端进入到首页index.html时会立即发请求获取当前客户端登录的用户对象, 服务器接收到请求后会从当前客户端所对应的Session对象里面获取曾经保存过的用户对象(前提是登陆过),如果没有登录直接获取得到的是null返回给客户端,此时客户端得到的是""空字符串, 客户端判断是否是空字符来表示是否登录过, 通过给isLogin赋值true或false来控制页面显示的内容

Day06

上传图片注意事项

  1. 在application.properties里面填写最大上传文件大小的配置信息

  2. 在application.properties里面填写配置静态资源文件夹的信息

酷鲨商城项目步骤:

  1. 创建coolshark项目, 打3个勾

  2. 从上一个工程中复制application.propertise 里面所有内容到新工程,然后停掉之前工程 运行新工程测试是否能够正常启动(如果不能启动 删除工程重新创)

  3. 把讲前端时做好的页面添加到工程中, 3个文件夹和4个页面, 添加完之后Rebuild工程 , 然后运行工程访问首页检查是否正常显示

  4. 修改application.propertise里面数据库的名字为cs

  5. 建库建表

create database cs charset=utf8;

use cs;

create table user(id int primary key auto_increment,username varchar(50),password varchar(50),nick varchar(50))charset=utf8;

insert into user values(null,‘admin’,‘123456’,‘管理员’);

登录功能步骤:

a. 修改登录页面 给按钮添加点击事件, 点击时向/login发出请求

b. 创建UserController 添加login方法处理/login请求

c. 创建User实体类

d. 创建UserMapper 添加 登录相关方法

首页分类展示功能步骤:

a. 创建表和准备数据

create table category(id int primary key auto_increment,name varchar(50))charset=utf8;

insert into category values(null,“男装”),(null,“女装”),(null,“医药”),(null,“美食”),(null,“百货”),(null,“数码”);

b. 创建Category实体类

c. 创建CategoryMapper,里面提供insert和select两个方法

d. 创建CategoryController 里面添加select方法处理/category/selec

e. 在首页index.html页面中的created方法中向/category/select发出请求获取所有分类信息, 把查询到的数据赋值给一个数组变量 , 让页面中显示分类的地方 和数组进行绑定 通过v-for指令显示出所有分类信息

首页轮播图展示步骤:

a. 创建保存轮播图的表和轮播图数据

create table banner(id int primary key auto_increment,url varchar(255))charset=utf8;

insert into banner values(null,‘/imgs/b1.jpg’),(null,‘/imgs/b2.jpg’),(null,‘/imgs/b3.jpg’),(null,‘/imgs/b4.jpg’);

b. 在首页index.html页面中的created方法里面向/banner/select发出请求把得到的数据赋值给vue里面的bannerArr数组

//发出请求获取所有轮播图信息

axios.get(“/banner/select”).then(function (response) {

v.bannerArr = response.data;

})

c. 创建BannerController 添加select方法处理/banner/select请求

d. 创建Banner实体类

e. 创建BannerMapper 里面提供select方法

后台管理页面分类管理步骤

  1. 在admin.html页面中先引入 axios框架

  2. 在页面中添加created方法 在里面向/category/select发请求获取所有分类数据, 把得到的数据赋值给categoryArr数组,页面会自动展示

  3. 给删除添加点击事件调用categoryDelete方法,参考Web阶段day07的员工列表练习

  4. 在方法中向/category/delete发出请求并且把分类的id传递过去

  5. 在CategoryController中添加delete方法 处理/category/delete请求,方法中调用mapper里面的deleteById方法

  6. 实现mapper里面的deleteById方法

添加分类步骤:

  1. 在点击添加分类时弹出文本输入框

  2. 在then方法里面 向/category/insert发出异步请求 把分类的名称拼接到请求地址的后面

  3. CategoryController里面创建insert方法处理/category/insert, 在参数列表中声明Category对象 用来接受传递过来的参数,调用mapper里面的insert方法

  4. 实现CategoryMapper里面的insert方法

管理页面轮播图展示

  1. 在admin.html页面中的created方法中 向/banner/select发出请求获取所有轮播图数据 把请求到的数据赋值给bannerArr数组,页面即可显示正确数据

删除轮播图

  1. 在admin.html页面中给删除按钮添加点击事件调用bannerDelete方法

  2. 在方法中发出删除请求

  3. 在BannerController中添加delete方法处理/banner/delete请求 方法中调用mapper的deleteById方法

  4. 实现mapper中的deleteById方法

项目峰会

  • B2C的 商城(推荐,有难度 有挑战) B2C(指商家和顾客)

  • C2C的商城不推荐(类似淘宝,京东 因为功能太多实现不完)

  • 不推荐办公OA系统, 因为OA系统有非常成熟的工作流框架

  • 项目峰会项目 前后端比 尽量在前端30%后端70%

  • 不推荐: 听歌,看电影,小说, 漫画 这些类型

day07

网站图标ico

  • 在工程的static里面他添加favicon.ico图片文件

删除轮播图同时删除文件

添加轮播图

  1. 在admin.html中添加跳转页面的代码

  2. 从微博练习中把insert.html页面复制到新工程中 改名为insertBanner.html, 把微博练习中的UploadController复制到新工程的controller包里面

  3. 修改insertBanner.html页面 发请求的地址改成了/banner/insert

  4. 在BannerController里面添加insert方法 处理/banner/insert,方法中调用mapper的insert方法 把banner的数据保存到数据库中

  5. 实现mapper里面的banner方法

添加商品步骤:

  1. 建表

use cs;

create table product(id int primary key auto_increment,title varchar(100),url varchar(255),price double(10,2),old_price double(10,2),view_count int,sale_count int,created timestamp, category_id int)charset=utf8;

  1. 创建添加商品的页面insertProduct.html

  2. 修改admin.html页面中点击添加商品侧边栏时 操作的代码

  3. 在insertProduct.html页面中添加created方法,在方法中向/category/select发请求 得到所有的分类信息 赋值给Vue里面的categoryArr数组

  4. 遍历categoryArr数组 在下拉选中添加显示的分类

  5. 点击发布按钮时请求的地址改为/product/insert

  6. 在ProductController中 处理/product/insert请求 方法中调用mapper的insert方法

  7. 创建ProductMapper实现insert方法

管理页面商品列表展示功能

  1. 在admin.html页面中的created方法里面 向/product/select发出请求 把查询到的数据给到productArr数组

  2. 在ProductController里面添加select方法 处理/product/select请求, 在方法中调用mapper的select方法

  3. 实现mapper里面的select方法

删除商品步骤: 整体流程参考删除轮播图

  1. 在admin.html页面中修改点击删除时调用的方法 把handleDelete改成productDelete

  2. 在methods里面添加productDelete方法,在方法中向/product/delete发出请求 同时把商品的id传递过去

  3. 在ProductController中添加delete方法处理/product/delete请求,方法中先通过id查询到商品图片的url,然后得到商品图片的完整路径 删除图片文件, 然后在调用mapper的deleteById方法

  4. 实现mapper里面deleteById方法

首页展示商品步骤:

  1. 在index.html页面的created方法中向/product/select/index发出请求,把得到的数据赋值给productArr数组

  2. 在ProductController中添加selectIndex方法处理/product/select/index请求, 在方法中调用mapper的selectIndex方法

  3. 在mapper中实现selectIndex方法(首页展示什么则查询什么)

排行榜步骤:

  1. 在首页created方法里面 向/product/select/top发出请求 把得到的数据赋值给topArr数组

  2. 在ProductController里面添加selectTop处理/product/select/top请求,在处理请求的方法中调用mapper的selectTop方法

  3. 在Mapper里面实现selectTop方法, 查询数据时按照销量排序并且只查询6条数据

  4. 在index.html页面中查询到数据的时候如果长度超过3个字符则变成前三个字符+… 非常漂亮的上衣 非常漂… 处理代码写在ProductController中的selectTop方法中

在application.properties里面配置自定义的值


点击分类查看分类下的商品

  1. 复制index.html页面 改名为result.html页面, 把新页面中的轮播图和排行榜删除

  2. 在index.html页面点击某个分类的时候跳转到result.html页面并且把分类的id传递过来

  3. 在result.html页面的created方法中,之前请求所有商品,现在改成请求某个分类下的商品

  4. 在ProductController中创建selectByCid方法 处理/product/select/category请求, 方法中调用mapper的selectByCid方法

  5. 实现mapper里面的selectByCid方法

day08

搜索功能步骤:

  1. 让搜索框和某个变量进行双向绑定,给搜索按钮添加点击事件

  2. 点击时跳转到结果页面 并且把需要搜索的关键字传递过去

  1. 在结果页面的created方法中 取出wd 然后发出搜索请求

  2. 在ProductController中添加search方法处理/search请求, 方法中调用mapper的selectByWd方法

  3. 实现mapper里面的selectByWd方法(需要用到模糊查询)

  4. 回车搜索功能

结果页面的搜索功能

  1. 给结果页面的文本框双向绑定wd 给文本框添加回车键按下事件 并且给搜索按钮添加点击事件 两个事件都调用search方法

  2. 在methods里面实现search方法, 在方法中向/search发出请求把搜索的关键字传递过去,把查询到的数据赋值给productArr数组即可

商品详情页面

  1. 给首页和结果页的商品添加点击跳转功能,并把商品的id传递过去

  2. 在detail.html详情页面的created方法中得到地址栏中传递过来的商品id,然后向/product/selectById?id=xxx 发出请求 把查询到的一个商品的信息赋值给Vue里面的product对象

  3. 在页面中把product对象里面的数据展示到标签里面

  4. 在ProductController里面添加selectById方法处理/product/selectById请求,在方法中调用mapper的selectById方法

  5. 实现mapper里面的selectById方法

浏览量


当浏览量发生改变发布时间跟着改变的原因

  • 大部分MySQL数据库软件timestamp字段的默认效果是当表中任何一个字段的值发生改变时timestamp字段会自动变为当前的系统时间

  • 关闭自动更新

alter table product change created created timestamp not null default current_timestamp;

  • 打开自动更新

alter table product change created created timestamp not null default current_timestamp on update current_timestamp;

后台管理页面显示当前登录的用户信息

  1. 在登录成功时把用户对象保存到Session会话对象中

  2. 在admin.html页面中的created方法中 向/currentUser地址发请求获取当前登录的用户对象并且把对象赋值给Vue里面的user,如果没有得到当前登录的用户对象代表未登录状态跳转到登录页面

  3. 在UserController中处理/currentUser请求 从Session对象中获取当前登录的用户对象并返回

退出登录步骤:

  1. 给退出登录超链接添加点击事件,在事件方法中发出退出登录请求

  2. 在UserController里面处理该请求

过滤器Filter

  • 作用: 过滤器里面的代码会在执行Controller代码之前和执行完Controller代码之后执行, 这样的话可以将多个Controller中重复的操作写在过滤器里面,这样可以起到代码重用的作用

  • 如何使用过滤器?

  1. 创建Filter类文件

package cn.tedu.coolshark.filter;

import cn.tedu.coolshark.entity.User;

import javax.servlet.*;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.io.IOException;

@WebFilter(filterName = “MyFilter”,urlPatterns = {“/insertProduct.html”,“/admin.html”})

public class MyFilter implements Filter {

//当过滤器销毁时执行的方法

public void destroy() {

}

//当接收到请求时会执行此方法,需要在此方法中进行判断 是否允许访问Controller或静态资源文件

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

//将父类类型转换成子类类型

HttpServletRequest st = (HttpServletRequest) req;

HttpServletResponse se = (HttpServletResponse) resp;

//得到会话对象

HttpSession session = st.getSession();

//从会话对象中得到登录成功时保存的用户对象

User user = (User) session.getAttribute(“user”);

if (user!=null){//代表登录过

chain.doFilter(req, resp);//放行 允许访问资源

}else{//代表未登录

se.sendRedirect(“/login.html”); //重定向 让客户端重新向指定的地址发出请求

}

System.out.println(“过滤器执行了”);

}

//当过滤器初始化时执行的方法

public void init(FilterConfig config) throws ServletException {

}

}

  1. 在XXXXApplication.java文件中添加注解

urlPatterns的配置方式

  1. 精确匹配 /admin.html /insertProduct.html

  2. 后缀匹配 *.jpg *.png *.html

  3. 路径匹配: /product/* /user/*

  4. 全部匹配: /* (客户端发出的所有请求都会被过滤器拦截)

工作中查询数据时不推荐使用*

因为表字段有修改的可能,如果原表只有2个字段,某个地方只需要2个字段的数据

此时写*号没有问题, 但是如果增加的新的需求需要改动原表的字段改成5个字段, 那么之前只需要查询两个字段的地方由于使用的是*也会变成查询5个字段的数据但是多查询的3个字段数据是没有用的这样就造成了网络资源的浪费.

删除分类时删除商品

  1. 在CategoryController的delete方法中调用商品Mapper里面的通过分类id删除的方法

  2. 实现ProductMapper里面的通过分类id删除的方法

表设计之权限管理

  • 任何网站中只要是存在权限管理的需求,表格都是设计成5张表,其中三张主表(用户表,角色表,权限表) 两张关系表(用户-角色关系表, 角色权限关系表)
  • 创建三张主表

create database lastdb charset=utf8;

use lastdb;

create table user(id int primary key auto_increment,name varchar(50))charset=utf8;

create table role(id int primary key auto_increment,name varchar(50))charset=utf8;

create table module(id int primary key auto_increment,name varchar(50))charset=utf8;

  • 创建两张关系表

用户角色关系表:create table u_r(uid int,rid int);

角色权限关系表:create table r_m(rid int,mid int);

  • 准备数据

insert into user values(null,‘刘德华’),(null,‘王菲’);

insert into role values(null,‘男游客’),(null,‘女会员’);

insert into module values(null,‘男浏览’),(null,‘男发帖’),(null,‘女浏览’),(null,‘女发帖’);

  • 建立关系

刘德华->男游客和女会员 王菲->女会员

男游客->男浏览, 女会员->女浏览,女发帖

insert into u_r values(1,1),(1,2),(2,2);

insert into r_m values(1,1),(2,3),(2,4);

权限管理关联查询相关练习题

  1. 查询刘德华有哪些角色?

select r.name

from user u join u_r ur on u.id=ur.uid

join role r on r.id=ur.rid where u.name=“刘德华”;

  1. 查询女会员这个角色对应的用户都有谁?

select u.name

from user u join u_r ur on u.id=ur.uid

join role r on r.id=ur.rid where r.name=“女会员”;

  1. 查询男游客这个角色拥有什么权限?

select m.name

from role r join r_m rm on r.id=rm.rid

join module m on rm.mid=m.id where r.name=“男游客”;

  1. 查询女会员这个角色拥有什么权限?

select m.name

from role r join r_m rm on r.id=rm.rid

join module m on rm.mid=m.id where r.name=“女会员”;

  1. 查询刘德华这个用户拥有什么权限?

select m.name

from user u join u_r ur on u.id=ur.uid

join r_m rm on ur.rid=rm.rid

join module m on m.id=rm.mid

where u.name=“刘德华”;

  1. 查询拥有女发帖这个权限的用户都有谁?

select u.name

from user u join u_r ur on u.id=ur.uid

join r_m rm on ur.rid=rm.rid

join module m on m.id=rm.mid

where m.name=“女发帖”;

上个班的项目展示

SpringBoot常见错误列表:

解决问题的思路:

a. 检查页面中是否报错,在浏览器中按F12 查看console控制台的报错, 此时可能会得到前端的错误提示信息和后端相关的错误码(404,500,400),

b. 查看idea控制台里面的报错

c. 如果页面中没有展示出数据可以通过浏览器直接向异步请求的地址发出请求,检查是否得到了数据,如果浏览器中显示了JSON格式的数据说明服务器正常返回了数据此时Controller和Mapper是没有问题的,说明此时出错的是页面, 如果说没有数据代表服务器的问题检查Controller和Mapper相关的代码

d. 万能解决方案: 有正确代码的前提下, 实现一个功能总共设计到三部分代码:VCM, 从正确的代码中按照VCM划分三部分,替换一部分后立即测试看问题是否解决,如果没有解决继续替换其它部分,如果解决了那么错误的范围已经确定好, ctrl+z撤销回来检查具体出错的位置

e. 代码全部正确(前提是已经用老师代码替换过) 还有错:

i.  刷新mave+Rebuild工程+重启工程ii. 检查数据库中的表是否有错iii. 检查application.properties配置文件是否有错iv. 重启idea测试 有时idea会莫名出错
  1. 浏览器中显示400状态码, 是传参出错, 比如接收参数的类型是数值类型,测试时传递过去一个字符串内容,这时会报400错误

  2. 浏览器中显示404状态码

  • 404代表找不到资源

    • 找不到静态资源: 比如 *.html *.jpg *.xxx

      • 检查浏览器请求路径是否正确

      • 检查文件是否保存在了正确的位置(一般放在static文件夹下面)

      • 如果上面两种情况都没有问题,重新编译工程并重启工程 Build->ReBuild

    • 找不到动态资源: 比如 /hello 由controller处理的路径称为动态资源

      • 检查浏览器请求路径是否正确

      • 检查Controller是否创建在了工程自带的包的里面

      • 检查是否在Controller类里面的类名上面添加@Controller注解

      • 检查Controller里面RequestMapping注解中处理的路径是否正确

      • 如果上面两种情况都没有问题,重新编译工程并重启工程 Build->ReBuild

  1. 浏览器显示500状态码
  • 500代表服务器执行错误, 此时第一时间查看idea控制台的错误,里面会有错误相关的提示,根据提示信息再分析具体哪里错了.
  1. Controller中处理了相同的路径

  2. 创建完包含Mybatis框架的工程直接运行时会报以下错误,需要在application.properties配置文件中添加以下内容

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.url=jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false

  1. 查询单个对象的信息时查询结果中包含了多个结果会报以下错误

  2. 在Vue对象实例化之前访问对象报错, 目前我们接触到的写代码的位置只有created方法中是实例化过程中的方法,在此方法中访问Vue对象需要用this而不是变量名v, 如果使用v则会在浏览器控制台中报以下错误

如果上传的图片不显示按照以下步骤检查:

a. 检查文件是否保存到了指定的文件夹

b. 检查数据库里面保存的图片路径是否正确 和文件夹中图片名是否一致

c. 检查配置的静态资源文件夹是否成功(往文件夹中放一张文件名比较简单的图片, 通过localhost:8080/图片名 访问)

d. 在页面中图片标签上面右键检查 查看图片的路径是否正常

问问题需要给老师提交的内容包括: 错误效果截图,错误提示信息截图, 相关代码截图(截图中要包含行号)

不要启动老师的工程 ,如果更新完老师代码报错 要刷新maven 和ReBuild工程

数据库增删改查的基本操作和SpringBoot创建相关推荐

  1. IntelliJ Idea SpringBoot 数据库增删改查实例

    . ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \\\\( ( )\___ | '_ | '_| | '_ \/ _` | \\\\ \\/ ___)| | ...

  2. mongodb android,Android编程连接MongoDB及增删改查等基本操作示例

    本文实例讲述了Android编程连接MongoDB及增删改查等基本操作.分享给大家供大家参考,具体如下: MongoDB简介 Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提 ...

  3. 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现

    常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现 以下方法全部亲测可用 //测试查找全部@Testpublic void testSelectAll(){List<U ...

  4. Mysql (一)Mysql 数据库增删改查

    mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...

  5. sql增删改查_快速搞定数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...

  6. Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

    此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...

  7. php+mysql+into_PHP+Mysql 如何实现数据库增删改查

    PHP+Mysql实现数据库增删改查的方法:1.创建入口文件[index.html]连接数据库.查询数据:2.点击增加按钮,通过[addnews.html]添加数据:3.点击删除按钮,通过服务端文件[ ...

  8. Java连接Mysql数据库增删改查实现

    Java连接Mysql数据库增删改查实现 时间比较赶,我这里只实现查询,有时间再添加另外两个 难度 : ⭐⭐⭐(全星5颗星的情况下) 新建一个动态的网站工程, 把jar包全部复制进去,主要要那个mys ...

  9. flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

    Flask-SQLAlchemy对数据库增删改查 安装 pip install flask-sqlalchemy 具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释 @app.route( ...

  10. mysql 中caption_Django-Model操作数据库(增删改查、连表结构)(示例代码)

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表 基本结构 from django.db importmodelsclassuserinfo(models ...

最新文章

  1. Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤
  2. 帮腾讯云拿下行业第一的程序员们,不穿格子衫和人字拖
  3. linux设备和驱动加载的先后顺序
  4. CTF-web-xff,referer 知识点;
  5. 从源代码角度分析ViewStub 疑问与原理
  6. XenApp6 建立请求的连接时出错解决方法
  7. [html] 一个标签上同时出现三个或多个class属性,请问它的渲染顺序是怎样的?
  8. 60-150-040-使用-Sink-Flink自定义UpsertStreamTableSink
  9. 分布式锁--Redis实现
  10. HTML做出7个网页,HTML适用于除IE 7以外的每个网页浏览器。
  11. Eclipse — 如何导入MySQL驱动
  12. 60、弱电网络管理入门与基础技术
  13. 太阳系行星运转示意图
  14. RunCat for windows安装教程
  15. TiDB 的现在和未来
  16. 基于物联网的智慧农业监测系统(前端界面有web端和微信小程序端)
  17. pdf 转 高清图片
  18. 《国产操作系统之银河麒麟》桌面环境
  19. 多目标跟踪(MOT,Multiple Object Tracking)评价指标
  20. 怎么用一个元素实现十字架

热门文章

  1. 异常检测论文阅读《Anomaly Detection in Video Sequences: A Benchmark and Computational Model》
  2. 双拼对简拼和混拼的支持
  3. ssm基于微信小程序的物流仓储系统vue
  4. nginx +location + https
  5. 树莓派—raspbian软件源
  6. 计算机制图员主要学什么,制图员
  7. coldfusion_ColdFusion MX 7功能之旅
  8. J2EE配置文件加密
  9. NDT算法配准代码学习,很详细,很多不懂,一句一句解释。
  10. 腾讯云服务器操作系统TencentOS的正确安装方法