Skip to content

Commit d8d81eb

Browse files
committed
Update Java Notes
1 parent 0e14440 commit d8d81eb

File tree

5 files changed

+1763
-1174
lines changed

5 files changed

+1763
-1174
lines changed

DB.md

Lines changed: 68 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -3168,7 +3168,7 @@ LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定
31683168
CLOSE 游标名称;
31693169
```
31703170

3171-
* Mysql通过一个Error handler声明来判断指针是否到尾部,并且必须和创建游标的SQL语句声明在一起
3171+
* Mysql 通过一个 Error handler 声明来判断指针是否到尾部,并且必须和创建游标的 SQL 语句声明在一起
31723172

31733173
```mysql
31743174
DECLARE EXIT HANDLER FOR NOT FOUND (do some action,一般是设置标志变量)
@@ -3178,7 +3178,7 @@ LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定
31783178

31793179
游标的基本使用
31803180

3181-
* 数据准备:表student
3181+
* 数据准备:表 student
31823182

31833183
```mysql
31843184
id NAME age gender score
@@ -3188,7 +3188,7 @@ LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定
31883188
4 赵六 2690
31893189
```
31903190

3191-
* 创建stu_score表
3191+
* 创建 stu_score 表
31923192

31933193
```mysql
31943194
CREATE TABLE stu_score(
@@ -6569,9 +6569,9 @@ long_query_time=10
65696569

65706570
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,是由一组用Java语言编写的类和接口组成的。
65716571

6572-
JDBC其实就是java官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接
6572+
JDBC 是 java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接
65736573

6574-
使用JDBC需要导包
6574+
使用 JDBC 需要导包
65756575

65766576

65776577

@@ -6590,7 +6590,7 @@ DriverManager:驱动管理对象
65906590

65916591
* 代码实现语法:`Class.forName("com.mysql.jdbc.Driver)`
65926592

6593-
* com.mysql.jdbc.Driver中存在静态代码块
6593+
* com.mysql.jdbc.Driver 中存在静态代码块
65946594

65956595
```java
65966596
static {
@@ -6602,15 +6602,17 @@ DriverManager:驱动管理对象
66026602
}
66036603
```
66046604

6605-
* 不需要通过DriverManager调用静态方法registerDriver,因为Driver类被使用,则自动执行静态代码块完成注册驱动
6605+
* 不需要通过 DriverManager 调用静态方法 registerDriver,因为 Driver 类被使用,则自动执行静态代码块完成注册驱动
66066606

6607-
* jar包中META-INF目录下存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
6607+
* jar 包中 META-INF 目录下存在一个 java.sql.Driver 配置文件,文件中指定了 com.mysql.jdbc.Driver
66086608

66096609
* 获取数据库连接并返回连接对象
6610-
* `public static Connection getConnection(String url, String user, String password)`
6611-
* url:指定连接的路径。语法:`jdbc:mysql://ip地址(域名):端口号/数据库名称`
6612-
* user:用户名
6613-
* password:密码
6610+
6611+
`public static Connection getConnection(String url, String user, String password)`
6612+
6613+
* url:指定连接的路径。语法:`jdbc:mysql://ip地址(域名):端口号/数据库名称`
6614+
* user:用户名
6615+
* password:密码
66146616

66156617

66166618

@@ -6640,16 +6642,16 @@ Connection:数据库连接对象
66406642

66416643
### Statement
66426644

6643-
Statement:执行sql语句的对象
6645+
Statement:执行 sql 语句的对象
66446646

6645-
- 执行DML语句`int executeUpdate(String sql)`
6646-
- 返回值int:返回影响的行数
6647-
- 参数sql:可以执行insertupdatedelete语句
6647+
- 执行 DML 语句`int executeUpdate(String sql)`
6648+
- 返回值 int:返回影响的行数
6649+
- 参数 sql:可以执行 insertupdatedelete 语句
66486650
- 执行DQL语句:`ResultSet executeQuery(String sql)`
6649-
- 返回值ResultSet:封装查询的结果
6650-
- 参数sql:可以执行select语句
6651+
- 返回值 ResultSet:封装查询的结果
6652+
- 参数 sql:可以执行 select 语句
66516653
- 释放资源
6652-
- 释放此Statement对象的数据库和JDBC资源`void close()`
6654+
- 释放此 Statement 对象的数据库和 JDBC 资源`void close()`
66536655

66546656

66556657

@@ -6659,16 +6661,16 @@ Statement:执行sql语句的对象
66596661

66606662
### ResultSet
66616663

6662-
ResultSet:结果集对象,ResultSet对象维护了一个游标,指向当前的数据行,初始在第一行
6664+
ResultSet:结果集对象,ResultSet 对象维护了一个游标,指向当前的数据行,初始在第一行
66636665

66646666
- 判断结果集中是否有数据:`boolean next()`
6665-
- 有数据返回true,并将索引**向下移动一行**
6666-
- 没有数据返回false
6667+
- 有数据返回 true,并将索引**向下移动一行**
6668+
- 没有数据返回 false
66676669
- 获取结果集中**当前行**的数据:`XXX getXxx("列名")`
6668-
- XXX代表数据类型(要获取某列数据,这一列的数据类型)
6669-
- 例如:String getString("name"); int getInt("age");
6670+
- XXX 代表数据类型(要获取某列数据,这一列的数据类型)
6671+
- 例如:String getString("name"); int getInt("age");
66706672
- 释放资源
6671-
- 释放ResultSet对象的数据库和JDBC资源`void close()`
6673+
- 释放 ResultSet 对象的数据库和 JDBC 资源`void close()`
66726674

66736675

66746676

@@ -6687,7 +6689,6 @@ CREATE DATABASE db14;
66876689
-- 使用db14数据库
66886690
USE db14;
66896691
6690-
66916692
-- 创建student表
66926693
CREATE TABLE student(
66936694
sid INT PRIMARY KEY AUTO_INCREMENT, -- 学生id
@@ -6701,7 +6702,7 @@ INSERT INTO student VALUES (NULL,'张三',23,'1999-09-23'),(NULL,'李四',24,'19
67016702
(NULL,'王五',25,'1996-06-06'),(NULL,'赵六',26,'1994-10-20');
67026703
```
67036704

6704-
JDBC连接代码
6705+
JDBC 连接代码
67056706

67066707
```java
67076708
public class JDBCDemo01 {
@@ -6744,7 +6745,7 @@ public class JDBCDemo01 {
67446745

67456746
## 工具类
67466747

6747-
* 配置文件(在src下创建config.properties)
6748+
* 配置文件(在 src 下创建 config.properties
67486749

67496750
```properties
67506751
driverClass=com.mysql.jdbc.Driver
@@ -6974,7 +6975,7 @@ SQL注入攻击演示
69746975

69756976
![](https://gitee.com/seazean/images/raw/master/DB/SQL注入攻击演示.png)
69766977

6977-
* 原理:我们在密码处输入的所有内容,都应该认为是密码的组成,但是Statement对象在执行sql语句时,将一部分内容当做查询条件来执行
6978+
* 原理:我们在密码处输入的所有内容,都应该认为是密码的组成,但是 Statement 对象在执行 sql 语句时,将一部分内容当做查询条件来执行
69786979

69796980
```mysql
69806981
SELECT * FROM user WHERE loginname='aaa' AND password='aaa' OR '1'='1';
@@ -6989,16 +6990,16 @@ SQL注入攻击演示
69896990

69906991
### 攻击解决
69916992

6992-
PreparedStatement:预编译sql语句的执行者对象,继承`PreparedStatement extends Statement`
6993+
PreparedStatement:预编译 sql 语句的执行者对象,继承`PreparedStatement extends Statement`
69936994

6994-
* 在执行sql语句之前,将sql语句进行提前编译。明确sql语句的格式,剩余的内容都会认为是参数
6995-
* sql语句中的参数使用?作为占位符
6995+
* 在执行 sql 语句之前,将 sql 语句进行提前编译。明确 sql 语句的格式,剩余的内容都会认为是参数
6996+
* sql 语句中的参数使用 ? 作为占位符
69966997

6997-
?占位符赋值的方法:setXxx(参数1,参数2);
6998+
? 占位符赋值的方法:setXxx参数1,参数2
69986999

6999-
- 参数1:?的位置编号(编号从1开始)
7000+
- 参数1:? 的位置编号(编号从1开始)
70007001

7001-
- 参数2:?的实际参数
7002+
- 参数2:? 的实际参数
70027003

70037004
```java
70047005
String sql = "SELECT * FROM user WHERE loginname=? AND password=?";
@@ -7007,10 +7008,10 @@ PreparedStatement:预编译sql语句的执行者对象,继承`PreparedStatem
70077008
pst.setString(2,password);
70087009
```
70097010

7010-
执行sql语句的方法
7011+
执行 sql 语句的方法
70117012

7012-
- 执行insert、update、delete语句`int executeUpdate()`
7013-
- 执行select语句`ResultSet executeQuery()`
7013+
- 执行 insert、update、delete 语句`int executeUpdate()`
7014+
- 执行 select 语句`ResultSet executeQuery()`
70147015

70157016

70167017

@@ -7042,10 +7043,10 @@ PreparedStatement:预编译sql语句的执行者对象,继承`PreparedStatem
70427043

70437044
### 自定义池
70447045

7045-
DataSource接口概述
7046+
DataSource 接口概述
70467047

7047-
* java.sql.DataSource接口:数据源(数据库连接池)。
7048-
* Java中DataSource是一个标准的数据源接口,官方提供的数据库连接池规范,连接池类实现该接口
7048+
* java.sql.DataSource 接口:数据源数据库连接池
7049+
* Java 中 DataSource 是一个标准的数据源接口,官方提供的数据库连接池规范,连接池类实现该接口
70497050
* 获取数据库连接对象:`Connection getConnection()`
70507051

70517052
自定义连接池:
@@ -7128,11 +7129,11 @@ public class MyDataSourceTest {
71287129

71297130
#### 继承方式
71307131

7131-
继承(无法解决)
7132+
继承无法解决
71327133

7133-
- 通过打印连接对象,发现DriverManager获取的连接实现类是JDBC4Connection
7134-
- 自定义一个类,继承JDBC4Connection这个类,重写close()方法
7135-
- 通过查看JDBC工具类获取连接的方法我们发现:我们虽然自定义了一个子类,完成了归还连接的操作。但是DriverManager获取的还是JDBC4Connection这个对象,并不是我们的子类对象。
7134+
- 通过打印连接对象,发现 DriverManager 获取的连接实现类是 JDBC4Connection
7135+
- 自定义一个类,继承 JDBC4Connection 这个类,重写 close() 方法
7136+
- 通过查看 JDBC 工具类获取连接的方法我们发现:我们虽然自定义了一个子类,完成了归还连接的操作。但是DriverManager 获取的还是 JDBC4Connection 这个对象,并不是我们的子类对象。
71367137

71377138
代码实现
71387139

@@ -7185,11 +7186,11 @@ public class MyDataSourceTest {
71857186

71867187

71877188

7188-
#### 装饰设计模式
7189+
#### 装饰者
71897190

7190-
自定义类实现Connection接口,通过装饰设计模式,实现和mysql驱动包中的Connection实现类相同的功能
7191+
自定义类实现 Connection 接口,通过装饰设计模式,实现和 mysql 驱动包中的 Connection 实现类相同的功能
71917192

7192-
在实现类对每个获取的Connection进行装饰:把连接和连接池参数传递进行包装
7193+
在实现类对每个获取的 Connection 进行装饰:把连接和连接池参数传递进行包装
71937194

71947195
特点:通过装饰设计模式连接类我们发现,有很多需要重写的方法,代码太繁琐
71957196

@@ -7246,9 +7247,9 @@ public class MyDataSourceTest {
72467247

72477248

72487249

7249-
#### 适配器设计
7250+
#### 适配器
72507251

7251-
使用适配器设计模式改进,提供一个适配器类,实现Connection接口,将所有功能进行实现(除了close方法),自定义连接类只需要继承这个适配器类,重写需要改进的close()方法即可。
7252+
使用适配器设计模式改进,提供一个适配器类,实现 Connection 接口,将所有功能进行实现(除了 close 方法),自定义连接类只需要继承这个适配器类,重写需要改进的 close() 方法即可。
72527253

72537254
特点:自定义连接类中很简洁。剩余所有的方法抽取到了适配器类中,但是适配器这个类还是我们自己编写。
72547255

@@ -7383,17 +7384,13 @@ public class MyDataSource implements DataSource {
73837384

73847385

73857386

7386-
### 开源连接池
7387+
### 开源项目
73877388

73887389
#### C3P0
73897390

7390-
使用C3P0连接池
7391-
1.导入jar包
7392-
2.导入配置文件到src目录下
7393-
3.创建c3p0连接池对象
7394-
4.获取数据库连接进行使用
7391+
使用 C3P0 连接池:
73957392

7396-
* 配置文件名称:c3p0-config.xml。必须放在src目录下
7393+
* 配置文件名称:c3p0-config.xml,必须放在 src 目录下
73977394

73987395
```xml
73997396
<c3p0-config>
@@ -7454,12 +7451,7 @@ public class MyDataSource implements DataSource {
74547451

74557452
#### Druid
74567453

7457-
Druid连接池
7458-
1.导入jar包
7459-
2.编写配置文件,放在src目录下
7460-
3.通过Properties集合加载配置文件
7461-
4.通过Druid连接池工厂类获取数据库连接池对象
7462-
5.获取数据库连接,进行使用
7454+
Druid 连接池:
74637455

74647456
* 配置文件:druid.properties,必须放在src目录下
74657457

@@ -7510,7 +7502,7 @@ Druid连接池
75107502

75117503

75127504

7513-
### 连接池工具类
7505+
### 工具类
75147506

75157507
数据库连接池的工具类:
75167508

@@ -8330,6 +8322,18 @@ Redis 所有操作都是**原子性**的,采用**单线程**机制,命令是
83308322
83318323
Redis 字符串对象底层的数据结构实现主要是 int 和简单动态字符串 SDS,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
83328324
8325+
```c
8326+
struct sdshdr{
8327+
//记录buf数组中已使用字节的数量
8328+
//等于 SDS 保存字符串的长度
8329+
int len;
8330+
//记录 buf 数组中未使用字节的数量
8331+
int free;
8332+
//字节数组,用于保存字符串
8333+
char buf[];
8334+
}
8335+
```
8336+
83338337
![](https://gitee.com/seazean/images/raw/master/DB/Redis-string数据结构.png)
83348338
83358339
内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len,当字符串长度小于 1M 时,扩容都是双倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M

0 commit comments

Comments
 (0)