@@ -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 赵六 26 女 90
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
65706570JDBC(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:可以执行insert 、update 、delete 语句
6647+ - 执行 DML 语句 :` int executeUpdate(String sql)`
6648+ - 返回值 int :返回影响的行数
6649+ - 参数 sql:可以执行 insert 、update 、delete 语句
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数据库
66886690USE db14;
66896691
6690-
66916692-- 创建student表
66926693CREATE 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
67076708public 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
83318323Redis 字符串对象底层的数据结构实现主要是 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