导言

前端

HTML

CSS

JavaScript

Vue

Ajax

前端项目(未学习)

打包部署(nginx)

把前端页面放入该文件夹的HTML文件夹中(默认90端口打开该文件夹)

localhost

localhost其实是域名,一般windows系统默认将localhost指向127.0.0.1,但是localhost并不等于127.0.0.1localhost指向的IP地址是可以配置的

127.0.0.1

首先我们要先知道一个概念,凡是以127开头的IP地址,都是回环地址(Loop back address),其所在的回环接口一般被理解为虚拟网卡,并不是真正的路由器接口。

所谓的回环地址,通俗的讲,就是我们在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机。

小说明:正常的数据包会从IP层进入链路层,然后发送到网络上;而给回环地址发送数据包数据包会直接被发送主机的IP层获取,后面就没有链路层他们啥事了。

127.0.0.1作为{127}集合中的一员,当然也是个回环地址。只不过127.0.0.1经常被默认配置为localhostIP地址
一般会通过ping 127.0.0.1来测试某台机器上的网络设备是否工作正常。

后端

SpringBootWeb基础

mySQL

JDBC(Mybatis底层原理)

Mybatis

JDBC(Java DataBase Connenctivity)

@springboottest

数据库连接池

  • 容器,负责分配,管理数据库连接
  1. 资源重用
  2. 提升系统响应速度
  3. 避免数据库连接遗漏

增删改查

//删
@Delete("delete from user where id = #{id}")  
public void deleteYid(Integer id);
 
@Test  
public void testDeleteById(){  
    userMapper.deleteYid(5);  
}
 
// 增
@Insert("insert into user(username, password, name,age) values (#{username},#{password},#{name},#{age})")  
public void insert(User user);
 
@Test  
public void testInsert(){  
    User user = new User(null,"gaoyuanyuan","666999","高圆圆",19);  
    userMapper.insert(user);
 
//改
@Update("update user set username = #{username}, password = #{password}, name = #{name}, age = #{age} where id = #{id}")  
public void update(User user);
@Test  
public void testUpdate(){  
    User user = new User(1, "duanxin","12334","段鑫",20);  
    userMapper.update(user);
    
//查
@Select("select * from user where username = #{username} and password = #{password}")  
public User finByNameAndPassword(@Param("username") String username, @Param("password")String password);  
//Mapper传递多个参数时,用Param注解(官方springboot骨架中,可以不用param注解)
@Test  
public void tsetSlect(){  
    userMapper.finByNameAndPassword("duanxin","12334");  
}
 

XML映射配置

MyBatiesX插件

SpringBoot配置文件

properties,yaml,yml

0开头的话,需要用‘ ’引起来

Web实战

开发规范Restful

特点 : ,HTTP动词描述操作

Apifox

作用 : 接口文档管理,接口请求测试,Mock服务

浏览器发起的请求的是GET方式的请求,如果需要发起POST,PUT,DELETE方式的请求,就需要借助这种工具

SpingAOP「面向接口(方面)编程」

  • 减少冗余代码
  • 代码无侵入
  • 效率高维护方便

SpringBoot原理

配置优先级:

java文件属性>命令行参数>p>yml>yaml

但通常为yml配置文件

Bean管理

SB原理(面试高频问题)

  • 起步依赖

  • 自动配置(常考)

Maven高级

后端总结

项目搭建

总体架构

数据封装

前后端联调测试

删除部门

  • 思路分析

添加部门

修改部门

  • 查询回显
  • 修改数据

RequestMapping(公共请求路径)

日志

  • 一般使用LogBack(框架) : (log4j升级版),性能好
  • Slf4j:简单日志门面,提供一套日志操作的标准接口和抽象类

外键约束(数据表的多表关系)

多对一

  1. 物理外键(不推荐) mysql 效率,集群,检查关系

  2. 逻辑外键

在业务逻辑中,解决外键关联

一对一

多用于单表拆分,提升操作效率

实现: 在任意一方加入外键,关联另一方的主键,并设置外键为唯一的(UNIQUE)

多对多

多表查询

原始方法查询(不要求掌握)

PageHelper(分页重点)

使用步骤

  • 引入依赖
  • 定义Mapper接口的查询方法(无需考虑分页)
  • 在Service方法中实现分页查询(需要给pageHelper传递分页参数)

对象接受参数(gitee)

动态Sql

<mapper namespace="com.itheima.mapper.EmpMapper">  
  
    <select id="list" resultType="com.itheima.pojo.Emp">  
        select e.*, d.name deptName from emp e left join dept d on e.dept_id = d.id  
          <where>  
              <if  test ="name != null and name!= ''">  
                  e.name like concat('%',#{name},'%')  
              </if>  
              <if test="gender != null">  
                  and e.gender = #{gender}  
              </if>  
              <if test="begin != null and end != null ">  
                  and e.entry_date between #{begin} and #{end}  
              </if>  
              order by e.update_time desc  
          </where>  
  
    </select>  
</mapper>

标签

<set>标签 自动去除多余逗号
当动态拼接多个字段时,<set> 会自动去除最后一个字段后的多余逗号(这是最常见的用途)

新增员工信息

基本信息

  • 架构

动态sql(forEach)

@Option:主键返回

事务

要么同时成功要么同时失败

spring事务管理

四大特性

文件上传

阿里云OSS对象存储服务

  • Bucket:存储对象的容器

注入属性两种方式

删除(修改)员工

异常处理

员工信息统计

Apache ECharts

case的使用

员工登陆(校验)

  • cookie优点:HTTP协议中支持的技术
  • cookie缺点: 移动端app无法使用cookie 不安全,用户可以自己删除 不能跨域
  • 原理: 响应头Set-Cookie 请求头Cookie

Session

Session的底层是根据Cookie的(set-cookie,cookie)

令牌

JWT令牌

public class JWTTest {  
  
    @Test  
    public void testGenerateJwt(){  
        Map<String,Object> dataMap = new HashMap<>();  
        dataMap.put("id",1);  
        dataMap.put("username","admin");  
        String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "aXRoZWltYQ==")//指定家,i算法  
                .addClaims(dataMap)//添加自定义集合  
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置过期时间  
                .compact();//生成令牌  
        System.out.println(jwt);  
  
    }  
  
    @Test  
    public void testParseJWT(){  
        String token = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImV4cCI6MTc1MDY4NjMxOH0.XfiZ6jPXIeWfmAAx04fxyHE59-PNflE3OFumCpm6-Ec";  
        Claims claims =  Jwts.parser().setSigningKey("aXRoZWltYQ==")  
                .parseClaimsJws(token)  
                .getBody();  
        System.out.println(claims);  
    }  
}

Filter

package com.itheima.filter;  
  
import jakarta.servlet.*;  
import jakarta.servlet.annotation.WebFilter;  
import lombok.extern.slf4j.Slf4j;  
  
import java.io.IOException;  
@Slf4j  
@WebFilter(urlPatterns = "/*")  
public class DemoFilter implements Filter {  
  
    //初始化方法  
    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        log.info("初始化...");  
    }  
  
    //拦截请求后,执行多次  
    @Override  
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
        log.info("拦截请求...");  
        //放行  
        filterChain.doFilter(servletRequest,servletResponse);  
    }  
  
    @Override  
    public void destroy() {  
        log.info("销毁...");  
    }  
}

令牌校验Filter

拦截器Intercepter

顺序可用order设置

Linux

Docker