Skip to content

Commit e566fa5

Browse files
committed
Update Java Notes
1 parent f2ec184 commit e566fa5

File tree

3 files changed

+117
-80
lines changed

3 files changed

+117
-80
lines changed

DB.md

Lines changed: 108 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ MySQL配置:
130130

131131
## 单表
132132

133-
### SQL介绍
133+
### SQL
134134

135135
- SQL
136136

@@ -174,7 +174,7 @@ MySQL配置:
174174

175175
### DDL
176176

177-
#### 操作数据库
177+
#### 数据库
178178

179179
* R(Retrieve):查询
180180

@@ -283,7 +283,7 @@ MySQL配置:
283283

284284

285285

286-
#### 操作数据表
286+
#### 数据表
287287

288288
- R(Retrieve):查询
289289

@@ -923,7 +923,7 @@ LIMIT:分页限定
923923

924924

925925

926-
### 主键自增约束
926+
### 主键自增
927927

928928
主键自增约束可以为空,并自动增长。删除某条数据不影响自增的下一个数值,依然按照前一个值自增。
929929

@@ -1088,14 +1088,22 @@ LIMIT:分页限定
10881088

10891089

10901090

1091-
### 外键级联操作
1091+
### 外键级联
10921092

1093-
级联操作:当把主表中的数据进行删除或更新时,从表中有关联的数据也会随之删除(一般不建议使用)
1093+
级联操作:当把主表中的数据进行删除或更新时,从表中有关联的数据的相应操作,包括 RESTRICT、CASCADE、SET NULL 和 NO ACTION
1094+
1095+
* RESTRICT 和 NO ACTION相同, 是指限制在子表有关联记录的情况下, 父表不能更新
1096+
1097+
* CASCADE 表示父表在更新或者删除时,更新或者删除子表对应的记录
1098+
1099+
* SET NULL 则表示父表在更新或者删除的时候,子表的对应字段被SET NULL
1100+
1101+
级联操作:
10941102

10951103
* 添加级联更新
10961104

10971105
```mysql
1098-
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名) ON UPDATE CASCADE;
1106+
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名) ON UPDATE [CASCADE | RESTRICT | SET NULL];
10991107
```
11001108

11011109
* 添加级联删除
@@ -2595,7 +2603,8 @@ LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定
25952603
- 提交:没出现问题,数据进行更新
25962604
- 回滚:出现问题,数据恢复到开启事务时的状态
25972605

2598-
2606+
2607+
事务操作:
25992608

26002609
* 开启事务
26012610

@@ -2745,27 +2754,37 @@ LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定
27452754

27462755
### 体系结构
27472756

2748-
体系结构详解
2757+
体系结构详解:
2758+
2759+
* 第一层:网络连接层
2760+
* 一些客户端和链接服务,包含本地socket 通信和大多数基于客户端/服务端工具实现的 TCP/IP 通信,主要完成一些类似于连接处理、授权认证、及相关的安全方案
2761+
* 在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程
2762+
* 在该层上实现基于SSL的安全链接,服务器也会为安全接入的每个客户端验证它所具有的操作权限
27492763

2750-
- 客户端连接
2751-
- 支持接口:支持的客户端连接,例如C、Java、PHP等语言来连接MySQL数据库
2752-
- 第一层:网络连接层
2753-
- 连接池:管理、缓冲用户的连接,线程处理等需要缓存的需求。
2754-
- 例如:当客户端发送一个请求连接,会从连接池中获取一个连接进行使用。
27552764
- 第二层:核心服务层
2756-
- 管理服务和工具:系统的管理和控制工具,例如备份恢复、复制、集群等。
2757-
- SQL接口:接受SQL命令,并且返回查询结果。
2758-
- 查询解析器:验证和解析SQL命令,例如过滤条件、语法结构等。
2759-
- 查询优化器:在执行查询之前,使用默认的一套优化机制进行优化sql语句
2760-
- 缓存:如果缓存当中有想查询的数据,则直接将缓存中的数据返回。没有的话再重新查询!
2765+
* 完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行
2766+
* 所有跨存储引擎的功能在这一层实现,如过程、函数等
2767+
* 在该层服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询顺序,是否利用索引等, 最后生成相应的执行操作
2768+
* 服务器还会查询内部的缓存,如果缓存空间足够大,可以在大量读操作的环境中提升系统的性能
27612769
- 第三层:存储引擎层
2762-
- 插件式存储引擎:管理和操作数据的一种机制,包括(存储数据、如何更新、查询数据等)
2770+
- 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信
2771+
- 不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎
27632772
- 第四层:系统文件层
2773+
- 数据存储层,主要是将数据存储在文件系统之上,并完成与存储引擎的交互
27642774
- 文件系统:配置文件、数据文件、日志文件、错误文件、二进制文件等等的保存
27652775

2766-
![](https://gitee.com/seazean/images/raw/master/DB/MySQL体系结构.png)
2776+
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-体系结构.png)
27672777

2778+
整个MySQL Server由以下组成
27682779

2780+
- Connection Pool : 连接池组件
2781+
- Management Services & Utilities : 管理服务和工具组件
2782+
- SQL Interface : SQL接口组件
2783+
- Parser : 查询分析器组件
2784+
- Optimizer : 优化器组件
2785+
- Caches & Buffers : 缓冲池组件
2786+
- Pluggable Storage Engines : 存储引擎
2787+
- File System : 文件系统
27692788

27702789

27712790

@@ -2775,17 +2794,19 @@ LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定
27752794

27762795
### 存储引擎
27772796

2797+
对比其他数据库,MySQL的架构可以在不同场景应用并发挥良好作用,主要体现在存储引擎,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取分离,可以针对不同的存储需求可以选择最优的存储引擎
2798+
27782799
存储引擎的介绍:
27792800

2780-
- MySQL数据库使用不同的机制存取表文件 , 机制的差别在于不同的存储方式、索引技巧、锁定水平等不同的功能和能力,在MySQL中 , 将这些不同的技术及配套的功能称为**存储引擎**
2781-
- Oracle , SqlServer等数据库只有一种存储引擎 , 而MySQL针对不同的需求, 配置不同的存储引擎 , 就会让数据库采取了不同的处理数据的方式和扩展功能
2801+
- MySQL数据库使用不同的机制存取表文件 , 机制的差别在于不同的存储方式、索引技巧、锁定水平等不同的功能和能力,在MySQL中将这些不同的技术及配套的功能称为**存储引擎**
2802+
- Oracle , SqlServer等数据库只有一种存储引擎,MySQL提供了插件式的存储引擎架构,所以MySQL存在多种存储引擎 , 就会让数据库采取了不同的处理数据的方式和扩展功能
27822803
- 在关系型数据库中数据的存储是以表的形式存进行,所以存储引擎也称为表类型(存储和操作此表的类型)
27832804
- 通过选择不同的引擎,能够获取最佳的方案, 也能够获得额外的速度或者功能,提高程序的整体效果。
27842805

27852806
MySQL支持的存储引擎:
27862807

2787-
- MySQL5.7支持的引擎包括:InnoDB、MyISAM、MEMORY、Archive、Federate、CSV、BLACKHOLE等
2788-
- 常用引擎:InnoDB、MyISAM、MEMORY
2808+
- MySQL支持的引擎包括:InnoDB、MyISAM、MEMORY、Archive、Federate、CSV、BLACKHOLE等
2809+
- MySQL5.5之前的默认存储引擎是MyISAM,5.5之后就改为了InnoDB
27892810

27902811

27912812

@@ -2795,41 +2816,73 @@ MySQL支持的存储引擎:
27952816

27962817
### 引擎对比
27972818

2798-
- MyISAM存储引擎
2819+
MyISAM存储引擎
2820+
2821+
* 特点:不支持事务和外键,读取速度快,节约资源
2822+
* 应用场景:查询和插入操作为主,只有很少更新和删除操作,并对事务的完整性、并发性要求不高
2823+
* 存储方式:
2824+
* 每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,拓展名不同
2825+
* 表结构保存在.frm文件中,表数据保存在.MYD文件中,索引保存在.MYI文件中
2826+
2827+
InnoDB存储引擎:(MySQL5.5版本后默认的存储引擎)
27992828

2800-
* 特点:不支持事务和外键,读取速度快,节约资源
2801-
* 应用场景:查询和插入操作为主,只有很少更新和删除操作,并对事务的完整性、并发性要求不高
2802-
* 结构:表结构保存在.frm文件中,表数据保存在.MYD文件中,索引保存在.MYI文件中
2829+
- 特点:支持事务和外键操作,支持并发控制。对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引
2830+
- 应用场景:对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作
2831+
- 存储方式:
2832+
- 使用共享表空间存储, 这种方式创建的表的表结构保存在.frm文件中, 数据和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件
2833+
- 使用多表空间存储, 这种方式创建的表的表结构存在 .frm 文件中,但每个表的数据和索引单独保存在 .ibd 中
28032834

2804-
- InnoDB存储引擎:(MySQL5.5版本后默认的存储引擎)
2835+
MEMORY存储引擎:
28052836

2806-
- 特点:支持事务和外键操作,占用磁盘空间大,支持并发控制
2807-
- 应用场景:对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作
2808-
- 结构:表结构保存在.frm文件中,如果是共享表空间,数据和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件。如果是多表空间存储,每个表的数据和索引单独保存在 .ibd 中
2837+
- 特点:每个MEMORY表实际对应一个磁盘文件,格式是.frm ,该文件中只存储表的结构,表数据保存在内存中,且默认使用HASH索引,这样有利于数据的快速处理,在需要快速定位记录可以提供更快的访问,但是服务一旦关闭,表中的数据就会丢失,数据存储不安全
2838+
- 应用场景:通常用于更新不太频繁的小表,用以快速得到访问结果,类似缓存
2839+
- 存储方式:表结构保存在.frm中
28092840

2810-
- MEMORY存储引擎:
2841+
MERGE存储引擎
2842+
2843+
* 特点:
2844+
2845+
* 是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,通过将不同的表分布在多个磁盘上,有效的改善MERGE表的访问效率
2846+
* MERGE表本身并没有存储数据,对MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行的。
2847+
2848+
* 应用场景:将一系列等同的MyISAM表以逻辑方式组合在一起,并作为一个对象引用他们,适合做数据仓库
2849+
2850+
* 操作方式:
2851+
2852+
* 插入操作是通过INSERT_METHOD子句定义插入的表,使用 FIRST 或 LAST 值使得插入操作被相应地作用在第一或者最后一个表上;不定义这个子句或者定义为NO,表示不能对MERGE表执行插入操作
2853+
* 对MERGE表进行DROP操作,但是这个操作只是删除MERGE表的定义,对内部的表是没有任何影响的
2854+
2855+
```mysql
2856+
CREATE TABLE order_1(
2857+
)ENGINE = MyISAM DEFAULT CHARSET=utf8;
2858+
2859+
CREATE TABLE order_2(
2860+
)ENGINE = MyISAM DEFAULT CHARSET=utf8;
2861+
2862+
CREATE TABLE order_all(
2863+
-- 结构与MyISAM表相同
2864+
)ENGINE = MERGE UNION = (order_1,order_2) INSERT_METHOD=LAST DEFAULT CHARSET=utf8;
2865+
```
28112866

2812-
- 特点:所有数据保存在内存中,在需要快速定位记录可以提供更快的访问,但是不安全
2813-
- 应用场景:通常用于更新不太频繁的小表,用以快速得到访问结果
2814-
- 结构:表结构保存在.frm中
2867+
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-MERGE.png)
28152868

2816-
| 特性 | MyISAM | InnoDB | MEMORY |
2817-
| ------------ | ---------------------------- | ------------- | ------------------ |
2818-
| 存储限制 | 有(平台对文件系统大小的限制) | 64TB | 有(平台的内存限制) |
2819-
| **事务安全** | **不支持** | **支持** | **不支持** |
2820-
| **锁机制** | **表锁** | **表锁/行锁** | **表锁** |
2821-
| B+Tree索引 | 支持 | 支持 | 支持 |
2822-
| 哈希索引 | 不支持 | 不支持 | 支持 |
2823-
| 全文索引 | 支持 | 支持 | 不支持 |
2824-
| **集群索引** | **不支持** | **支持** | **不支持** |
2825-
| 数据索引 | 不支持 | 支持 | 支持 |
2826-
| 数据缓存 | 不支持 | 支持 | N/A |
2827-
| 索引缓存 | 支持 | 支持 | N/A |
2828-
| 数据可压缩 | 支持 | 不支持 | 不支持 |
2829-
| 空间使用 ||| N/A |
2830-
| 内存使用 ||| 中等 |
2831-
| 批量插入速度 ||||
2832-
| **外键** | **不支持** | **支持** | **不支持** |
2869+
| 特性 | MyISAM | InnoDB | MEMORY |
2870+
| ------------ | ---------------------------- | ------------- | ------------------ |
2871+
| 存储限制 | 有(平台对文件系统大小的限制) | 64TB | 有(平台的内存限制) |
2872+
| **事务安全** | **不支持** | **支持** | **不支持** |
2873+
| **锁机制** | **表锁** | **表锁/行锁** | **表锁** |
2874+
| B+Tree索引 | 支持 | 支持 | 支持 |
2875+
| 哈希索引 | 不支持 | 不支持 | 支持 |
2876+
| 全文索引 | 支持 | 支持 | 不支持 |
2877+
| 集群索引 | 不支持 | 支持 | 不支持 |
2878+
| 数据索引 | 不支持 | 支持 | 支持 |
2879+
| 数据缓存 | 不支持 | 支持 | N/A |
2880+
| 索引缓存 | 支持 | 支持 | N/A |
2881+
| 数据可压缩 | 支持 | 不支持 | 不支持 |
2882+
| 空间使用 ||| N/A |
2883+
| 内存使用 ||| 中等 |
2884+
| 批量插入速度 ||||
2885+
| **外键** | **不支持** | **支持** | **不支持** |
28332886

28342887

28352888

@@ -2845,6 +2898,7 @@ MySQL支持的存储引擎:
28452898

28462899
```mysql
28472900
SHOW ENGINES;
2901+
SHOW VARIABLES LIKE '%storage_engine%'; -- 查看Mysql数据库默认的存储引擎
28482902
```
28492903

28502904
* 查询某个数据库中所有数据表的存储引擎

Java.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14672,7 +14672,7 @@ Exception table:
1467214672

1467314673
指令总结:
1467414674

14675-
* 前四条指令固化在虚拟机内部,方法的调用执行不可干预,而invokedynamic指令则支持用户确定方法
14675+
* 前四条指令固化在虚拟机内部,方法的调用执行不可干预,根据方法的符号引用链接到具体的目标方法,而invokedynamic指令则支持用户确定方法
1467614676

1467714677
* invokestatic指令和invokespecial指令调用的方法称为非虚方法,属于静态绑定
1467814678
* 普通成员方法是由 invokevirtual 调用,属于**动态绑定**,即支持多态
@@ -14719,7 +14719,7 @@ public class Demo {
1471914719

1472014720
* new 是在堆中创建对象,执行成功会将**对象引用**压入操作数栈
1472114721

14722-
* dup 是复制操作数栈栈顶的内容,本例即为**对象引用**,为什么需要两份引用呢?
14722+
* dup 是复制操作数栈栈顶的内容,本例即为对象引用,为什么需要两份引用呢?
1472314723

1472414724
* 一个要配合 invokespecial 调用该对象的构造方法 <init>:()V (会消耗掉栈顶一个引用)
1472514725

SSM.md

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5601,7 +5601,7 @@ public class UserServiceDecorator implements UserService{
56015601
56025602
#### Proxy
56035603
5604-
JDKProxy动态代理是针对对象做代理,要求原始对象具有接口实现,并对接口方法进行增强,因为代理类继承Proxy
5604+
JDKProxy动态代理是针对对象做代理,要求原始对象具有接口实现,并对接口方法进行增强,因为**代理类继承Proxy**
56055605
56065606
静态代理和动态代理的区别:
56075607
@@ -5811,11 +5811,7 @@ MySQL InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(
58115811
58125812
#### 传播行为
58135813
5814-
事务传播行为描述的是事务协调员对事务管理员所携带事务的处理态度
5815-
5816-
![](https://gitee.com/seazean/images/raw/master/Frame/事务传播行为.png)
5817-
5818-
**事务传播行为是为了解决业务层方法之间互相调用的事务问题**:
5814+
事务传播行为是为了解决业务层方法之间互相调用的事务问题:
58195815
58205816
* 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
58215817
@@ -6444,7 +6440,6 @@ public void addAccount{}
64446440
* `@Transactional` 注解只有作用到 public 方法上事务才生效
64456441
* 不推荐在接口上使用`@Transactional` 注解
64466442
原因:在接口上使用注解,只有**在使用基于接口的代理时才会生效**,因为注解是不能继承的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别
6447-
* 避免同一个类中调用 `@Transactional` 注解的方法,这样会导致事务失效
64486443
* 正确的设置 `@Transactional` 的 rollbackFor 和 propagation 属性,否则事务可能会回滚失败
64496444
64506445
面试题:**事务不生效的问题**
@@ -6476,10 +6471,10 @@ public void addAccount{}
64766471
64776472
原因:Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。想针对非检测异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常
64786473
6479-
* 情况6:Spring的事务传播策略在**内部方法**调用时将不起作用,事务注解加到要调用方法上
6474+
* 情况6:Spring的事务传播策略在**内部方法**调用时将不起作用,在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务。事务注解要加到调用方法上才生效
6475+
6476+
原因:Spring的事务都是使用AOP代理的模式,动态代理最终是要调用原始对象,而原始对象在去调用方法时是不会再触发代理,就是方法调用**本对象**的另一个方法,没有通过代理类直接调用,而且事务也就无法生效
64806477
6481-
原因:Spring的事务都是使用AOP代理的模式,仅有外部方法调用过程才会被代理截获,事务才会有效,就是方法调用本对象的另一个方法,没有通过代理类,事务也就无法生效
6482-
64836478
```java
64846479
@Transactional
64856480
public int add(){
@@ -6488,7 +6483,7 @@ public void addAccount{}
64886483
//注解添加在update方法上无效,需要添加到add()方法上
64896484
public int update(){}
64906485
```
6491-
6486+
64926487
64936488
64946489
@@ -6560,19 +6555,7 @@ public void addAccount{}
65606555
65616556
### 模板对象
65626557
6563-
* Spring模板对象:
6564-
* TransactionTemplate
6565-
* JdbcTemplate
6566-
6567-
* RedisTemplate
6568-
6569-
* RabbitTemplate
6570-
6571-
* JmsTemplate
6572-
6573-
* HibernateTemplate
6574-
6575-
* RestTemplate
6558+
Spring模板对象:TransactionTemplate、JdbcTemplate、RedisTemplate、RabbitTemplate、JmsTemplate、HibernateTemplate、RestTemplate
65766559
65776560
* JdbcTemplate:提供标准的sql语句操作API
65786561
* NamedParameterJdbcTemplate:提供标准的具名sql语句操作API

0 commit comments

Comments
 (0)