优化格式

This commit is contained in:
罗祥
2019-12-18 17:06:10 +08:00
parent 4255e77bcc
commit 1511e663a9
11 changed files with 517 additions and 517 deletions

View File

@@ -327,13 +327,13 @@ POST _bulk
```json ```json
{ {
"script": { "script": {
"source": "ctx._source.user+=params.user", "source": "ctx._source.user+=params.user",
"lang": "painless", "lang": "painless",
"params": { "params": {
"user": " Cat" "user": " Cat"
} }
} }
} }
``` ```

View File

@@ -204,8 +204,8 @@ lang = lang + "Script";
```javascript ```javascript
var a = null; var a = null;
a.toString() // Uncaught TypeError: Cannot read property 'toString' of null a.toString() // Uncaught TypeError: Cannot read property 'toString' of null
String(a) // "null" String(a) // "null"
``` ```
**3. 常用的字符串操作** **3. 常用的字符串操作**
@@ -227,24 +227,24 @@ slicesubstringsubstr 等方法在传入正数参数时,其行为比较
var stringValue = "hello world"; var stringValue = "hello world";
// 只接收一个参数时 // 只接收一个参数时
alert(stringValue.slice(3)); // "lo world" alert(stringValue.slice(3)); // "lo world"
alert(stringValue.substring(3)); // "lo world" alert(stringValue.substring(3)); // "lo world"
alert(stringValue.substr(3)); // "lo world" alert(stringValue.substr(3)); // "lo world"
// 接收两个参数时候 // 接收两个参数时候
alert(stringValue.slice(3, 7)); // "lo w" alert(stringValue.slice(3, 7)); // "lo w"
alert(stringValue.substring(3,7)); // "lo w" alert(stringValue.substring(3,7)); // "lo w"
alert(stringValue.substr(3, 7)); // "lo worl" alert(stringValue.substr(3, 7)); // "lo worl"
// 当第一个参数为负值时 // 当第一个参数为负值时
alert(stringValue.slice(-3)); // "rld" 按照规则等价于: slice(8) alert(stringValue.slice(-3)); // "rld" 按照规则等价于: slice(8)
alert(stringValue.substring(-3)); // "hello world" 按照规则等价于: substring(0) alert(stringValue.substring(-3)); // "hello world" 按照规则等价于: substring(0)
alert(stringValue.substr(-3)); // "rld" 按照规则等价于: substr(8) alert(stringValue.substr(-3)); // "rld" 按照规则等价于: substr(8)
// 当第二个参数为负值时 // 当第二个参数为负值时
alert(stringValue.slice(3, -4)); // "lo w" 按照规则等价于: slice(3,7) alert(stringValue.slice(3, -4)); // "lo w" 按照规则等价于: slice(3,7)
alert(stringValue.substring(3, -4)); // "hel" 按照规则等价于: substring(3,0) alert(stringValue.substring(3, -4)); // "hel" 按照规则等价于: substring(3,0)
alert(stringValue.substr(3, -4)); // ""(空字符串) 按照规则等价于: substr(3,0) alert(stringValue.substr(3, -4)); // ""(空字符串) 按照规则等价于: substr(3,0)
``` ```
### 2.3 基本类型检测 ### 2.3 基本类型检测
@@ -301,9 +301,9 @@ var colors = ["red", "blue", "green"];
```javascript ```javascript
var colors = ["red", "blue", "green"]; var colors = ["red", "blue", "green"];
colors.length = 2; // ["red", "blue"] colors.length = 2; // ["red", "blue"]
colors[colors.length] = "green"; // ["red", "blue", "green"] colors[colors.length] = "green"; // ["red", "blue", "green"]
colors[10] = "black"; // ["red", "blue", "green", empty × 7, "black"] colors[10] = "black"; // ["red", "blue", "green", empty × 7, "black"]
``` ```
数组的其他常用方法如下: 数组的其他常用方法如下:
@@ -333,9 +333,9 @@ ECMAScript 的数组提供了类似栈的特性,能够实现后进先出:
```javascript ```javascript
var colors = ["red", "blue", "green"]; var colors = ["red", "blue", "green"];
colors.push("black"); // ["red", "blue", "green", "black"] colors.push("black"); // ["red", "blue", "green", "black"]
colors.pop() // "black" colors.pop() // "black"
colors // ["red", "blue", "green"] colors // ["red", "blue", "green"]
``` ```
**4. 队列方法** **4. 队列方法**
@@ -353,7 +353,7 @@ colors // ["blue", "green", "black", "yellow"]
```javascript ```javascript
var values = [1, 2, 3, 4, 5]; var values = [1, 2, 3, 4, 5];
values.reverse(); values.reverse();
values // [5, 4, 3, 2, 1] values // [5, 4, 3, 2, 1]
// 支持传入排序函数进行自定义排序 // 支持传入排序函数进行自定义排序
function compare(value1, value2) { function compare(value1, value2) {
@@ -366,7 +366,7 @@ function compare(value1, value2) {
} }
} }
values.sort(compare) values.sort(compare)
values // [1, 2, 3, 4, 5] values // [1, 2, 3, 4, 5]
``` ```
**6. 操作方法** **6. 操作方法**
@@ -377,8 +377,8 @@ values // [1, 2, 3, 4, 5]
var colors = ["red", "green", "blue"]; var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]); var colors2 = colors.concat("yellow", ["black", "brown"]);
colors // ["red", "green", "blue"] colors // ["red", "green", "blue"]
colors2 // ["red", "green", "blue", "yellow", "black", "brown"] colors2 // ["red", "green", "blue", "yellow", "black", "brown"]
``` ```
**slice()** 用于截取数组并返回新的数组,它接收两个参数,分别代表截取的开始位置和结束位置,它是一个前开后闭的区间: **slice()** 用于截取数组并返回新的数组,它接收两个参数,分别代表截取的开始位置和结束位置,它是一个前开后闭的区间:
@@ -386,8 +386,8 @@ colors2 // ["red", "green", "blue", "yellow", "black", "brown"]
```javascript ```javascript
var colors = ["red", "green", "blue", "yellow", "purple"]; var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1); // ["green", "blue", "yellow", "purple"] var colors2 = colors.slice(1); // ["green", "blue", "yellow", "purple"]
var colors3 = colors.slice(0,2); // ["red", "green"] var colors3 = colors.slice(0,2); // ["red", "green"]
``` ```
**splice()** 用于删除并在删除位置新增数据项,它接收任意个参数,其中第一个参数为删除的开始位置,第二个参数为删除多少个数据项,之后可以接任意个参数,用于表示待插入的数据项: **splice()** 用于删除并在删除位置新增数据项,它接收任意个参数,其中第一个参数为删除的开始位置,第二个参数为删除多少个数据项,之后可以接任意个参数,用于表示待插入的数据项:
@@ -409,10 +409,10 @@ colors // ["red", "black", "green", "yellow"]
```shell ```shell
var colors = ["red", "green", "blue", "yellow", "green", "blue"]; var colors = ["red", "green", "blue", "yellow", "green", "blue"];
colors.indexOf("green"); // 1 colors.indexOf("green"); // 1
colors.indexOf("green", 3); // 4 colors.indexOf("green", 3); // 4
colors.lastIndexOf("green"); // 4 colors.lastIndexOf("green"); // 4
colors.lastIndexOf("green", 3); // 1 colors.lastIndexOf("green", 3); // 1
``` ```
**8. 迭代方法** **8. 迭代方法**
@@ -461,11 +461,11 @@ ECMAScript 5 提供了两个归并数组的方法: **reduce()** 和 **reduceRi
var values = [1, 2, 3, 4, 5]; var values = [1, 2, 3, 4, 5];
var sum01 = values.reduce(function (prev, cur, index, array) { var sum01 = values.reduce(function (prev, cur, index, array) {
return prev + cur; return prev + cur;
}); // 15 }); // 15
var sum02 = values.reduceRight(function (prev, cur, index, array) { var sum02 = values.reduceRight(function (prev, cur, index, array) {
return prev + cur; return prev + cur;
}); // 15 }); // 15
``` ```
### 3.3 Date 类型 ### 3.3 Date 类型
@@ -474,10 +474,10 @@ var sum02 = values.reduceRight(function (prev, cur, index, array) {
```java ```java
var now = new Date(); var now = new Date();
now.toLocaleString() // 2019-9-14 9:53:59 AM now.toLocaleString() // 2019-9-14 9:53:59 AM
var date = new Date(2018, 7, 8, 8, 30, 20); var date = new Date(2018, 7, 8, 8, 30, 20);
date.toLocaleString(); // 2018-8-8 8:30:20 AM date.toLocaleString(); // 2018-8-8 8:30:20 AM
``` ```
如果你只想知道当前时间的毫秒数,可以直接使用 Date 对象的静态方法: 如果你只想知道当前时间的毫秒数,可以直接使用 Date 对象的静态方法:
@@ -496,9 +496,9 @@ Date.now()
```javascript ```javascript
var date = new Date(2018, 7, 8, 8, 30, 20); var date = new Date(2018, 7, 8, 8, 30, 20);
console.log(date.toLocaleString()); // 2018-8-8 8:30:20 AM console.log(date.toLocaleString()); // 2018-8-8 8:30:20 AM
console.log(date.toString()); // Wed Aug 08 2018 08:30:20 GMT+0800 (GMT+08:00) console.log(date.toString()); // Wed Aug 08 2018 08:30:20 GMT+0800 (GMT+08:00)
console.log(date.valueOf()); // 1533688220000 console.log(date.valueOf()); // 1533688220000
``` ```
由于 **valueOf()** 返回的是日期的时间戳格式,所以对于 date 对象,可以直接使用比较运算符来比较其大小: 由于 **valueOf()** 返回的是日期的时间戳格式,所以对于 date 对象,可以直接使用比较运算符来比较其大小:
@@ -507,8 +507,8 @@ console.log(date.valueOf()); // 1533688220000
var date01 = new Date(2018, 7, 8, 8, 30, 20); var date01 = new Date(2018, 7, 8, 8, 30, 20);
var date02 = new Date(2016, 7, 8, 8, 30, 20); var date02 = new Date(2016, 7, 8, 8, 30, 20);
console.log(date01 > date02); // true console.log(date01 > date02); // true
console.log(date01 < date02); // flase console.log(date01 < date02); // flase
``` ```
**2. 常用方法** **2. 常用方法**
@@ -533,9 +533,9 @@ ECMAScript 使用 function 关键字来声明函数,但和其他语言不同
function test(first, second) { function test(first, second) {
console.log("first:" + first + ",second:" + second); console.log("first:" + first + ",second:" + second);
} }
test(1) // first:1,second:undefined test(1) // first:1,second:undefined
test(1,2) // first:1,second:2 test(1,2) // first:1,second:2
test(1,2,3) // first:1,second:2 test(1,2,3) // first:1,second:2
``` ```
之所以能实现这样的效果,是因为 ECMAScript 在函数内部使用了一个数组 arguments 来维护所有参数,函数接收到的始终都是这个数组,而在实际使用时指向的也是这个数组中的具体元素,所以以上的函数等价于下面的函数: 之所以能实现这样的效果,是因为 ECMAScript 在函数内部使用了一个数组 arguments 来维护所有参数,函数接收到的始终都是这个数组,而在实际使用时指向的也是这个数组中的具体元素,所以以上的函数等价于下面的函数:
@@ -650,7 +650,7 @@ function test() {
age // age is not defined age // age is not defined
if (true) { if (true) {
var name = "heibaiying"; var name = "heibaiying";
} }
name // heibaiying name // heibaiying
``` ```

View File

@@ -404,25 +404,25 @@ Java 语言中的顺序语义可以分为以下四类:
编译器和处理器出于性能考虑,通常会改变代码的实际执行顺序,这种情况就称为重排序,具体分为以下两类: 编译器和处理器出于性能考虑,通常会改变代码的实际执行顺序,这种情况就称为重排序,具体分为以下两类:
<table> <table>
<tr>
<th>重排序类型</th>
<th>重排序表现</th>
<th>重排序主体(原因)</th>
</tr>
<tr>
<td rowspan = "2">指令重排序</td>
<td>程序顺序和源代码顺序不一致</td>
<td>编译器</td>
</tr>
<tr>
<td>执行顺序和程序顺序不一致</td>
<td>JIT 编译器、处理器</td>
</tr>
<tr> <tr>
<td>存储子系统重排序 <br/> (内存重排序)</td> <th>重排序类型</th>
<td>源代码顺序、程序顺序和执行顺序这三者保持一致,<br/> 但是感知顺序与执行顺序不一致</td> <th>重排序表现</th>
<td>高速缓存、写缓冲器</td> <th>重排序主体(原因)</th>
</tr> </tr>
<tr>
<td rowspan = "2">指令重排序</td>
<td>程序顺序和源代码顺序不一致</td>
<td>编译器</td>
</tr>
<tr>
<td>执行顺序和程序顺序不一致</td>
<td>JIT 编译器、处理器</td>
</tr>
<tr>
<td>存储子系统重排序 <br/> (内存重排序)</td>
<td>源代码顺序、程序顺序和执行顺序这三者保持一致,<br/> 但是感知顺序与执行顺序不一致</td>
<td>高速缓存、写缓冲器</td>
</tr>
</table> </table>
### 5.3 貌似串行语义 ### 5.3 貌似串行语义
@@ -1525,7 +1525,7 @@ public class J2_ScheduledTask {
public ThreadPoolExecutor(int corePoolSize, //核心线程数量 public ThreadPoolExecutor(int corePoolSize, //核心线程数量
int maximumPoolSize, //最大线程数量 int maximumPoolSize, //最大线程数量
long keepAliveTime, //超过核心线程数的线程的存活时间 long keepAliveTime, //超过核心线程数的线程的存活时间
TimeUnit unit, //存活时间的单位 TimeUnit unit, //存活时间的单位
BlockingQueue<Runnable> workQueue, //任务队列 BlockingQueue<Runnable> workQueue, //任务队列
ThreadFactory threadFactory, //线程工厂 ThreadFactory threadFactory, //线程工厂
RejectedExecutionHandler handler) //拒绝策略 RejectedExecutionHandler handler) //拒绝策略

View File

@@ -88,19 +88,19 @@
```java ```java
public class HungrySingleton implements Serializable { public class HungrySingleton implements Serializable {
private static final HungrySingleton instance; private static final HungrySingleton instance;
static { static {
instance = new HungrySingleton(); instance = new HungrySingleton();
} }
// 确保构造器私有 // 确保构造器私有
private HungrySingleton() {} private HungrySingleton() {}
// 获取单例对象 // 获取单例对象
public static HungrySingleton getInstance() { public static HungrySingleton getInstance() {
return instance; return instance;
} }
} }
``` ```
@@ -133,17 +133,17 @@ public class StaticInnerClassHungrySingleton {
```java ```java
public class LazySingletonUnsafe { public class LazySingletonUnsafe {
private static LazySingletonUnsafe instance = null; private static LazySingletonUnsafe instance = null;
private LazySingletonUnsafe() { private LazySingletonUnsafe() {
} }
public static LazySingletonUnsafe getInstance() { public static LazySingletonUnsafe getInstance() {
if (instance == null) { if (instance == null) {
instance = new LazySingletonUnsafe(); instance = new LazySingletonUnsafe();
} }
return instance; return instance;
} }
} }
``` ```
@@ -159,11 +159,11 @@ if (instance == null) {
```java ```java
public synchronized static LazySingletonUnsafe getInstance() { public synchronized static LazySingletonUnsafe getInstance() {
if (instance == null) { if (instance == null) {
instance = new LazySingletonUnsafe(); instance = new LazySingletonUnsafe();
} }
return instance; return instance;
} }
``` ```
此时该方法是线程安全的,但是性能却存在问题。因为 synchronized 修饰的是静态方法,其锁住的是整个类对象,这意味着所有想要获取该单例对象的线程都必须要等待内部锁的释放。假设单例对象已经创建完成,并有 100 个线程并发获取该单例对象,则这 100 个线程都需要等待,显然这会降低系统的吞吐量,因此更好的方式是采用 **双重检查锁的机制** 来实现懒汉式单例: 此时该方法是线程安全的,但是性能却存在问题。因为 synchronized 修饰的是静态方法,其锁住的是整个类对象,这意味着所有想要获取该单例对象的线程都必须要等待内部锁的释放。假设单例对象已经创建完成,并有 100 个线程并发获取该单例对象,则这 100 个线程都需要等待,显然这会降低系统的吞吐量,因此更好的方式是采用 **双重检查锁的机制** 来实现懒汉式单例:
@@ -238,9 +238,9 @@ public class SerializationDamage {
```java ```java
public class HungrySingleton implements Serializable { public class HungrySingleton implements Serializable {
...... ......
private Object readResolve() { private Object readResolve() {
return instance; return instance;
} }
...... ......
} }
``` ```
@@ -285,20 +285,20 @@ public class ReflectionDamage {
```java ```java
public class HungrySingleton implements Serializable { public class HungrySingleton implements Serializable {
private static final HungrySingleton instance; private static final HungrySingleton instance;
static { static {
instance = new HungrySingleton(); instance = new HungrySingleton();
} }
// 由于instance在类创建时就已经初始化完成所以当使用反射调用构造器时就会抛出自定义的RuntimeException异常 // 由于instance在类创建时就已经初始化完成所以当使用反射调用构造器时就会抛出自定义的RuntimeException异常
private HungrySingleton() { private HungrySingleton() {
if (instance != null) { if (instance != null) {
throw new RuntimeException("单例模式禁止反射调用"); throw new RuntimeException("单例模式禁止反射调用");
} }
} }
...... ......
} }
``` ```
@@ -313,21 +313,21 @@ public class HungrySingleton implements Serializable {
```java ```java
public enum EnumInstance { public enum EnumInstance {
INSTANCE; INSTANCE;
private String field; private String field;
public String getField() { public String getField() {
return field; return field;
} }
public void setField(String field) { public void setField(String field) {
this.field = field; this.field = field;
} }
public static EnumInstance getInstance() { public static EnumInstance getInstance() {
return INSTANCE; return INSTANCE;
} }
} }
``` ```
@@ -398,20 +398,20 @@ public final class EnumInstance extends Enum
```java ```java
public class EnumInstanceTest { public class EnumInstanceTest {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
// 序列化攻击 // 序列化攻击
EnumInstance instance = EnumInstance.getInstance(); EnumInstance instance = EnumInstance.getInstance();
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("EnumSingletonFile")); ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("EnumSingletonFile"));
outputStream.writeObject(instance); outputStream.writeObject(instance);
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File("EnumSingletonFile"))); ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File("EnumSingletonFile")));
EnumInstance newInstance = (EnumInstance) inputStream.readObject(); EnumInstance newInstance = (EnumInstance) inputStream.readObject();
System.out.println(instance == newInstance); System.out.println(instance == newInstance);
// 反射攻击Enum类中只有一个两个参数的构造器Enum(String name, int ordinal) // 反射攻击Enum类中只有一个两个参数的构造器Enum(String name, int ordinal)
Constructor<EnumInstance> constructor = EnumInstance.class.getDeclaredConstructor(String.class, int.class); Constructor<EnumInstance> constructor = EnumInstance.class.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true); constructor.setAccessible(true);
EnumInstance enumInstance = constructor.newInstance("name", 0); EnumInstance enumInstance = constructor.newInstance("name", 0);
System.out.println(instance == enumInstance); System.out.println(instance == enumInstance);
} }
} }
``` ```
@@ -419,8 +419,8 @@ public class EnumInstanceTest {
```java ```java
Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects
at java.lang.reflect.Constructor.newInstance(Constructor.java:417) at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at com.heibaiying.creational.singleton.EnumInstanceTest.main(EnumInstanceTest.java:18) at com.heibaiying.creational.singleton.EnumInstanceTest.main(EnumInstanceTest.java:18)
``` ```
@@ -441,7 +441,7 @@ Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflective
```java ```java
public abstract class Phone { public abstract class Phone {
public abstract void call(String phoneNum); public abstract void call(String phoneNum);
} }
``` ```
@@ -483,11 +483,11 @@ public class PhoneFactory {
```java ```java
public class ZTest { public class ZTest {
public static void main(String[] args) { public static void main(String[] args) {
PhoneFactory phoneFactory = new PhoneFactory(); PhoneFactory phoneFactory = new PhoneFactory();
phoneFactory.getPhone("xiaomi").call("123"); phoneFactory.getPhone("xiaomi").call("123");
phoneFactory.getPhone("huawei").call("321"); phoneFactory.getPhone("huawei").call("321");
} }
} }
``` ```
@@ -670,12 +670,12 @@ public class XiaomiPhoneFactory implements Factory {
```java ```java
public class ZTest { public class ZTest {
public static void main(String[] args) { public static void main(String[] args) {
XiaomiPhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory(); XiaomiPhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();
xiaomiPhoneFactory.produceCharger().Charge(xiaomiPhoneFactory.producePhone()); xiaomiPhoneFactory.produceCharger().Charge(xiaomiPhoneFactory.producePhone());
HuaweiPhoneFactory huaweiPhoneFactory = new HuaweiPhoneFactory(); HuaweiPhoneFactory huaweiPhoneFactory = new HuaweiPhoneFactory();
huaweiPhoneFactory.produceCharger().Charge(huaweiPhoneFactory.producePhone()); huaweiPhoneFactory.produceCharger().Charge(huaweiPhoneFactory.producePhone());
} }
} }
``` ```
@@ -699,12 +699,12 @@ public class ZTest {
```java ```java
public class Phone { public class Phone {
/*处理器*/ /*处理器*/
private String processor; private String processor;
/*摄像头*/ /*摄像头*/
private String camera; private String camera;
/*屏幕*/ /*屏幕*/
private String screen; private String screen;
} }
``` ```
@@ -714,11 +714,11 @@ public class Phone {
public abstract class Builder { public abstract class Builder {
protected Phone phone = new Phone(); protected Phone phone = new Phone();
/*安装处理器*/ /*安装处理器*/
public abstract void addProcessor(); public abstract void addProcessor();
/*组装摄像头*/ /*组装摄像头*/
public abstract void addCamera(); public abstract void addCamera();
/*安装屏幕*/ /*安装屏幕*/
public abstract void addScreen(); public abstract void addScreen();
public Phone produce() { public Phone produce() {
@@ -750,20 +750,20 @@ public class HuaweiBuilder extends Builder {
```java ```java
public class XiaomiBuilder extends Builder { public class XiaomiBuilder extends Builder {
@Override @Override
public void addProcessor() { public void addProcessor() {
phone.setProcessor("高通骁龙处理器"); phone.setProcessor("高通骁龙处理器");
} }
@Override @Override
public void addCamera() { public void addCamera() {
phone.setCamera("索尼摄像头"); phone.setCamera("索尼摄像头");
} }
@Override @Override
public void addScreen() { public void addScreen() {
phone.setScreen("OLED"); phone.setScreen("OLED");
} }
} }
``` ```
@@ -772,18 +772,18 @@ public class XiaomiBuilder extends Builder {
```java ```java
public class Manager { public class Manager {
private Builder builder; private Builder builder;
public Manager(Builder builder) { public Manager(Builder builder) {
this.builder = builder; this.builder = builder;
} }
public Phone buy() { public Phone buy() {
builder.addCamera(); builder.addCamera();
builder.addProcessor(); builder.addProcessor();
builder.addScreen(); builder.addScreen();
return builder.produce(); return builder.produce();
} }
} }
``` ```
@@ -791,12 +791,12 @@ public class Manager {
```java ```java
public class ZTest { public class ZTest {
public static void main(String[] args) { public static void main(String[] args) {
Phone huawei = new Manager(new HuaweiBuilder()).buy(); Phone huawei = new Manager(new HuaweiBuilder()).buy();
System.out.println(huawei); System.out.println(huawei);
Phone xiaomi = new Manager(new XiaomiBuilder()).buy(); Phone xiaomi = new Manager(new XiaomiBuilder()).buy();
System.out.println(xiaomi); System.out.println(xiaomi);
} }
} }
// 输出: // 输出:
Phone(processor=海思麒麟处理器, camera=莱卡摄像头, screen=OLED) Phone(processor=海思麒麟处理器, camera=莱卡摄像头, screen=OLED)
@@ -896,7 +896,7 @@ public class SmartPhone implements Cloneable {
```java ```java
public interface IService { public interface IService {
void compute(); void compute();
} }
``` ```
@@ -974,9 +974,9 @@ proxyInstance.compute();
```java ```java
public class ComputeService { public class ComputeService {
public void compute() { public void compute() {
System.out.println("业务处理"); System.out.println("业务处理");
} }
} }
``` ```
@@ -1268,7 +1268,7 @@ public class Folder extends Component {
@Override @Override
public void print() { public void print() {
System.out.println(getName()); System.out.println(getName());
componentList.forEach(x -> System.out.println(" " + x.getName())); componentList.forEach(x -> System.out.println(" " + x.getName()));
} }
} }
``` ```
@@ -1831,13 +1831,13 @@ public class GroupLeader extends Leader {
```java ```java
public class DepartManager extends Leader { public class DepartManager extends Leader {
@Override @Override
public void approval(Application application) { public void approval(Application application) {
System.out.println(application.getTitle() + "被部门经理审批通过"); System.out.println(application.getTitle() + "被部门经理审批通过");
if (application.getDayNum() >= 5) { if (application.getDayNum() >= 5) {
leader.approval(application); leader.approval(application);
} }
} }
} }
``` ```
@@ -2011,24 +2011,24 @@ public interface Strategy {
} }
public class TravelStrategy implements Strategy { public class TravelStrategy implements Strategy {
@Override @Override
public void execute() { public void execute() {
System.out.println("集体旅游"); System.out.println("集体旅游");
} }
} }
public class BonusStrategy implements Strategy { public class BonusStrategy implements Strategy {
@Override @Override
public void execute() { public void execute() {
System.out.println("奖金激励"); System.out.println("奖金激励");
} }
} }
public class WorkOvertimeStrategy implements Strategy { public class WorkOvertimeStrategy implements Strategy {
@Override @Override
public void execute() { public void execute() {
System.out.println("奖励加班"); System.out.println("奖励加班");
} }
} }
``` ```
@@ -2141,19 +2141,19 @@ public class CloseState extends State {
```java ```java
public class PauseState extends State { public class PauseState extends State {
@Override @Override
public void speed() { public void speed() {
System.out.print("操作失败:暂停状态下不支持加速"); System.out.print("操作失败:暂停状态下不支持加速");
} }
} }
``` ```
```java ```java
public class SpeedState extends State { public class SpeedState extends State {
@Override @Override
public void paly() { public void paly() {
System.out.println("系统提示:你当前已处于加速播放状态"); System.out.println("系统提示:你当前已处于加速播放状态");
} }
} }
``` ```
@@ -2162,47 +2162,47 @@ public class SpeedState extends State {
```java ```java
public class Player { public class Player {
private State state; private State state;
public final static PlayState PLAY_STATE = new PlayState(); public final static PlayState PLAY_STATE = new PlayState();
public final static PauseState PAUSE_STATE = new PauseState(); public final static PauseState PAUSE_STATE = new PauseState();
public final static CloseState CLOSE_STATE = new CloseState(); public final static CloseState CLOSE_STATE = new CloseState();
public final static SpeedState SPEED_STATE = new SpeedState(); public final static SpeedState SPEED_STATE = new SpeedState();
public State getState() { public State getState() {
return state; return state;
} }
public void setState(State state) { public void setState(State state) {
this.state = state; this.state = state;
this.state.setPlayer(this); this.state.setPlayer(this);
} }
Player() { Player() {
// 假设播放器初始状态为关闭 // 假设播放器初始状态为关闭
this.state = new CloseState(); this.state = new CloseState();
this.state.setPlayer(this); this.state.setPlayer(this);
} }
public void paly() { public void paly() {
System.out.println("播放视频"); System.out.println("播放视频");
state.paly(); state.paly();
} }
public void pause() { public void pause() {
System.out.println("暂停视频"); System.out.println("暂停视频");
state.pause(); state.pause();
} }
public void close() { public void close() {
System.out.println("关闭视频"); System.out.println("关闭视频");
state.close(); state.close();
} }
public void speed() { public void speed() {
System.out.println("视频加速"); System.out.println("视频加速");
state.speed(); state.speed();
} }
} }
``` ```
@@ -2251,9 +2251,9 @@ player.speed();
```java ```java
abstract class Mediator { abstract class Mediator {
public abstract void register(Person person); public abstract void register(Person person);
public abstract void send(String from, String message); public abstract void send(String from, String message);
} }
``` ```
@@ -2262,26 +2262,26 @@ abstract class Mediator {
```java ```java
public class HouseMediator extends Mediator { public class HouseMediator extends Mediator {
private List<Person> personList = new ArrayList<>(); private List<Person> personList = new ArrayList<>();
@Override @Override
public void register(Person person) { public void register(Person person) {
if (!personList.contains(person)) { if (!personList.contains(person)) {
personList.add(person); personList.add(person);
person.setMediator(this); person.setMediator(this);
} }
} }
@Override @Override
public void send(String from, String message) { public void send(String from, String message) {
System.out.println(from + "发送消息:" + message); System.out.println(from + "发送消息:" + message);
for (Person person : personList) { for (Person person : personList) {
String name = person.getName(); String name = person.getName();
if (!name.equals(from)) { if (!name.equals(from)) {
person.receive(message); person.receive(message);
} }
} }
} }
} }
``` ```
@@ -2290,20 +2290,20 @@ public class HouseMediator extends Mediator {
```java ```java
public class Person { public class Person {
private String name; private String name;
private Mediator mediator; private Mediator mediator;
public Person(String name) { public Person(String name) {
this.name = name; this.name = name;
} }
public void send(String message) { public void send(String message) {
mediator.send(this.name, message); mediator.send(this.name, message);
} }
public void receive(String message) { public void receive(String message) {
System.out.println(name + "收到消息:" + message); System.out.println(name + "收到消息:" + message);
} }
} }
``` ```
@@ -2311,16 +2311,16 @@ public class Person {
```java ```java
public class ZTest { public class ZTest {
public static void main(String[] args) { public static void main(String[] args) {
HouseMediator houseMediator = new HouseMediator(); HouseMediator houseMediator = new HouseMediator();
Person seller = new Person("卖方"); Person seller = new Person("卖方");
Person buyer = new Person("买方"); Person buyer = new Person("买方");
houseMediator.register(seller); houseMediator.register(seller);
houseMediator.register(buyer); houseMediator.register(buyer);
buyer.send("价格多少"); buyer.send("价格多少");
seller.send("10万"); seller.send("10万");
buyer.send("太贵了"); buyer.send("太贵了");
} }
} }
// 输出: // 输出:
@@ -2346,10 +2346,10 @@ public class ZTest {
```java ```java
public class Book { public class Book {
private String name; private String name;
public Book(String name) { public Book(String name) {
this.name = name; this.name = name;
} }
} }
``` ```
@@ -2357,29 +2357,29 @@ public class Book {
```java ```java
public interface Bookshelf { public interface Bookshelf {
void addBook(Book book); void addBook(Book book);
void removeBook(Book book); void removeBook(Book book);
BookIterator iterator(); BookIterator iterator();
} }
public class BookshelfImpl implements Bookshelf { public class BookshelfImpl implements Bookshelf {
private List<Book> bookList = new ArrayList<>(); private List<Book> bookList = new ArrayList<>();
@Override @Override
public void addBook(Book book) { public void addBook(Book book) {
bookList.add(book); bookList.add(book);
} }
@Override @Override
public void removeBook(Book book) { public void removeBook(Book book) {
bookList.remove(book); bookList.remove(book);
} }
@Override @Override
public BookIterator iterator() { public BookIterator iterator() {
return new BookIterator(bookList); return new BookIterator(bookList);
} }
} }
``` ```
@@ -2387,28 +2387,28 @@ public class BookshelfImpl implements Bookshelf {
```java ```java
public interface Iterator<E> { public interface Iterator<E> {
E next(); E next();
boolean hasNext(); boolean hasNext();
} }
public class BookIterator implements Iterator<Book> { public class BookIterator implements Iterator<Book> {
private List<Book> bookList; private List<Book> bookList;
private int position = 0; private int position = 0;
public BookIterator(List<Book> bookList) { public BookIterator(List<Book> bookList) {
this.bookList = bookList; this.bookList = bookList;
} }
@Override @Override
public Book next() { public Book next() {
return bookList.get(position++); return bookList.get(position++);
} }
@Override @Override
public boolean hasNext() { public boolean hasNext() {
return position < bookList.size(); return position < bookList.size();
} }
} }
``` ```
@@ -2460,21 +2460,21 @@ while (iterator.hasNext()) {
```java ```java
public interface Archive { public interface Archive {
// 接受访问者 // 接受访问者
void accept(Visitor visitor); void accept(Visitor visitor);
} }
public class PublicArchive implements Archive { public class PublicArchive implements Archive {
@Override @Override
public void accept(Visitor visitor) { public void accept(Visitor visitor) {
visitor.visit(this); visitor.visit(this);
} }
} }
public class SecretArchive implements Archive { public class SecretArchive implements Archive {
@Override @Override
public void accept(Visitor visitor) { public void accept(Visitor visitor) {
visitor.visit(this); visitor.visit(this);
} }
} }
``` ```
@@ -2483,39 +2483,39 @@ public class SecretArchive implements Archive {
```java ```java
public interface Visitor { public interface Visitor {
// 访问公开档案 // 访问公开档案
void visit(PublicArchive publicArchive); void visit(PublicArchive publicArchive);
// 访问加密档案 // 访问加密档案
void visit(SecretArchive secretArchive); void visit(SecretArchive secretArchive);
} }
``` ```
```java ```java
public class DepartManager implements Visitor { public class DepartManager implements Visitor {
@Override @Override
public void visit(PublicArchive publicArchive) { public void visit(PublicArchive publicArchive) {
System.out.println("所有公开档案"); System.out.println("所有公开档案");
} }
@Override @Override
public void visit(SecretArchive secretArchive) { public void visit(SecretArchive secretArchive) {
System.out.println("三级以下权限的加密档案"); System.out.println("三级以下权限的加密档案");
} }
} }
``` ```
```java ```java
public class President implements Visitor { public class President implements Visitor {
@Override @Override
public void visit(PublicArchive publicArchive) { public void visit(PublicArchive publicArchive) {
System.out.println("所有公开档案"); System.out.println("所有公开档案");
} }
@Override @Override
public void visit(SecretArchive secretArchive) { public void visit(SecretArchive secretArchive) {
System.out.println("所有加密档案"); System.out.println("所有加密档案");
} }
} }
``` ```
@@ -2524,24 +2524,24 @@ public class President implements Visitor {
```java ```java
public class Company { public class Company {
private List<Archive> archives = new ArrayList<>(); private List<Archive> archives = new ArrayList<>();
// 接收档案 // 接收档案
void add(Archive archive) { void add(Archive archive) {
archives.add(archive); archives.add(archive);
} }
// 移除档案 // 移除档案
void remove(Archive archive) { void remove(Archive archive) {
archives.remove(archive); archives.remove(archive);
} }
// 接待访问者 // 接待访问者
void accept(Visitor visitor) { void accept(Visitor visitor) {
for (Archive archive : archives) { for (Archive archive : archives) {
archive.accept(visitor); archive.accept(visitor);
} }
} }
} }
``` ```
@@ -2584,8 +2584,8 @@ company.accept(new President());
```java ```java
public class Article { public class Article {
private String title; private String title;
private String content; private String content;
} }
``` ```
@@ -2595,20 +2595,20 @@ public class Article {
// 备忘录对象 // 备忘录对象
public class Memorandum { public class Memorandum {
private String title; private String title;
private String content; private String content;
private Date createTime; private Date createTime;
// 根据目标对象来创建备忘录对象 // 根据目标对象来创建备忘录对象
public Memorandum(Article article) { public Memorandum(Article article) {
this.title = article.getTitle(); this.title = article.getTitle();
this.content = article.getContent(); this.content = article.getContent();
this.createTime = new Date(); this.createTime = new Date();
} }
public Article toArticle() { public Article toArticle() {
return new Article(this.title, this.content); return new Article(this.title, this.content);
} }
} }
``` ```
@@ -2618,24 +2618,24 @@ public class Memorandum {
```java ```java
public class GitRepository { public class GitRepository {
private List<Memorandum> repository = new ArrayList<>(); private List<Memorandum> repository = new ArrayList<>();
// 保存当前数据 // 保存当前数据
public void save(Article article) { public void save(Article article) {
Memorandum memorandum = new Memorandum(article); Memorandum memorandum = new Memorandum(article);
repository.add(memorandum); repository.add(memorandum);
} }
// 获取指定版本类的数据 // 获取指定版本类的数据
public Article get(int version) { public Article get(int version) {
Memorandum memorandum = repository.get(version); Memorandum memorandum = repository.get(version);
return memorandum.toArticle(); return memorandum.toArticle();
} }
// 撤销当前操作 // 撤销当前操作
public Article back() { public Article back() {
return repository.get(repository.size() - 1).toArticle(); return repository.get(repository.size() - 1).toArticle();
} }
} }
``` ```

View File

@@ -90,7 +90,7 @@
```shell ```shell
processManagement: processManagement:
# 以后台进程的方式启动 # 以后台进程的方式启动
fork: true fork: true
systemLog: systemLog:
destination: file destination: file
@@ -103,10 +103,10 @@ net:
port: 27018 port: 27018
bindIp: 0.0.0.0 bindIp: 0.0.0.0
replication: replication:
# 副本集的名称 # 副本集的名称
replSetName: rs0 replSetName: rs0
sharding: sharding:
# 在集群中的角色为分片 # 在集群中的角色为分片
clusterRole: shardsvr clusterRole: shardsvr
``` ```
@@ -125,10 +125,10 @@ net:
port: 37018 port: 37018
bindIp: 0.0.0.0 bindIp: 0.0.0.0
replication: replication:
# 副本集的名称 # 副本集的名称
replSetName: rs1 replSetName: rs1
sharding: sharding:
# 在集群中的角色为分片 # 在集群中的角色为分片
clusterRole: shardsvr clusterRole: shardsvr
``` ```
@@ -146,13 +146,13 @@ systemLog:
storage: storage:
dbPath: "/home/mongodb/config-serve-data" dbPath: "/home/mongodb/config-serve-data"
net: net:
# 配置服务的默认端口为27019 # 配置服务的默认端口为27019
port: 27019 port: 27019
bindIp: 0.0.0.0 bindIp: 0.0.0.0
replication: replication:
replSetName: configReplSet replSetName: configReplSet
sharding: sharding:
# 在集群中的角色为配置服务 # 在集群中的角色为配置服务
clusterRole: configsvr clusterRole: configsvr
``` ```

View File

@@ -105,11 +105,11 @@ db.user.insertMany([
# 此时会返回新插入的数据的ObjectId # 此时会返回新插入的数据的ObjectId
{ {
"acknowledged" : true, "acknowledged" : true,
"insertedIds" : [ "insertedIds" : [
ObjectId("5d3d0489ad38cd3becc7b03b"), ObjectId("5d3d0489ad38cd3becc7b03b"),
ObjectId("5d3d0489ad38cd3becc7b03c") ObjectId("5d3d0489ad38cd3becc7b03c")
] ]
} }
``` ```

View File

@@ -78,12 +78,12 @@ db.employees.aggregate([
```shell ```shell
{ {
"_id" : ObjectId("5d3fe6488ba16934ccce999d"), "_id" : ObjectId("5d3fe6488ba16934ccce999d"),
"fullName" : "GeorgiFacello" "fullName" : "GeorgiFacello"
}, },
{ {
"_id" : ObjectId("5d3fe6488ba16934ccce99a0"), "_id" : ObjectId("5d3fe6488ba16934ccce99a0"),
"fullName" : "ChirstianKoblick" "fullName" : "ChirstianKoblick"
} }
``` ```
@@ -158,16 +158,16 @@ db.employees.aggregate(
```json ```json
{ {
"_id" : "M", "_id" : "M",
"totalAge" : 78, "totalAge" : 78,
"avgAge" : 39, "avgAge" : 39,
"count" : 2 "count" : 2
}, },
{ {
"_id" : "F", "_id" : "F",
"totalAge" : 66, "totalAge" : 66,
"avgAge" : 33, "avgAge" : 33,
"count" : 2 "count" : 2
} }
``` ```
@@ -188,10 +188,10 @@ db.employees.aggregate(
# 输出如下 # 输出如下
{ {
"_id" : null, "_id" : null,
"totalAge" : 144, "totalAge" : 144,
"avgAge" : 36, "avgAge" : 36,
"count" : 4 "count" : 4
} }
``` ```
@@ -337,11 +337,11 @@ db.employees.aggregate([
"emp_no" : 10001, "emp_no" : 10001,
........ ........
"emp_title" : [ "emp_title" : [
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a5"), "_id" : ObjectId("5d4011728ba16934ccce99a5"),
"emp_no" : 10001, "emp_no" : 10001,
"title" : "Senior Engineer" "title" : "Senior Engineer"
} }
] ]
}, },
@@ -352,16 +352,16 @@ db.employees.aggregate([
"emp_no" : 10004, "emp_no" : 10004,
........ ........
"emp_title" : [ "emp_title" : [
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a8"), "_id" : ObjectId("5d4011728ba16934ccce99a8"),
"emp_no" : 10004, "emp_no" : 10004,
"title" : "Engineer" "title" : "Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a9"), "_id" : ObjectId("5d4011728ba16934ccce99a9"),
"emp_no" : 10004, "emp_no" : 10004,
"title" : "Senior Engineer" "title" : "Senior Engineer"
} }
] ]
} }
``` ```
@@ -412,31 +412,31 @@ db.employees.aggregate([
"emp_no" : 10001, "emp_no" : 10001,
....... .......
"emps_title" : [ "emps_title" : [
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a5"), "_id" : ObjectId("5d4011728ba16934ccce99a5"),
"emp_no" : 10001, "emp_no" : 10001,
"title" : "Senior Engineer" "title" : "Senior Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a6"), "_id" : ObjectId("5d4011728ba16934ccce99a6"),
"emp_no" : 10002, "emp_no" : 10002,
"title" : "Staff" "title" : "Staff"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a7"), "_id" : ObjectId("5d4011728ba16934ccce99a7"),
"emp_no" : 10003, "emp_no" : 10003,
"title" : "Senior Engineer" "title" : "Senior Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a8"), "_id" : ObjectId("5d4011728ba16934ccce99a8"),
"emp_no" : 10004, "emp_no" : 10004,
"title" : "Engineer" "title" : "Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a9"), "_id" : ObjectId("5d4011728ba16934ccce99a9"),
"emp_no" : 10004, "emp_no" : 10004,
"title" : "Senior Engineer" "title" : "Senior Engineer"
} }
] ]
}, },
@@ -445,31 +445,31 @@ db.employees.aggregate([
"emp_no" : 10002, "emp_no" : 10002,
....... .......
"emps_title" : [ "emps_title" : [
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a5"), "_id" : ObjectId("5d4011728ba16934ccce99a5"),
"emp_no" : 10001, "emp_no" : 10001,
"title" : "Senior Engineer" "title" : "Senior Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a6"), "_id" : ObjectId("5d4011728ba16934ccce99a6"),
"emp_no" : 10002, "emp_no" : 10002,
"title" : "Staff" "title" : "Staff"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a7"), "_id" : ObjectId("5d4011728ba16934ccce99a7"),
"emp_no" : 10003, "emp_no" : 10003,
"title" : "Senior Engineer" "title" : "Senior Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a8"), "_id" : ObjectId("5d4011728ba16934ccce99a8"),
"emp_no" : 10004, "emp_no" : 10004,
"title" : "Engineer" "title" : "Engineer"
}, },
{ {
"_id" : ObjectId("5d4011728ba16934ccce99a9"), "_id" : ObjectId("5d4011728ba16934ccce99a9"),
"emp_no" : 10004, "emp_no" : 10004,
"title" : "Senior Engineer" "title" : "Senior Engineer"
} }
] ]
}, },
@@ -565,10 +565,10 @@ MongoDB 的 MapReduce 在概念上与 Hadoop MapReduce 类似MongoDB 将 *map
```shell ```shell
db.employees.mapReduce( db.employees.mapReduce(
function(){ function(){
emit(this.gender,this.age) emit(this.gender,this.age)
}, },
function(key,values){ function(key,values){
return Array.avg(values) return Array.avg(values)
}, },
{ out:"age_avg"} { out:"age_avg"}
) )

View File

@@ -110,10 +110,10 @@ mysql> SHOW MASTER STATUS;
```shell ```shell
CHANGE MASTER TO MASTER_HOST='192.168.0.226',\ CHANGE MASTER TO MASTER_HOST='192.168.0.226',\
MASTER_USER='repl', \ MASTER_USER='repl', \
MASTER_PASSWORD='123456',\ MASTER_PASSWORD='123456',\
MASTER_LOG_FILE='mysql-bin.000001',\ MASTER_LOG_FILE='mysql-bin.000001',\
MASTER_LOG_POS=887; MASTER_LOG_POS=887;
``` ```
开始复制: 开始复制:
@@ -220,9 +220,9 @@ STOP SLAVE IO_THREAD FOR CHANNEL '';
```shell ```shell
CHANGE MASTER TO MASTER_HOST='192.168.0.226',\ CHANGE MASTER TO MASTER_HOST='192.168.0.226',\
MASTER_USER='repl', MASTER_USER='repl',
MASTER_PASSWORD='123456', MASTER_PASSWORD='123456',
MASTER_AUTO_POSITION=1; MASTER_AUTO_POSITION=1;
``` ```
开始复制: 开始复制:
@@ -236,9 +236,9 @@ START SLAVE;
```sql ```sql
mysql> SHOW SLAVE STATUS\G mysql> SHOW SLAVE STATUS\G
.... ....
Master_UUID : e1148574-bdd0-11e9-8873-0800273acbfd Master_UUID : e1148574-bdd0-11e9-8873-0800273acbfd
Retrieved_Gtid_Set : e1148574-bdd0-11e9-8873-0800273acbfd:1-2 Retrieved_Gtid_Set : e1148574-bdd0-11e9-8873-0800273acbfd:1-2
Executed_Gtid_Set : e1148574-bdd0-11e9-8873-0800273acbfd:1-2 Executed_Gtid_Set : e1148574-bdd0-11e9-8873-0800273acbfd:1-2
..... .....
``` ```

View File

@@ -713,19 +713,19 @@ drop user youUsername cascade;
```sql ```sql
-- mysql -- mysql
create table if not exists ( create table if not exists (
, ,
, ,
... ...
) )
-- oracle -- oracle
CREATE TABLE [schema.]( CREATE TABLE [schema.](
, ,
... ...
); );
``` ```
@@ -897,11 +897,11 @@ insert into 表1(column1,column2,column3) select column1x,column2x,column3x from
```sql ```sql
create table ( create table (
not null,# not null,#
primary key,# primary key,#
unique,# unique,#
default ,# default ,#
constraint foreign key() references constraint foreign key() references
) )
``` ```
@@ -929,8 +929,8 @@ create table 表名(
-- 删除默认 -- 删除默认
alter table modify column ; alter table modify column ;
-- oracle -- oracle
-- 添加默认 -- 添加默认
alter table modify default ; alter table modify default ;
-- 删除默认 -- 删除默认
alter table modify ; alter table modify ;
@@ -965,7 +965,7 @@ create table 表名(
```sql ```sql
-- 创建表时设置自增长列 -- 创建表时设置自增长列
create table ( create table (
auto_increment auto_increment
) )
-- 修改表时设置自增长列 -- 修改表时设置自增长列
@@ -1204,7 +1204,7 @@ SHOW TRIGGERS [FROM schema_name];
```sql ```sql
DELIMITER // DELIMITER //
CREATE PROCEDURE ([[IN|OUT|INOUT] ],...) CREATE PROCEDURE ([[IN|OUT|INOUT] ],...)
BEGIN BEGIN
END END
DELIMITER ; DELIMITER ;
@@ -1322,7 +1322,7 @@ end if;
```sql ```sql
:while do :while do
end while ; end while ;
``` ```
@@ -1331,7 +1331,7 @@ end while 【名称】;
```sql ```sql
loop loop
end loop ; end loop ;
``` ```
@@ -1339,7 +1339,7 @@ end loop 【名称】;
```sql ```sql
:repeat :repeat
until until
end repeat ; end repeat ;
``` ```

View File

@@ -55,9 +55,9 @@ $ ./configure \
--prefix=/usr/app/nginx-1.16.1 \ --prefix=/usr/app/nginx-1.16.1 \
--with-pcre=/usr/app/pcre-8.42 \ --with-pcre=/usr/app/pcre-8.42 \
--with-zlib=/usr/app/zlib-1.2.11 \ --with-zlib=/usr/app/zlib-1.2.11 \
--with-http_ssl_module \ # 启用HTTPS支持 --with-http_ssl_module \ # 启用HTTPS支持
--with-stream \ # 启用TCP和UDP代理功能 --with-stream \ # 启用TCP和UDP代理功能
--with-mail=dynamic # 启用邮件代理功能 --with-mail=dynamic # 启用邮件代理功能
$ make $ make
$ sudo make install $ sudo make install