JavaEE 核心知识点复习笔记
承接上篇 JavaSE,这篇把 JavaEE 从前端基础、数据库、JDBC、反射注解到 SSM 全家桶、SpringBoot、微服务整条线串一遍,面试复习速查专用。
一、前端基础(JavaWeb 必备)
1. 前端三件套 + jQuery
| 技术 | 作用 |
|---|---|
| HTML | 构建网页结构和内容 |
| CSS | 控制网页样式和布局 |
| JavaScript | 实现网页动态交互效果 |
| jQuery | 封装了 JS 常用功能,简化 DOM 操作 |
2. Ajax 异步请求
作用 :不刷新整个网页的情况下,与服务器交换数据并局部更新页面内容。
原生 Ajax 五步走:
// 1. 创建核心对象
var xhr = new XMLHttpRequest();
// 2. 设置请求行(请求方式、url、是否异步)
xhr.open("GET/POST", "url", true);
// 3. 设置请求头(POST 才需要)
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// 4. 注册状态变化回调
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理响应数据
console.log(xhr.responseText);
}
};
// 5. 发送请求
xhr.send(params);
💡
readyState == 4表示请求完成,status == 200表示响应成功,两个条件都满足才处理。
二、服务器技术
1. C/S 与 B/S 架构
| 架构 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| C/S | 需要安装专用客户端 | 体验好、性能高、功能丰富 | 更新维护成本高、跨平台差 |
| B/S | 浏览器直接访问,免安装 | 升级方便、跨平台、部署简单 | 体验受限、依赖网络 |
2. 静态网页 vs 动态网页
- 静态网页 :内容固定,所有人看到的都一样,
.html/.htm后缀,浏览器直接解析 - 动态网页:内容根据条件动态变化(如登录后显示用户名),需要服务器端程序处理(Servlet/JSP 等)
3. Web 项目目录结构
项目根目录(WebContent / src/main/webapp)
├── HTML/CSS/JS/JSP 等可直接访问的资源
└── WEB-INF(受保护目录,浏览器不能直接访问)
├── web.xml # Web 应用配置文件
├── classes/ # 编译后的 .class 字节码
└── lib/ # 项目依赖的 jar 包
⚠️ 重点 :
WEB-INF下的资源外界访问不到,必须通过服务器内部转发才能访问,这也是安全设计。
4. Tomcat 发布项目的四种方式
- 直接把项目文件夹放到
webapps目录下 → 自动部署 - 打
war包放到webapps→ Tomcat 自动解压部署 - 在
server.xml中配置<Context>指定项目路径 - 在
conf/Catalina/localhost下添加 xml 配置文件
访问路径格式 :http://主机:端口/项目名/资源路径
5. HTTP 协议
- 无状态协议:服务器不记录客户端状态,每次请求都是独立的
- 解决无状态的方案:Session、Cookie、Token 等会话跟踪技术
三、数据库技术
1. SQL 四大分类
| 分类 | 全称 | 作用 | 关键字 |
|---|---|---|---|
| DDL | 数据定义语言 | 定义库、表、列结构 | CREATE、DROP、ALTER、TRUNCATE |
| DML | 数据操作语言 | 操作表中记录 | INSERT、UPDATE、DELETE |
| DQL | 数据查询语言 | 查询数据 | SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT |
| DCL | 数据控制语言 | 管理权限、事务 | GRANT、REVOKE、COMMIT、ROLLBACK |
2. 常用数据类型
| 分类 | 类型 | 说明 |
|---|---|---|
| 字符串 | CHAR |
定长字符串,查询快但可能浪费空间 |
VARCHAR |
变长字符串,节省空间,最常用 | |
TEXT |
大文本,存长文章内容 | |
| 数值 | INT/BIGINT |
整数类型 |
DECIMAL |
定点数,精确计算,存金额必须用它 | |
| 日期 | DATE |
日期 YYYY-MM-DD |
DATETIME |
日期时间,范围大 | |
TIMESTAMP |
时间戳,自动更新,范围 1970-2038 | |
| 其他 | BLOB |
二进制大对象(实际开发一般存路径不存文件) |
3. 单表约束
作用:限制表中数据,保证数据的正确性、有效性、完整性。
| 约束 | 作用 | 特点 |
|---|---|---|
| 主键约束 PRIMARY KEY | 唯一标识每行记录 | 值唯一且不为空,一张表只能一个主键,常配合 AUTO_INCREMENT 自增 |
| 唯一约束 UNIQUE | 该列值不能重复 | 可以为 null |
| 非空约束 NOT NULL | 该列值不能为空 | --- |
| 默认约束 DEFAULT | 设置默认值 | 不赋值时用默认值 |
| 外键约束 FOREIGN KEY | 建立两表关联 | 保证数据一致性 |
4. 多表外键约束
外键:从表中引用主表主键的列,用来建立两表关联,保证数据一致性。
-- 语法
CONSTRAINT 外键名 FOREIGN KEY (从表外键列) REFERENCES 主表(主键列)
级联操作:
ON UPDATE CASCADE:主表主键更新时,从表外键同步更新ON DELETE CASCADE:主表记录删除时,从表关联记录同步删除
⚠️ 级联删除慎用! 一不小心可能删光整张关联表的数据,生产环境一般用逻辑删除代替。
5. 聚合函数
| 函数 | 作用 |
|---|---|
COUNT(*) |
统计行数 |
COUNT(列名) |
统计该列非空的数量 |
SUM() |
求和 |
AVG() |
求平均值 |
MAX() / MIN() |
最大/最小值 |
聚合函数常配合
GROUP BY分组使用,分组后筛选用HAVING。
6. 多表查询
内连接
只显示两表中满足连接条件的交集数据。
-- 隐式内连接
SELECT * FROM A, B WHERE A.id = B.aid;
-- 显式内连接(推荐,语义清晰)
SELECT * FROM A INNER JOIN B ON A.id = B.aid;
外连接
| 类型 | 效果 | 语法 |
|---|---|---|
| 左外连接 LEFT JOIN | 显示左表全部 + 右表匹配的,不匹配补 null | SELECT * FROM A LEFT JOIN B ON 条件 |
| 右外连接 RIGHT JOIN | 显示右表全部 + 左表匹配的 | SELECT * FROM A RIGHT JOIN B ON 条件 |
子查询
查询里嵌套另一个查询,内层结果作为外层的条件或数据源。
- 单行单列 :结果是一个值 → 用
= > <比较 - 多行单列 :结果是集合 → 用
IN、ANY、ALL - 多行多列 :结果是虚拟表 → 放在
FROM后面继续查
四、JavaEE 核心技术
1. JDBC
Java DataBase Connectivity,Java 操作数据库的标准接口。
标准六步走
// 1. 导入驱动 jar 包(mysql-connector-java)
// 2. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 3. 获取连接对象
Connection conn = DriverManager.getConnection(url, username, password);
// 4. 获取执行 SQL 的对象
Statement stmt = conn.createStatement();
// 5. 执行 SQL
ResultSet rs = stmt.executeQuery(sql); // 查询,返回结果集
int count = stmt.executeUpdate(sql); // 增删改,返回影响行数
// 6. 释放资源(倒着关)
rs.close();
stmt.close();
conn.close();
SQL 注入问题
原理:用户输入的内容拼接到 SQL 里,恶意输入特殊字符串改变 SQL 语义,绕过验证。
经典注入:密码输入 ' or '1'='1
拼接后:WHERE password='' or '1'='1' → 条件恒成立,直接登录
解决方案 :用 PreparedStatement(预编译对象)代替 Statement,参数用 ? 占位,SQL 语义不会被篡改。
2. XML
可扩展标记语言,标签都是自定义的。
| 对比 | XML | HTML |
|---|---|---|
| 标签 | 自定义 | 预定义 |
| 语法 | 严格 | 松散 |
| 用途 | 存数据、做配置 | 展示数据 |
主要用途:配置文件(老框架常用)、数据传输(现在 JSON 更主流)。
XML 约束:规定 XML 里能写什么标签、什么结构
- DTD 约束 :简单,
.dtd文件 - Schema 约束 :功能强大,支持数据类型校验,
.xsd文件
五、反射与注解
1. 反射机制
定义 :程序在运行期间 动态获取任意类的信息(成员变量、方法、构造器),并且可以操作对象的属性和方法。框架的底层核心就是反射。
| 正常流程 | 反射流程 |
|---|---|
| 知道类名 → new 对象 → 调用方法(编译期确定) | 拿到 Class 对象 → 获取方法/属性 → 调用(运行期动态确定) |
核心思想 :把类的各个组成部分(字段、方法、构造器)封装成对象(Field、Method、Constructor),这就是反射。
💡
.class字节码文件加载到内存后,JVM 会创建一个Class对象,通过它可以反推类的所有信息。
2. 代理模式
给目标对象提供一个代理对象,由代理控制对目标的访问,在不修改源码的前提下增强功能。AOP 的底层就是动态代理。
3. 注解(Annotation)
Java 5 引入的代码级元数据,可以标在类、方法、字段上,用来做配置说明。现在框架基本都用注解替代 XML 配置了。
自定义注解
public @interface 注解名 {
// 属性列表
String value() default "";
}
元注解(修饰注解的注解)
| 元注解 | 作用 |
|---|---|
@Target |
注解能作用的位置(TYPE 类、METHOD 方法、FIELD 字段等) |
@Retention |
保留阶段(SOURCE 源码 / CLASS 字节码 / RUNTIME 运行时)反射读取必须 RUNTIME |
@Documented |
是否生成到文档 |
@Inherited |
是否被子类继承 |
💡 小技巧:只有一个
value属性时,赋值可以省略value=,直接写值。
六、主流框架
1. MyBatis
半 ORM 持久层框架,支持定制化 SQL、存储过程和高级映射,帮你省去几乎所有 JDBC 样板代码和手动参数封装。
延迟加载(懒加载)
用到关联数据时才去查,不用不查,提升性能。
- 配置:
lazyLoadingEnabled=true、aggressiveLazyLoading=false - 只能在嵌套查询(
select属性)方式下使用
缓存策略
| 缓存级别 | 范围 | 特点 |
|---|---|---|
| 一级缓存 | SqlSession 级别 | 同一个 SqlSession 内相同查询缓存,默认开启 |
| 二级缓存 | SqlSessionFactory 级别 | 跨 SqlSession 共享,需要手动开启(<cache> 标签) |
⚠️ 执行增删改、
commit、close、clearCache都会清空缓存。而且缓存存的是对象引用,修改对象会影响缓存数据。
2. Spring 框架
核心概述
- 两大核心:IOC(控制反转)、AOP(面向切面编程)
- 一站式框架:表现层 SpringMVC、持久层 JdbcTemplate、业务层事务管理,各层都有解决方案
- 优点:低耦合、可扩展、声明式事务、方便集成各种框架
IOC(控制反转)
底层原理:XML 配置 + 工厂模式 + 反射
BeanFactory vs ApplicationContext:
BeanFactory:顶层接口,懒加载,getBean时才创建对象ApplicationContext:子接口,功能更多,启动时就创建所有单例 Bean(开发常用)
Bean 作用域:
singleton单例(默认)prototype多例request/session/application(Web 环境)
IOC 常用注解
| 分类 | 注解 | 作用 |
|---|---|---|
| 创建对象 | @Component / @Controller / @Service / @Repository |
四个功能一样,只是语义分层(表现层/业务层/持久层) |
| 注入数据 | @Autowired |
按类型自动注入(Spring 自带) |
@Qualifier |
配合 @Autowired,按名称注入 | |
@Resource |
先按名称再按类型(JavaEE 注解) | |
@Value |
注入基本类型/String,支持 ${} 读配置 |
|
| 作用域 | @Scope |
singleton / prototype |
| 生命周期 | @PostConstruct 初始化 / @PreDestroy 销毁 |
纯注解开发 :@Configuration 配置类、@ComponentScan 包扫描、@Bean、@PropertySource、@Import
AOP(面向切面编程)
定义 :通过预编译和运行期动态代理,在不修改源码的情况下给程序添加额外功能。典型应用:日志、事务、权限校验。
3. SpringMVC
MVC 模式:Model(模型数据)+ View(视图)+ Controller(控制器) 分离。
前端控制器模式 :DispatcherServlet 统一接收所有请求,再分发到具体的处理器。
请求参数绑定
| 注解 | 作用 |
|---|---|
@RequestParam |
指定参数名、是否必填、默认值 |
@PathVariable |
RESTful 风格路径变量绑定 |
@RequestBody |
接收 JSON 请求体,自动转对象 |
@RequestHeader |
获取请求头 |
@CookieValue |
获取 Cookie 值 |
常用注解速查
| 注解 | 作用 |
|---|---|
@Controller |
标记控制器类 |
@RequestMapping |
请求路径映射,类+方法组合使用 |
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping |
REST 风格快捷注解 |
@ResponseBody |
返回值直接作为响应体,不走视图,返回 JSON 常用 |
@RestController |
@Controller + @ResponseBody 组合,整个类都返回 JSON |
@ControllerAdvice |
全局异常处理、全局数据绑定 |
@ExceptionHandler |
异常处理方法 |
RESTful 风格
- URL 定位资源,HTTP 动词描述操作
GET查询、POST新增、PUT修改、DELETE删除- 路径传参:
/user/100,用@PathVariable获取 - 前后端分离:后端只返回 JSON,前端负责渲染
文件上传
- 表单
enctype="multipart/form-data",method="post" - 配置
CommonsMultipartResolver(id 必须是multipartResolver) - Controller 用
MultipartFile接收,transferTo()保存到磁盘
4. SpringBoot
核心特点:
- 起步依赖(starter)→ 不用自己凑 jar 包
- 自动配置 → 很多配置默认就给你配好了
- 内嵌容器 → 直接打 jar 包运行,不用装 Tomcat
- 无需 XML → 零配置开发
- Actuator → 应用监控
一句话总结:SpringBoot 不是新框架,是快速开发 Spring 的脚手架,约定大于配置。
5. MyBatis-Plus(MP)
MyBatis 的增强工具,单表 CRUD 零 SQL,开发效率拉满。
核心特性:
- 内置通用
BaseMapper和通用 Service,单表不用写 SQL - 条件构造器
QueryWrapper、UpdateWrapper,链式拼接条件 - 分页插件、主键策略、逻辑删除、自动填充、乐观锁、代码生成器
- 支持 Lambda 写法,字段名用方法引用,防止写错
常用注解 :@TableName、@TableId、@TableField、@TableLogic
6. Redis
高性能键值对内存数据库,也叫数据结构服务器。
特点:
- 内存存储,读写速度极快(缓存首选)
- 支持丰富数据类型:String、Hash、List、Set、SortedSet(ZSet)
- 持久化:RDB 快照 + AOF 日志,防止宕机丢数据
- 单线程 + 多路 IO 复用模型
典型应用场景:缓存热点数据、会话存储、分布式锁、排行榜、计数器、消息队列、限流
7. Spring Cloud 微服务
一句话:把单体应用拆成多个独立微服务,Spring Cloud 提供整套分布式解决方案。
Spring Cloud Alibaba 核心组件
| 组件 | 作用 | 替代/补充 |
|---|---|---|
| Nacos | 注册中心 + 配置中心二合一 | 替代 Eureka + Config |
| Sentinel | 流量控制、熔断降级 | 替代 Hystrix |
| Dubbo | 高性能 RPC 远程调用 | 比 Feign 性能更强 |
| Seata | 分布式事务解决方案 | 解决跨服务数据一致性 |
| Gateway | 微服务网关 | 路由转发、鉴权、限流 |
微服务核心能力速览
- 服务注册发现(Nacos):所有服务启动时注册进去,调用方动态查地址
- 服务调用 & 负载均衡(OpenFeign + LoadBalancer):微服务之间像调本地方法一样互相调用,自动负载均衡
- 配置中心(Nacos Config):配置集中管理,动态刷新不用重启
- 熔断降级(Sentinel):防止某个服务故障引发连锁雪崩,超时快速返回兜底结果
- 网关(Gateway):统一入口,路由转发、鉴权、限流、跨域
- 链路追踪(Sleuth + SkyWalking):追踪整条请求链路,定位慢请求和异常
总结:JavaEE 这条线,从 Web 基础 → 数据库 → JDBC → 反射注解 → SSM → SpringBoot → 微服务,是层层递进的。面试重点抓 MyBatis 缓存、Spring IOC/AOP、SpringMVC 流程、Redis 数据结构和应用场景、微服务各组件作用这几块,基本能覆盖大部分问题。