JavaWeb开发---学习---(一)

前言

前端知识会点,后端知识一直算是空白,但也不算是太空
会java、sql、web,好赖懂点,现在要串联起来,学会服务端开发
也为日后自己做个小项目打点基础(虽然有点晚,但是,只要学,就有机会)

本次学习视频教程:JavaWeb

自己只做部分知识点的记录,详细的,可以看老师有自己的讲义,可参考


Web后端基础

Maven(专家)

类似于cocoapods,是集成下载第三方库的

搜索第三方库的网址:https://mvnrepository.com/

单元测试

在这里插入图片描述

在这里插入图片描述

单元测试,一般使用JUnit(测试框架)来进行
有几个好处:

  1. 测试代码与源代码分开,便于维护
  2. 可根据需要进行自动化测试
  3. 可自动分析测试结果,产出测试报告

Spring

Spring

在这里插入图片描述
在这里插入图片描述

照猫画虎,哈哈,画成了~

@ResponseBody注解的作用

  1. 将controller方法的返回值直接写入HTTP响应体
  2. 如果是对象或集合,会先转为json,再响应
  3. @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: 生成全参构造函数

注解使用时机总结

  1. 类级别注解: 通常在定义类时使用,如 @RestController@Service@Mapper
  2. 方法级别注解: 用于处理特定请求或执行特定功能,如 @RequestMapping
  3. 字段级别注解: 用于依赖注入或数据映射,如 @Autowired
  4. 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-流程

在这里插入图片描述

拦截器可以根据需求,配置不同的拦截路径:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值