1, Spring容器如何理解
   
    
    IOC: 控制反转
    
    具体含义: 将对象创建的权利交给Spring容器管理.
    
    原因: 如果将对象自己管理,则必然出现耦合性高的现象. 不方便扩展
    
    容器: 是一种数据结构类型 Map<K,V>集合
    
    KEY: 类名首字母小写
    
    Value: Spring为当前的类创建的对象.
    
    只要程序启动成功,则Map集合中(容器),里边包含了所有的IOC管理的对象
   
    2, Spring容器管理对象用法
   
    @Component注解说明
   
    表示: 表示将User对象交给Spring容器管理
    
    类似于: new User();
    
    问题: 如果直接new User(), 其中的属性都为null.
    
    需求: 准备User对象 id=100,name=“tomcat” age=18 sex=“男” 交给Spring容器管理!!!
    
    注意事项: 在进行测试时 将@Component删除
   
    @Bean注解
   
    注解说明: @Bean注解是Spring 专门为管理
    
     自定义对象
    
    研发的注解.
    
    用法区域: 在配置类文件中使用
   
    @SpringBootTest
   
    说明: SpringBoot为了测试方便专门开发了@SpringBootTest 主要的作用就是
    
     启动Spring容器
    
   
    3, JDBC缺点
   
- 
代码比较繁琐,不方便记忆.
 
- 
开发效率低
 
- 
JDBC操作数据库时 结果封装繁琐.
 
- 
JDBC 运行效率高,但是不便于编辑.
 
    4,Mybatis框架
   
    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
   
    总结: MyBatis 是一款优秀的持久层框架,利用ORM思想实现了数据库持久化操作.
    
    补充说明: 也有人把mybatis称之为半自动化的ORM映射框架
   
    4-1,ORM思想
   
    对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
   
    关系映射:
    
    1. 对象映射——-映射表
    
    2. 对象中有属性——-表中有字段
   
    
     
      总结: 以对象的方式操作数据库.
     
    
   
    1.面向过程编程 C语言 亲力亲为
    
    2.面向对象编程 C++ , java , python
    
    3.面向接口编程 目的实现层级的解耦.
   
    @Param注解说明
   
     
   
    5,关于Mybatis的注解开发说明
   
- 
注解开发 只适用于 单表CURD操作. 多表操作一定出问题
 
- 
如果设计到复杂标签时 where/set/foreach 等标签时,不可以使用注解.
 
- 
所以应该熟练掌握xml映射文件的写法,注解开发只是辅助的作用.
 
    6,Mybatis关联查询小结
   
- 
什么时候使用resultMap
 
 4.1 字段名称与属性名称不一致.
 
 4.2 做关联查询 实现数据封装时使用.
 
- 
查询用户信息 开启驼峰映射规则
 
 
 resultType:
 
 
 1.适用与单表查询,同时要求属性名称与字段相同.
 
 2.如果属性与字段满足驼峰命名规则,开启驼峰映射之后,
 
 可以使用resultType
 
 
 resultMap:
 
 
 1.如果字段不一致时使用
 
 2.多表关联查询时使用.
 
 3.如果开启了驼峰映射规则, 则自动映射的属性可以省略,最好标识主键
 
 4.如果使用驼峰规则映射时,需要映射封装对象时(一对一/一对多),默认条件下.驼峰规则失效.
 
 可以使用: autoMapping=”true” 要求开启驼峰映射.
 
 5.默认条件下 一对一,一对多不会自动完成驼峰规则映射.
 
 需要配置 autoMapping=”true”才能自动映射
 
- 
子查询用法:
 
 5.1 select 开始二次查询
 
 5.2 column 将字段的值作为参数传递给子查询 子查询通过#{字段名称}动态接收.
 
    7,Mybatis 缓存机制
   
    如果有大量相同的请求查询数据库,则数据库需要执行多次重复的sql,那么并发压力高,查询效率低. 如果引入缓存机制,则可以极大的提升用户的查询的效率
   
     
   
    7-1,Mybatis 提供缓存机制
   
    Mybatis中有2级缓存
    
    一级缓存 SqlSession 在同一个sqlSession内部 执行多次查询 缓存有效. 一级缓存默认开启状态.
    
    二级缓存 SqlSessionFactory级别. 利用同一个工厂,创建的不同的SqlSession 可以实现数据的共享(缓存机制). 二级缓存默认也是开启的.
   
    8,代理方式介绍
   
    JDK动态代理
   
    特点:
    
    1. 要求被代理者,必须有接口.
    
    2. 默认条件下如果有接口,则使用JDK动态代理
   
    CGLIB动态代理
    
    特点:
    
    1.不管被代理者是否有接口,都可以为其创建代理对象.
    
    2. 代理对象是目标对象的子类. 继承关系.
   
    结论:
    
    1.Spring中如果有接口,默认使用JDK代理方式,如果没有接口,则默认使用CGLIB代理方式.
    
    2.Spring5以后,自身接口对象创建代理对象时,使用cglib
   
    9,SSM框架案例
   
    框架关系图
   
     
   
    10,双向数据绑定的原理
   
    设计模型: MVVM
    
    模块说明:
    
    1. M Model 代表数据. 大概率事件 代表 data中的数据.
    
    2. VM ViewModel 视图模型层 在内部进行计算 在页面进行展现
    
    3. V View 视图层 用户看到的页面展现效果.
   
     
   
    11,生命周期函数分类
   
    第一类: 对象的初始化阶段
    
    1. beforeCreate.
    
    2. created
    
    3.beforeMount
    
    4.mounted
    
    第二类: 数据修改阶段
    
    1.beforeUpdate
    
    2.updated
   
    第三类: 对象的销毁阶段
    
    1.beforeDestroy
    
    2.destroyed
   
    11-1, 初始化时知识点
   
    
     1, beforeCreate
    
    
    在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
    
    解释: 创建了一个VUE的对象,只是还没有加载其中的属性.只是一个空对象.
    
    
     2,created
    
    
    在实例创建完成后被立即同步调用
    
    解释: VUE对象开始填充数据. 表示配置完成.
    
    
     3.beforeMount
    
    
    在挂载开始之前被调用:相关的 render 函数首次被调用。
    
    解释: 对象根据已经配置的内容,在指定的区域开始加载数据.(属性的值,保存到内存中)
    
    
     4.mounted
    
    
    实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了
    
    解释: 在指定的区域中,渲染页面. (为页面填充数据), 页面初始化完成.
   
    12, 远程调用
   
    什么是跨域
   
    说明: 浏览器解析Ajax时 要求浏览器的网址,与Ajax请求的网址,必须满足三要素.
    
    要素:
    
    1. 协议相同
    
    2. 域名相同
    
    3. 端口号相同
    
    如果上述的三要素都满足,则叫同域访问, 如果三要素有一项不满足,则称为跨域访问.
   
    13,密码加密
   
加密算法MD5
    规则说明: MD5加密算法,只能由明文转化为密文. 不可以反向编译.
    
    破解MD5加密算法:
   
     
   
    14,关于Session和Cookie说明
   
    
     14-1, 业务需求说明
    
    
    用户的请求是一次请求,一次响应. 当响应结束时,服务器返回的数据 也会销毁. 问题: 如果销毁了token 则认为用户没有登录.需要重复登录.
    
    如何解决该问题: 应该持久化token信息.
   
    
     14-2 Session
    
    
    Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。
   
    特点: Session总结
   
    Session 称之为 会话控制 技术
    
    Session生命周期, 会话结束 对象销毁.
    
    Session的数据存储在内存中.
    
    Session只可以临时存储数据.不能永久存储.
    
    
     14-3 Cookie总结
    
    
    Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 [1] 。
   
    特点:
    
    1. 类型: 小型文本文件.
    
    2. 文件通常是加密的.
    
    3. cookie 可以临时或者永久存储.
   
    
     14-4 关于Cookie和Session说明
    
    
    手机银行的登录信息? Session存储. 数据安全性高
    
    腾讯视频会员登录信息? Cookie存储 1个月免密登录.
    
    公司的财务系统登录信息? Session存储
    
    购物系统的登录信息? Cookie存储.
    
   
    15,node.js和vue脚手架的关系
   
- 
node.js 作用Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。
 
- 
VUE脚手架 是前端开发模拟后端设计的一种开发框架体系 xxx.vue
 
- 
VUE.js 是将javascript封装的高级渐进式的JS的
 
 框架
 
 
    16,Spring事务管理
   
    事务特性
   
- 
原子性: 原子不可分割.事务处理要么同时成功,要么同时失败.
 
- 
一致性: 多线程条件下,数据应该保持一致.
 
- 
隔离性: 多线程条件下,操作数据时,操作是独立互不干扰.
 
- 
持久性: 将数据最终处理之后,持久化到数据库中.
 
 谐音:日本名字 “原一隔持”
 
    16-1, Spring控制事务
   
    说明: Spring中提供了注解@Transactional 用来控制事务, 常见业务 增/删除/修改一般需要事务控制. 查询一般不用.
   
    16-2, Spring控制事务策略
   
    规则:
    
    1. Spring中的事务注解 默认条件下只处理运行时异常.如果遇到检查异常(编译异常)事务控制没有效果.
    
    2. 注解的属性控制
    
    rollbackFor = IOException.class , 遇到某种异常实现事务的回滚
    
    noRollbackFor = 遇到某种异常事务不回滚.
    
    readOnly = true 该操作是只读的,不能修改. 公告/合同等
   
    17,Spring 全局异常处理机制
   
    说明:
    
    1. 后端业务执行时,无法保证 业务运行不出错. 所以一般添加try-catch进行异常的捕获.
    
    2. 捕获异常是为了按照特定的要求 返回用户可以识别的有效数据.
    
    3. 如果添加了try-catch 则会对代码的可读性造成影响.
    
    4. 如果通过try-catch控制异常,则所有的controller方法都必须添加, 导致代码繁琐.
   
    18,Mybatis-Plus
   
    
     MP介绍
    
    
    MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
    
    说明: 使用MP将不会影响mybatis的使用.
   
    
     MP特性
    
    
    无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    
    损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    
    强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    
    支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    
    支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 – Sequence),可自由配置,完美解决主键问题
    
    支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    
    支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    
    内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
    
    内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
    
    分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
    
    内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
    
    内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
   
    
     Mybatis 特点
    
    
    Mybaits 是一个半自动化的ORM映射框架
    
    1.结果集可以实现自动化的映射. 自动
    
    2.Sql语句需要自己手动完成. 手动
    
    如果设计到单表的操作,如果每次都手写,则特别的啰嗦. 所以想办法优化.
    
    
     
      MP工作原理
     
    
   
    
     
      实质: MP动态生成Sql语句.
      
      铺垫:
      
      1. insert into 表名(字段名…) value (属性值…)
     
    
   
    
     
      工作原理:
      
      1. 用户执行userMapper.insert(user); 操作
      
      2. 根据UserMapper的接口找到父级BaseMapper.根据BaseMapper的接口查找泛型对象User.
      
      3. 根据User.class 获取注解@TableName(“demo_user”),获取表名
      
      4. 根据User.class 获取所有的属性,根据属性获取指定的注解@TableField(value = “name”),获取字段名称
      
      5. 根据属性获取属性的值.之后动态拼接成Sql语句
      
      6. 将生成的Sql交给Mybatis执行入库操作.
      
      1. insert into demo_user(id,name,age,sex) value (null,xx,xx,xx)
     
    
   
    
     
      MP使用特点: 根据其中不为null的属性进行业务操作!!!
     
    
    
    19,实现商品图片上传
   
package com.jt.service;
import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.FileNameMap;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Service
public class FileServiceImpl implements FileService{
    private String localDirPath = "E:/project3/images";
    private String preUrl = "http://image.jt.com";
    //1.校验图片类型   xxx.jpg   校验后缀是否为jpg
    @Override
    public ImageVO upload(MultipartFile file) {
        //1.1 获取文件名称  abc.jpg
        String fileName = file.getOriginalFilename();
        //1.2 全部转化为小写字母
        fileName = fileName.toLowerCase();
        //1.3正则校验是否为图片类型
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
            //图片类型 不匹配  程序应该终止
            return null;
        }
        //2.校验是否为恶意程序 怎么判断就是一张图 高度和宽度
        //2.1 通过图片对象进行处理
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();
            if(height == 0 || width == 0){
                return null;
            }
            //3.将图片分目录存储 yyyy/MM/dd
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                                .format(new Date());
            String dateDirPath = localDirPath + dateDir;
            File dirFile = new File(dateDirPath);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }
            //4.防止文件重名  动态生成UUID.类型
            //4.1 动态生成UUID
            String uuid = UUID.randomUUID().toString()
                              .replace("-","");
            //4.2 获取图片类型        abc.jpg    .jpg
            String fileType = fileName.substring(fileName.lastIndexOf("."));
            // uuid.jpg
            String newFileName = uuid + fileType;
            //5.实现文件上传 1.准备全文件路径  2. 封装对象实现上传
            String path = dateDirPath + newFileName;
            file.transferTo(new File(path));
            //6. 实现ImageVO数据的返回
            //6.1 准备虚拟路径 /2021/11/11/uuid.jpg
            String virtualPath = dateDir + newFileName;
            //6.2 准备URL地址  域名前缀 + 虚拟路径
            String url =  preUrl + virtualPath;
            System.out.println(url);
            return new ImageVO(virtualPath,url,newFileName);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    @Override
    public void deleteFile(String virtualPath) {
        String filePath = localDirPath + virtualPath;
        File file = new File(filePath);
        if(file.exists()){ //如果文件存在,则删除数据
            file.delete();
        }
    }
}
    20,Nginx
   
    
     Nginx介绍
    
    
    Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
    
    其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
   
    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
   
    
     Nginx-特点
    
    
    占用内存少 不超过2M tomcat服务器占用内存 200M
    
    并发能力强 3-5万次/秒 tomcat 支持的并发能力 220-260个/秒 调优1000个/秒
    
    开发语言 C语言开发 tomcat是java写的
    
    知识点:
    
    1. 并发能力: 多个用户同时访问服务器.
    
    2. 并行 计算机中的一种处理方式.
   
    
     Nginx-代理
    
    
    问题描述
    
    需求: 图片需要进行回显 难题: 网络地址需要与物理地址进行映射
    
    网络地址: http://image.jt.com/2021/11/16/64e19fa13e474ecca28d64e85b0a9312.jpg
    
    物理地址: E:\project3\images\2021\11\16/64e19fa13e474ecca28d64e85b0a9312.jpg
   
    问题1: 能否将物理地址传给用户,用户通过物理地址直接访问!!! 不可以
   
    图片获取的步骤:
    
    1. 用户通过网络地址访问服务器: http://image.jt.com/2021/11/16/64e19fa13e474ecca28d64e85b0a9312.jpg
    
    2. 通过某种机制,将域名动态转化为本地磁盘地址.http://image.jt.com转换为E:\project3\images
    
    3. 根据磁盘地址信息.找到图片 回传给用户,即用户可以查看到图片.
   
    
     反向代理(nginx)
    
    
    反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
   
    特点:
    
    1. 反向代理服务器介于用户和目标服务器之间
    
    2. 用户的资源从反向代理服务器中获取.
    
    3. 用户不清楚真实的服务器到底是谁. 保护了服务器的信息. 称之为服务器端代理.
   
    
     正向代理(扩展)
    
    
    正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
   
    特点:
    
    1. 反向代理服务器介于用户和目标服务器之间
    
    2. 用户的资源从正向代理服务器中获取.
    
    3. 客户端通过正向代理服务器,指向目标服务器.(用户非常清楚的了解目标服务器的存在.) 服务器端不清楚到底是谁访问的服务器.以为只是代理服务器访问.
   
     
   
    
     关于正向和反向说明
    
   
    说明: 每一次请求服务器,都伴随着正向代理和反向代理.
    
    
     正向主要提供网络服务, 反向主要提供数据支持
    
    .
   
     
   
    21,Nginx负载均衡
   
     
   
    负载均衡配置
   
    轮询策略
   
说明: 根据配置文件中的服务器的顺序,依次访问服务器.
    权重策略
   
说明: 根据服务器的性能,灵活的进行访问的配比
    IPHASH策略
   
    说明: 如果需要用户与tomcat服务器进行绑定. 可以选用 iphash策略
    
    策略: 有时会将用户的数据,存储到后端服务器的Session中.并且保证每次用户访问都访问同一个tomcat服务器.
   
iphash实现原理:
     
   
 
版权声明:本文为weixin_49143405原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

