前言
前端知识会点,后端知识一直算是空白,但也不算是太空
会java、sql、web,好赖懂点,现在要串联起来,学会服务端开发
也为日后自己做个小项目打点基础(虽然有点晚,但是,只要学,就有机会)
本次学习视频教程:JavaWeb
自己只做部分知识点的记录,详细的,可以看老师有自己的讲义,可参考
Web后端基础
Maven(专家)
类似于cocoapods,是集成下载第三方库的
搜索第三方库的网址:https://mvnrepository.com/
单元测试


单元测试,一般使用JUnit(测试框架)来进行
有几个好处:
- 测试代码与源代码分开,便于维护
- 可根据需要进行自动化测试
- 可自动分析测试结果,产出测试报告
Spring


照猫画虎,哈哈,画成了~
@ResponseBody注解的作用
- 将controller方法的返回值直接写入HTTP响应体
- 如果是对象或集合,会先转为json,再响应
- @RestController = @Controller + @ResponseBody
分层解耦
三层架构

分层解耦


数据库学习
MySql下载地址
按照MySql后,按照Mac安装MySQL详细教程文档,配置一下
常用操作:
-- 查看当前数据库所有表
show tables;
-- 查看表结构
desc emp;
-- 查询建表语句
show create table emp;
# CREATE TABLE `emp` (
# `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
# `username` varchar(20) NOT NULL COMMENT '用户名',
# `password` varchar(32) DEFAULT '123456' COMMENT '密码',
# `name` varchar(10) NOT NULL COMMENT '姓名',
# `gender` tinyint unsigned NOT NULL COMMENT '性别 1男 2女',
# `phonenumber` char(11) NOT NULL COMMENT '手机号',
# `posit` tinyint unsigned DEFAULT NULL COMMENT '职位 1班主任 2讲师 3 学工主管',
# `salary` float unsigned DEFAULT NULL COMMENT '薪资',
# `icon` varchar(255) DEFAULT NULL COMMENT '头像',
# `join_date` date DEFAULT NULL COMMENT '入职日期',
# `create_time` datetime DEFAULT NULL COMMENT '创建时间',
# `update_time` datetime DEFAULT NULL COMMENT '修改时间',
# `qq` varchar(13) DEFAULT NULL COMMENT 'QQ',
# PRIMARY KEY (`id`),
# UNIQUE KEY `id` (`id`),
# UNIQUE KEY `username` (`username`),
# UNIQUE KEY `phonenumber` (`phonenumber`)
# ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'
-- 字段:添加字段wx
alter table db02.emp add weixin varchar(10) comment '微信号';
-- 字段:修改字段类型 weixin varchar(10)
alter table emp modify weixin varchar(20);
-- 字段:修改字段名 weixin -> wx
alter table emp change weixin wx varchar(20);
-- 字段:删除字段 qq
alter table emp drop qq;
-- 修改表名
alter table emp rename to employee;
-- 删除表
drop table employee;
表查询语句:


-- =================== DQL: 基本查询 ======================
-- 1. 查询指定字段 name,entry_date 并返回
select name, emp.entry_date from emp;
-- 2. 查询返回所有字段
select * from emp;
-- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期)
select name as name1, entry_date as entry_date2 from emp;
-- 4. 查询已有的员工关联了哪几种职位(不要重复)
select distinct emp.job from emp;
-- =================== DQL: 条件查询 ======================
-- 1. 查询 姓名 为 柴进 的员工
select * from emp where name = "柴进";
-- 2. 查询 薪资小于等于5000 的员工信息
select * from emp where salary <= 5000;
-- 3. 查询 没有分配职位 的员工信息
select * from emp where job is null;
-- 4. 查询 有职位 的员工信息
select * from emp where job is not null;
-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';
-- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where emp.entry_date between '2000-01-01' and '2010-01-01';
-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where emp.entry_date between '2000-01-01' and '2010-01-01' and gender = '2';
-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job in(2, 3, 4);
-- 9. 查询 姓名 为两个字的员工信息
# select * from emp where name
select * from emp where name like '__';
-- 10. 查询 姓 '李' 的员工信息
select * from emp where name like '李%';
-- 11. 查询 姓名中包含 '二' 的员工信息
select * from emp where name like '%二%';


-- =================== DQL: 分组查询 ======================
-- 聚合函数
-- 1. 统计该企业员工数量
select count(emp.id) from emp;
select count(*) from emp;
select count(1) from emp;
-- 2. 统计该企业员工的平均薪资
select avg(emp.salary) from emp;
-- 3. 统计该企业员工的最低薪资
select min(emp.salary) from emp;
-- 4. 统计该企业员工的最高薪资
select max(emp.salary) from emp;
-- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和)
select sum(emp.salary) from emp;
-- 分组
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender, count(*) from emp group by gender;
-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*) from emp where entry_date <= '2015-01-01' group by job having count(*) > 2;

-- =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序
select * from emp order by entry_date;
-- 2. 根据入职时间, 对员工进行降序排序
select * from emp order by entry_date desc;
-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from emp order by entry_date asc, update_time desc;

JDBC
关系型数据库有很多,比如mySql、Oracle、SqlServer
不同的数据库有差别,所以,有一套提供接口的API:JDBC,方便大家用一套API,操作不同的数据库
Mybatis又是对JDBC的一层封装

MyBatis

@Mapper// 加上这句话,可以在程序运行时,自动为该接口创建一个实现类对象(代理对象),并且会自动将该实现类对象存入IOC容器
public interface UserMapper {
//@Select("select id, username, password, name, age from user")//查询所有用户信息
public List<User> findAll();
@Delete("delete from user where id = #{id}")
// public void deleteById(Integer id);// 无返回值
public Integer deleteById(Integer id); // 有返回值
@Insert("insert into user(username, password, name, age) values(#{username}, #{password}, #{name}, #{age})")
public Integer insertUser(User user);
// @Update("update user set username = #{username}, password = #{password}, name = #{name}, age = #{age} where id = #{id}")
@Update("update user set username = #{username}, password = #{password}, name = #{name}, age = #{age} where id = #{id}")
public Integer updateUser(User user);
@Update("update user set username = #{username} where id = #{id}")
public Integer updateUser2(User user);
@Select("select * from user where username = #{username} and password = #{password}")
// public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
public User findByUsernameAndPassword( String username, String password);
}
import java.util.List;
@SpringBootTest(classes = SpringbootMybatisQuickstartApplication.class) //单元测试的注解
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testFindAll(){
List<User> userList = userMapper.findAll();
userList.forEach(System.out::println);
}
@Test
public void testDeleteById(){
Integer rows = userMapper.deleteById(5);
System.out.println("rows = " + rows);//影响的行数
}
@Test
public void testInsertUser(){
User user = new User(null, "zhouyu", "123456", "周瑜", 20);
Integer rows = userMapper.insertUser(user);
System.out.println("rows = " + rows);
}
@Test
public void testUpdateUser(){
User user = new User(6, "huanggai", "123456", "黄盖", 60);
Integer rows = userMapper.updateUser(user);
System.out.println("rows = " + rows);
}
@Test
public void testUpdateUser2(){
User user = new User();
user.setId(6);
user.setUsername("huanggai2");
Integer rows = userMapper.updateUser2(user);
System.out.println("rows = " + rows);
}
@Test
public void testFindByUsernameAndPassword(){
User user = userMapper.findByUsernameAndPassword("huanggai2", "123456");
System.out.println(user);
}
}

yml配置

Web后端实战
Tlias案例
前端服务器是nginx
后端服务器是tomcat
Restful
Restful,表述性状态转换,它是一种软件架构风格。
get查询
post新增
put修改
delete删除
话说,工作这么久,大部分接口都是get\post,基本上没用过put或者delete
创建新项目,需要添加的依赖:

有关注解的一些信息:
Spring相关注解
-
@SpringBootApplication: 标记在 [TliasWebManagementApplication](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/TliasWebManagementApplication.java#L5-L12) 类上,这是Spring Boot应用的入口注解,组合了多个注解功能,用于启用自动配置和组件扫描 -
@RestController: 标记在 [DeptController](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/controller/DeptController.java#L12-L25) 类上,是@Controller和@ResponseBody的组合注解,用于构建RESTful Web服务,所有方法的返回值都会直接写入HTTP响应体 -
@Autowired: 用于自动装配依赖,如在 [DeptController](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/controller/DeptController.java#L12-L25) 和 [DeptServiceImpl](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/service/impl/DeptServiceImpl.java#L10-L20) 中注入其他组件 -
@Service: 标记在 [DeptServiceImpl](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/service/impl/DeptServiceImpl.java#L10-L20) 类上,声明这是一个服务层组件,会被Spring容器自动检测和管理 -
@Mapper: 标记在 [DeptMapper](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/mapper/DeptMapper.java#L8-L12) 接口上,这是MyBatis框架的注解,表示这是一个Mapper接口,用于与数据库交互
Spring MVC相关注解
@RequestMapping: 用于映射HTTP请求到处理方法value = "/depts": 指定请求的URL路径method = RequestMethod.GET: 指定处理GET请求
MyBatis相关注解
@Select: 在 [DeptMapper](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/mapper/DeptMapper.java#L8-L12) 接口中使用,用于直接在注解中编写SQL查询语句
Lombok相关注解
-
@Data: 在 [Dept](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/pojo/Dept.java#L8-L16) 和 [Result](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/pojo/Result.java#L9-L38) 类上使用,自动生成getter、setter、toString等方法 -
@NoArgsConstructor: 生成无参构造函数 -
@AllArgsConstructor: 生成全参构造函数
注解使用时机总结
- 类级别注解: 通常在定义类时使用,如
@RestController、@Service、@Mapper - 方法级别注解: 用于处理特定请求或执行特定功能,如
@RequestMapping - 字段级别注解: 用于依赖注入或数据映射,如
@Autowired - SQL注解: 直接在Mapper接口方法上编写SQL语句,如
@Select
这些注解大大简化了Java代码的编写,通过声明式的方式实现各种功能,减少了样板代码的编写。




内连数据
-- ============================= 内连接 ==========================
-- A. 查询所有员工的ID, 姓名 , 及所属的部门名称 (隐式、显式内连接实现)
select emp.id, emp.name, dept.name from emp, dept where emp.dept_id = dept.id;
select emp.id, emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id;
select emp.id, emp.name, dept.name from emp join dept on emp.dept_id = dept.id;
-- B. 查询 性别为男, 且工资 高于8000 的员工的ID, 姓名, 及所属的部门名称 (隐式、显式内连接实现)
select emp.id, emp.name, dept.name from emp, dept where emp.dept_id = dept.id and emp.gender = 1 and emp.salary > 8000;

-- =============================== 外连接 ============================
-- A. 查询员工表 所有 员工的姓名, 和对应的部门名称 (左外连接)
# select emp.name, dept.name from emp, dept where emp.dept_id = dept.id;
select emp.name, dept.name from emp left outer join dept on emp.dept_id = dept.id;
-- B. 查询部门表 所有 部门的名称, 和对应的员工名称 (右外连接)
select emp.name, dept.name from emp right outer join dept on emp.dept_id = dept.id;
select emp.name, dept.name from dept left outer join emp on emp.dept_id = dept.id;
-- C. 查询工资 高于8000 的 所有员工的姓名, 和对应的部门名称 (左外连接)
select emp.name, dept.name from emp left outer join dept on emp.dept_id = dept.id where emp.salary > 8000;

子查询的要点是:先对需求做拆分,明确具体的步骤,然后再逐步编写SQL语句。
=============== 子查询 ================================
-- 标量子查询
-- A. 查询 最早入职 的员工信息
select * from emp where entry_date = (select min(entry_date) from emp);
-- B. 查询在 "阮小五" 入职之后入职的员工信息
select * from emp where entry_date > (select entry_date from emp where name = "阮小五");
-- 列子查询
-- A. 查询 "教研部" 和 "咨询部" 的所有员工信息
select * from emp where dept_id in (select dept.id from dept where name = "教研部" || name = "咨询部");
-- 行子查询
-- A. 查询与 "李忠" 的薪资 及 职位都相同的员工信息 ;
select * from emp where salary = (select salary from emp where name = "李忠") and job = (select job from emp where name = "李忠");
select * from emp where (salary, job) = (select salary, job from emp where name = "李忠");
-- 表子查询
-- A. 获取每个部门中薪资最高的员工信息
select dept_id, max(salary) from emp group by dept_id;
select * from emp where (dept_id, salary) in (select dept_id, max(salary) from emp group by dept_id);
select * from emp e, (select dept_id, max(salary) as max_salary from emp group by dept_id) a where e.dept_id = a.dept_id and e.salary = a.max_salary;
-- 需求:
-- 1. 查询 "教研部" 性别为 男,且在 "2011-05-01" 之后入职的员工信息 。
select * from emp where dept_id = (select id from dept where dept.name = "教研部") and gender = 1 and entry_date > "2011-05-01";
-- 2. 查询工资 低于公司平均工资的 且 性别为男 的员工信息 。
select * from emp where gender = 1 and salary < (select avg(salary) from emp);
-- 3. 查询部门人数超过 10 人的部门名称 。
select dept.name from dept where id in (select emp.dept_id from emp group by dept_id having count(emp.dept_id) > 10);
-- 4. 查询在 "2010-05-01" 后入职,且薪资高于 10000 的 "教研部" 员工信息,并根据薪资倒序排序。
select * from emp where entry_date > "2010-05-01" and salary > 10000 and dept_id = (select id from dept where dept.name = "教研部") order by salary desc;
-- 5. 查询工资 低于本部门平均工资的员工信息 。
select dept_id, avg(salary) from emp group by dept_id;
select * from emp, (select dept_id, avg(salary) as avg_salary from emp group by dept_id) as b where emp.dept_id = b.dept_id and emp.salary < b.avg_salary;
事务
全部成功才成功,
有一个失败就失败


JWT令牌
全称:JSON Web Token (https://www.jwt.io/)
定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。
组成:
- 第一部分:Header(头),记录令牌类型、签名算法等。
- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等
- 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload融入,并加入指定秘钥,通过指定签名算法计算而来
例如:eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5rGk5aeGIiwiaWQiOjEsInVzZXJuYW1lIjoidG9tIiwiZXhwIjoxNzYxNTczNDI0fQ.GFFwWZDVcYcd5X4LSz-p099x5IEqxkcyUlKUsrjiTsA
就是一个JWT令牌
过滤器(Filter)
Filter过滤器,是JavaWeb三大组件之一
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等
令牌校验Filter-流程

拦截器可以根据需求,配置不同的拦截路径:

2636

被折叠的 条评论
为什么被折叠?



