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 版权协议,转载请附上原文出处链接和本声明。