提交 25b15fc7 编写于 作者: M Mars Liu

reflections of data tree

上级 c1e0bc10
......@@ -74,12 +74,16 @@ pip install -r requirement.txt
首先,在知识节点下增加一个习题代码,例如在 `data/1.Java初阶/1.Java概述/1.什么是Java` 下增加一个`HelloWorld.java`代码:
```java
// TODO
public class App {
public static void main(String[] args){
System.out.println("Hello world!")
}
}
```
其次,增加一个同名的选项配置文件`HelloWorld.json`,目前有种配置规则
其次,增加一个同名的选项配置文件`HelloWorld.json`,目前有种配置规则
**单行替换规则**
### 单行替换规则
* 配置由`one_line`字段指定的单行替换字典
* 格式是:`"<源字符串>"`: [`"<替换字符串A>"`, `<替换字符串B>`,...],
......@@ -88,34 +92,42 @@ pip install -r requirement.txt
```json
{
// TODO
"one_line": {
"println": ["printf", "print", "fprint"]
}
}
```
上面的替换规则会将代码替换成 3 个变种的代码:
```c
// 变种代码1
// TODO
```java
public class App {
public static void main(String[] args){
System.out.print("Hello world!")
}
}
```
```c
// 变种代码2
#include <stdio.h>
int main(int argc, char** argv){
print("Hello,Wrold!");
return 0
```java
public class App {
public static void main(String[] args){
System.out.printf("Hello world!")
}
}
```
```c
// 变种代码3
// TODO
```java
public class App {
public static void main(String[] args){
System.out.sprint("Hello world!")
}
}
```
这些变种代码将会作为技能树该知识点该代码选择题的选项。
**多行替换规则**
### 多行替换规则
* 配置由`multiline`字段指定的多行替换数组
* 数组的每个元素是一组替换规则,会整组被替换
......@@ -124,29 +136,97 @@ int main(int argc, char** argv){
```json
{
// TODO
"mulitiline": [{
"public class": "public interface",
"main(": "Main("
},
{
"public class": "interface",
"void main": "int main"
},
{
"public static void main": "public void main"
}]
```
上面的替换规则会将代码替换成 3 个变种的代码:
```java
public interface App {
public static void Main(String[] args){
System.out.println("Hello world!")
}
}
```
```java
public interface App {
public static int main(String[] args){
System.out.println("Hello world!")
}
}
```
```java
public class App {
public void main(String[] args){
System.out.print("Hello world!")
}
}
```
这些变种代码将会作为技能树该知识点该代码选择题的选项。
### 预制的替换规则
* 配置由 `prepared` 字段制定的预制文件数组
* 数组每一个元素是一个预制的代码文件的路径文件名
例如:
```json
{
"prepared": [
"HelloWord.1.java",
"HelloWord.2.java",
"HelloWord.3.java"]
}
```
同样,该配置将支持将源代码生成3个变种代码
```java
// 变种代码1
// TODO
// HelloWord.1.java
public interface App {
default void Main(String[] args){
System.out.println("Hello world!")
}
}
```
```java
// 变种代码2, 注意第2组替换规则,包含了两行替换
// TODO
public interface App {
public static void main(String[] args){
System.out.println("Hello world!")
}
}
```
```java
// 变种代码3
// TODO
class App {
void main(String[] args){
System.out.print("Hello world!")
}
}
```
## 技能树合成
根目录下执行 `python main.py` 会合成技能树文件,合成的技能树文件: `data/tree.json`
`src`目录下执行 `python main.py -a tree` 会合成技能树文件,合成的技能树文件: `data/tree.json`
* 合成过程中,会自动检查每个目录下 `config.json` 里的 `node_id` 是否存在,不存在则生成
* 合成过程中,会自动检查每个知识点目录下 `config.json` 里的 `export` 里导出的习题配置,检查是否存在`exercise_id` 字段,如果不存在则生成
......@@ -5,31 +5,36 @@
{
"字节流概述": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"字节流读写文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件的拷贝": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"字节流的缓冲区": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"字节缓冲流": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,67 +5,78 @@
{
"File类的常用方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"遍历目录下的文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"删除文件及目录": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建文件对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件夹操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"目录列表器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"目录实用工具": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"目录的检查及创建": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件的创建与删除": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"获取文件信息": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"截尾和舍入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"提升": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"一元加、减操作符": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"测试对象的等价性": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"短路": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"File类的常用方法": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"遍历目录下的文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"删除文件及目录": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建文件对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件操作": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件夹操作": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"目录列表器": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"目录实用工具": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"目录的检查及创建": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"文件的创建与删除": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"获取文件信息": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"用构造器确保初始化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缺省构造器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -21,10 +23,12 @@
{
"指定初始化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -34,22 +38,26 @@
{
"初始化顺序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"静态数据的初始化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"显式的静态初始化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -59,10 +67,12 @@
{
"可变参数列表": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -76,10 +86,12 @@
{
"将静态导入用于enum": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -89,46 +101,54 @@
{
"覆盖enum的方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"switch语句中的enum": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"values()的神秘之处": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"实现但不继承随机选取": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"为组织而使用接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用EnumSet替代标志": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用EnumMap": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -138,16 +158,19 @@
{
"使用enum的职责链": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用enum的状态机": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -157,37 +180,44 @@
{
"使用enum分发": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用EnumMap分发": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用枚举类型设置常量": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用枚举类型的优势": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"类初始化块": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -197,40 +227,47 @@
{
"包访问权限": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"public:接口访问权限": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"private: 你无法访问": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"protected:继承访问权限": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"类的访问权限": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"组合语法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -240,10 +277,12 @@
{
"初始化基类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -253,46 +292,54 @@
{
"创建代理对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"代理类的特性": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"在组合与继承之间选择": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"protected关键字": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"添加一组元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"容器的打印": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"List": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -302,34 +349,40 @@
{
"ListIterator": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"LinkedList": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Stack": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Set": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Map": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -339,16 +392,19 @@
{
"PriorityQueue": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Collection和Iterator": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -358,10 +414,12 @@
{
"适配器方法惯用法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"概念": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -15,46 +16,54 @@
{
"try块": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"异常处理程序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"f?inally子句": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"try-with-Resources语句": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分析堆栈轨迹元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建自定义异常": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"异常说明": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -64,22 +73,26 @@
{
"栈轨迹": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"重新抛出异常": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"异常链": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -89,10 +102,12 @@
{
"特例: RuntimeException(运行时异常)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -102,22 +117,26 @@
{
"finally用来做什么": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"在return中使用finally": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缺憾:异常丢失": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -127,22 +146,26 @@
{
"使用构造器执行初始化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构造器重载": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"异常匹配": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -152,34 +175,40 @@
{
"历史": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"观点": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"把异常传递给控制台": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"把“受检查异常”转换为“不受检查的异常”": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"异常使用指南": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"do-while": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"逗号操作符": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,43 +5,50 @@
{
"抽象过程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"每个对象都有一个接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"每个对象都提供服务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"被隐藏的具体实现": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"复用具体实现": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"伴随多态的可互换对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"单根继承结构": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -51,10 +58,12 @@
{
"参数化类型(范型)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"抽象过程": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"每个对象都有一个接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"每个对象都提供服务": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"被隐藏的具体实现": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"复用具体实现": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"伴随多态的可互换对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"单根继承结构": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"容器": {
"keywords": [],
"children": [
{
"参数化类型(范型)": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,43 +5,50 @@
{
"基本映射操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"更新映射条目": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射视图": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"弱散列映射": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"链接散列集与映射": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"枚举集与映射": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"标识散列映射": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"二分查找": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"简单算法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"批操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"编写自己的算法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"属性映射": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"栈": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"位集": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"List接口简介": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ArrayList集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"LinkedList集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"Iterator遍历集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach遍历集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"JDK 8的forEach遍历集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"Set接口简介": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HashSet集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"TreeSet集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,31 +5,36 @@
{
"Map接口简介": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HashMap集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Map集合遍历": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"TreeMap集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Properties集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"Collections工具类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Arrays工具类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"聚合操作简介": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建Stream流对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Stream流的常用方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Parallel Stream(并行流)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"集合接口与实现分离": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"泛型实用方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"输入流": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"输出流": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"FileInputStream类与FileOutputStream类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"FileReader类与FileWriter类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"BufferedInputStream类与BufferedOutputStream类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"BufferedReader类与BufferedWriter类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"压缩文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"解压缩ZIP文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"定义注解": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"元注解": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,31 +5,36 @@
{
"注解元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缺省值限制": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"生成外部文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"注解不支持继承": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"实现处理器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"将@Unit用于泛型": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"不需要任何“套件”": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"实现@Unit": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"移除测试代码": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"压缩文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"解压缩ZIP文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"更快的执行": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"改进代码设计": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"新建线程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"可运行线程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"阻塞和等待线程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"终止线程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"中断线程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"守护线程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"线程名": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"未捕获异常的处理器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,43 +5,50 @@
{
"阻塞队列": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射条目的原子更新": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对并发散列映射的批操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"并发集视图": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"写数组的拷贝": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"并行数组算法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"较早的线程安全集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"可完成Future": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"组合可完成Future": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用户界面回调中的长时间运行任务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,49 +5,57 @@
{
"定义任务让步": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用Executor": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"从任务产生返回值": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"休眠": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"让步": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"编码的变体": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"术语": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建有响应的用户界面": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,43 +5,50 @@
{
"不正确地访问资源": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"解决共享资源竞争": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"原子性与易变性": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"原子类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"临界资源": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"在其他对象上同步": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"线程局部存储": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"装饰性花园": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"在阻塞时终结": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"中断": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"检查中断": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"wait()与notifyAll()": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"notify()与notifyAll()": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"生产者与消费者": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"任务间使用管道进行输入输出": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"比较各类互斥技术": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"免锁容器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"乐观锁": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ReadWriteLock": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,19 +5,22 @@
{
"JDBC-ODBC桥": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"JDBC技术": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"JDBC驱动程序的类型": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"数据库基础": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数据查询": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态查询": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"添加、修改、删除记录": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -33,52 +37,61 @@
{
"什么是数据库": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数据库的种类及功能": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SQL语言": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"向数据库发送SQL语句": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"处理查询结果集": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"顺序查询": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"模糊查询": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"预处理语句": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"数据库基础": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数据查询": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态查询": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"添加、修改、删除记录": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数据库基础知识": {
"keywords": [],
"children": [
{
"什么是数据库": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数据库的种类及功能": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SQL语言": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"向数据库发送SQL语句": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"处理查询结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"顺序查询": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"模糊查询": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"预处理语句": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,25 +5,29 @@
{
"网络通信协议": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"IP地址和端口号": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"InetAddress": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"UDP与TCP协议": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,31 +5,36 @@
{
"UDP通信简介": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"DatagramPacket": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"DatagramSocket": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"UDP网络程序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"UDP案例——聊天程序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,37 +5,43 @@
{
"TCP通信简介": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServerSocket": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Socket": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"简单的TCP网络程序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多线程的TCP网络程序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"TCP案例——文件上传": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"网络基础知识": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"使用URLDecoder和URLEncoder": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"URL、URLConnection和URLPermission": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,43 +5,50 @@
{
"TCP协议基础": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用ServerSocket创建TCP服务器端": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用Socket进行通信": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"记录用户信息": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"半关闭的Socket": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用NIO实现非阻塞Socket通信": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用AIO实现非阻塞通信": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"UDP协议基础": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用DatagramSocket发送、接收数据": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用MulticastSocket实现多点广播": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"直接使用Proxy创建连接": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用ProxySelector自动选择代理服务器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,31 +5,36 @@
{
"发送同步GET请求": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"发送带请求体的请求": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"发送异步请求": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"WebSocket客户端支持": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"基于WebSocket的多人实时聊天": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,19 +5,22 @@
{
"类字面常量": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"泛化的Class引用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"新的转型语法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"使用类字面常量": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态instanceof": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"递归计数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"类方法抽取器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -15,22 +16,26 @@
{
"访问构造方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"访问成员变量": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"访问方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -40,70 +45,82 @@
{
"定义Annotation类型": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"访问Annotation信息": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"声明异常入门": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"资源": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"利用反射分析类的能力": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用反射在运行时分析": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用反射编写泛型数组": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"访问字段": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"调用方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"调用构造方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"获取继承关系": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"模拟对象与桩": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"发送同步GET请求": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"发送带请求体的请求": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"发送异步请求": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"WebSocket客户端支持": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"基于WebSocket的多人实时聊天": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,19 +5,22 @@
{
"List的排序和查询": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"设定Collection或Map为不可修改": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Collection或Map的同步控制": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"WeakHashMap": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"一种Generator解决方案": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Map生成器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用Abstract类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"未获支持的操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"优先级队列": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"双向队列": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"性能": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SortedMap": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"LinkedHashMap": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"理解hashCode()": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"为速度而散列": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"覆盖hashCode()": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,31 +5,36 @@
{
"性能测试框架": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对List的选择": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"微基准测试的危险": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对Set的选择": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对Map的选择": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"模拟对象与桩": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"性能测试框架": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对List的选择": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"微基准测试的危险": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对Set的选择": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对Map的选择": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,25 +5,29 @@
{
"Java在编程语言生态系统中的位置": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用行为参数化把代码传递给方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"并行与共享的可变数据": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Java需要演变": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -9,19 +9,22 @@
{
"从Java程序中调用C函数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数值参数与返回值": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"字符串参数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -31,16 +34,19 @@
{
"访问静态域": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"编码签名": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -50,49 +56,58 @@
{
"静态方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构造器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种方法调用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"访问数组元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用调用API": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递代码:一个例子": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"从传递方法到Lambda": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -9,22 +9,26 @@
{
"初始版本的API": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第二版API": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"概述默认方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -34,10 +38,12 @@
{
"行为的多继承": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -47,16 +53,19 @@
{
"选择提供了最具体实现的默认方法的接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"冲突及如何显式地消除歧义": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"采用防御式检查减少NullPointerException": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"其他语言中null的替代品": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,43 +5,50 @@
{
"创建Optional对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map从Optional对象中提取和转换值": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用flatMap链接Optional对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"操纵由Optional对象构成的Stream": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"默认行为及解引用Optional对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"两个Optional对象的组合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用filter剔除特定的值": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"创建Optional对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map从Optional对象中提取和转换值": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用flatMap链接Optional对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"操纵由Optional对象构成的Stream": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"默认行为及解引用Optional对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"两个Optional对象的组合": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用filter剔除特定的值": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"处理HTTP GET请求": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"处理HTTP POST请求": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"创建和编译servlet源代码": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"启动Tomcat": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"启动Web浏览器并请求servlet": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,55 +5,64 @@
{
"Servlet接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServletConfig接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServletContext接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServletRequest接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServletResponse接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"GenericServlet类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServletInputStream类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"ServletOutputStream类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"servlet异常类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,31 +5,36 @@
{
"HttpServletRequest接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HttpServletResponse接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HttpSession接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Cookie类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HttpServlet类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"其他的线程抽象:非嵌套方法调用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"你希望线程为你带来什么": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"Future风格的API": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"反应式风格的API": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"有害的睡眠及其他阻塞式操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"如何使用异步API进行异常处理": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"背压": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"一种简单的真实背压": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"HttpServletRequest接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HttpServletResponse接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HttpSession接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Cookie类": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"HttpServlet类": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"将同步方法转换为异步方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"错误处理": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"使用并行流对请求进行并行操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用CompletableFuture发起异步请求": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"寻找更好的方案": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用定制的执行器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,37 +5,43 @@
{
"实现折扣服务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用Discount服务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构造同步和异步操作": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"将两个CompletableFuture对象整合起来,无论它们是否存在依赖": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"对Future和Completable-Future的回顾": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"高效地使用超时机制": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"对最佳价格查询器应用的优化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"应用层的反应式编程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"反应式系统": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"Flow类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建你的第一个反应式应用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用Processor转换数据": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"转换及整合多个Observable": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"通过反射构建对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"反射方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"对最佳价格查询器应用的优化": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -9,22 +9,26 @@
{
"主动创建对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"被动创建对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Spring IoC阐述": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -34,22 +38,26 @@
{
"Spring IoC容器的设计": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Spring IoC容器的初始化和依赖注入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Spring Bean的生命周期": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -9,28 +9,33 @@
{
"构造器注入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用setter注入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"接口注入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"装配Bean概述": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -40,22 +45,26 @@
{
"装配简易值": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"装配集合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"命名空间装配": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -65,46 +74,54 @@
{
"使用@Component装配Bean": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动装配——@Autowired": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动装配的歧义性(@Primary和@Qualifier)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"装载带有参数的构造方法类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用@Bean装配Bean": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"注解自定义Bean的初始化和销毁方法": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"装配的混合使用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -114,34 +131,40 @@
{
"使用注解@Profile配置": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用XML定义Profile": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"启动Profile": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"点睛": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"演示": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -151,28 +174,33 @@
{
"使用注解方式加载属性文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用XML方式加载属性文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"条件化装配Bean": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Bean的作用域": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -182,16 +210,19 @@
{
"Spring EL相关的类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Spring EL运算": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -9,22 +9,26 @@
{
"约定规则": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"读者的代码": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"笔者的代码": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -34,22 +38,26 @@
{
"AOP的概念和使用原因": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"面向切面编程的术语": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Spring对AOP的支持": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -59,19 +67,22 @@
{
"选择切点": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"创建切面": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"连接点": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -81,49 +92,58 @@
{
"装配AOP": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用注解装配AOP": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"AOP避坑指南": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"环绕通知": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"织入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"给通知传递参数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"引入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -133,40 +153,47 @@
{
"前置通知、后置通知、返回通知和异常通知": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"环绕通知": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"给通知传递参数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"引入": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"经典Spring AOP应用程序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多个切面": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"传统的JDBC代码的弊端": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -15,22 +16,26 @@
{
"使用简单数据库配置": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用第三方数据库连接池": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用JNDI数据库连接池": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -40,28 +45,33 @@
{
"jdbcTemplate的增、删、查、改": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"执行多条SQL": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"jdbcTemplate的源码分析": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Spring的缺点": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -9,22 +9,26 @@
{
"配置事务管理器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用Java配置方式实现Spring数据库事务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"编程式事务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -34,28 +38,33 @@
{
"Transactional的配置项": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用XML进行配置事务管理器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"事务定义器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"声明式事务的约定流程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -65,22 +74,26 @@
{
"数据库事务ACID特性": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"丢失更新": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"隔离级别": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -90,22 +103,26 @@
{
"选择隔离级别": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传播行为": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"在Spring+MyBatis组合中使用事务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -115,22 +132,26 @@
{
"错误使用Service": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"过长时间占用事务": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"错误捕捉异常": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"Java配置": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"通过反射构建对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"反射方法": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,19 +5,22 @@
{
"注解@RequestAttribute": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"注解@SessionAttribute和注解@SessionAttributes": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"注解@CookieValue和注解@RequestHeader": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"使用JSR 303注解验证输入内容": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用验证器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"视图": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"视图解析器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"HttpMessageConverter和JSON消息转换器": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"一对一转换器(Converter)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"数组和集合转换器GenericConverter": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用格式化器(Formatter)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"MessageSource接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"CookieLocaleResolver和SessionLocaleResolver": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"国际化拦截器(LocaleChangeInterceptor)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"开发国际化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"示例": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"示例": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"示例": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"示例": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"示例": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"第一类:直接导入配置类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第二类:依据条件选择配置类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第三类:动态注册Bean": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,7 +5,8 @@
{
"示例": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"Java配置": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -5,19 +5,22 @@
{
"初试牛刀:筛选绿苹果": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"再展身手:把颜色作为参数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第三次尝试:对你能想到的每个属性做筛选": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"匿名类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第五次尝试:使用匿名类": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第六次尝试:使用Lambda表达式": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第七次尝试:将List类型抽象化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"用Comparator来排序": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用Runnable执行代码块": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"通过Callable返回结果": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"GUI事件处理": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
......@@ -9,22 +9,26 @@
{
"构建Configuration": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -34,40 +38,47 @@
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的初始化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -81,34 +92,40 @@
{
"简单的select元素的应用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递多个参数": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -118,34 +135,40 @@
{
"简单的insert语句的应用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"主键回填": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自定义主键": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"sql元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -155,16 +178,19 @@
{
"存储过程参数支持": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -174,22 +200,26 @@
{
"resultMap元素的构成": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -199,40 +229,47 @@
{
"MyBatis中的级联": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"建立POJO": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"配置映射文件": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"延迟加载": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种级联": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多对多级联": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -242,16 +279,19 @@
{
"一级缓存和二级缓存": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -261,19 +301,23 @@
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"游标的使用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
......@@ -283,40 +327,47 @@
{
"if元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"bind元素": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
]
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"用Comparator来排序": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用Runnable执行代码块": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"通过Callable返回结果": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"GUI事件处理": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"构建SqlSessionFactory过程": {
"keywords": [],
"children": [
{
"构建Configuration": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession运行过程": {
"keywords": [],
"children": [
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的初始化": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射器": {
"keywords": [],
"children": [
{
"select元素——查询语句": {
"keywords": [],
"children": [
{
"简单的select元素的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递多个参数": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"insert元素——插入语句": {
"keywords": [],
"children": [
{
"简单的insert语句的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"主键回填": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自定义主键": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"sql元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"参数": {
"keywords": [],
"children": [
{
"存储过程参数支持": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"resultMap元素": {
"keywords": [],
"children": [
{
"resultMap元素的构成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"级联": {
"keywords": [],
"children": [
{
"MyBatis中的级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"建立POJO": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"配置映射文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"延迟加载": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多对多级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存": {
"keywords": [],
"children": [
{
"一级缓存和二级缓存": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"存储过程": {
"keywords": [],
"children": [
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"游标的使用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态SQL": {
"keywords": [],
"children": [
{
"if元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"bind元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"构建SqlSessionFactory过程": {
"keywords": [],
"children": [
{
"构建Configuration": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession运行过程": {
"keywords": [],
"children": [
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的初始化": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射器": {
"keywords": [],
"children": [
{
"select元素——查询语句": {
"keywords": [],
"children": [
{
"简单的select元素的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递多个参数": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"insert元素——插入语句": {
"keywords": [],
"children": [
{
"简单的insert语句的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"主键回填": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自定义主键": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"sql元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"参数": {
"keywords": [],
"children": [
{
"存储过程参数支持": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"resultMap元素": {
"keywords": [],
"children": [
{
"resultMap元素的构成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"级联": {
"keywords": [],
"children": [
{
"MyBatis中的级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"建立POJO": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"配置映射文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"延迟加载": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多对多级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存": {
"keywords": [],
"children": [
{
"一级缓存和二级缓存": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"存储过程": {
"keywords": [],
"children": [
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"游标的使用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态SQL": {
"keywords": [],
"children": [
{
"if元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"bind元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"构建SqlSessionFactory过程": {
"keywords": [],
"children": [
{
"构建Configuration": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession运行过程": {
"keywords": [],
"children": [
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的初始化": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射器": {
"keywords": [],
"children": [
{
"select元素——查询语句": {
"keywords": [],
"children": [
{
"简单的select元素的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递多个参数": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"insert元素——插入语句": {
"keywords": [],
"children": [
{
"简单的insert语句的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"主键回填": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自定义主键": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"sql元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"参数": {
"keywords": [],
"children": [
{
"存储过程参数支持": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"resultMap元素": {
"keywords": [],
"children": [
{
"resultMap元素的构成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"级联": {
"keywords": [],
"children": [
{
"MyBatis中的级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"建立POJO": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"配置映射文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"延迟加载": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多对多级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存": {
"keywords": [],
"children": [
{
"一级缓存和二级缓存": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"存储过程": {
"keywords": [],
"children": [
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"游标的使用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态SQL": {
"keywords": [],
"children": [
{
"if元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"bind元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"构建SqlSessionFactory过程": {
"keywords": [],
"children": [
{
"构建Configuration": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession运行过程": {
"keywords": [],
"children": [
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的初始化": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射器": {
"keywords": [],
"children": [
{
"select元素——查询语句": {
"keywords": [],
"children": [
{
"简单的select元素的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递多个参数": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"insert元素——插入语句": {
"keywords": [],
"children": [
{
"简单的insert语句的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"主键回填": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自定义主键": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"sql元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"参数": {
"keywords": [],
"children": [
{
"存储过程参数支持": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"resultMap元素": {
"keywords": [],
"children": [
{
"resultMap元素的构成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"级联": {
"keywords": [],
"children": [
{
"MyBatis中的级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"建立POJO": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"配置映射文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"延迟加载": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多对多级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存": {
"keywords": [],
"children": [
{
"一级缓存和二级缓存": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"存储过程": {
"keywords": [],
"children": [
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"游标的使用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态SQL": {
"keywords": [],
"children": [
{
"if元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"bind元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [
{
"构建SqlSessionFactory过程": {
"keywords": [],
"children": [
{
"构建Configuration": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建映射器的内部组成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构建SqlSessionFactory": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession运行过程": {
"keywords": [],
"children": [
{
"映射器(Mapper)的动态代理": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"SqlSession下的四大对象": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件接口": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的初始化": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"插件的代理和反射设计": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"常用的工具类——MetaObject": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"映射器": {
"keywords": [],
"children": [
{
"select元素——查询语句": {
"keywords": [],
"children": [
{
"简单的select元素的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自动映射和驼峰映射": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"传递多个参数": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用resultMap映射结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"分页参数RowBounds": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"insert元素——插入语句": {
"keywords": [],
"children": [
{
"简单的insert语句的应用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"主键回填": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"自定义主键": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"update元素和delete元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"sql元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"参数": {
"keywords": [],
"children": [
{
"存储过程参数支持": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"特殊字符串的替换和处理(#和$)": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"resultMap元素": {
"keywords": [],
"children": [
{
"resultMap元素的构成": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用map存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用POJO存储结果集": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"级联": {
"keywords": [],
"children": [
{
"MyBatis中的级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"建立POJO": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"配置映射文件": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"延迟加载": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"另一种级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"多对多级联": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存": {
"keywords": [],
"children": [
{
"一级缓存和二级缓存": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"缓存配置项、自定义和引用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"存储过程": {
"keywords": [],
"children": [
{
"IN和OUT参数存储过程": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"游标的使用": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"动态SQL": {
"keywords": [],
"children": [
{
"if元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"choose、when、otherwise元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"trim、where、set元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"foreach元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"用test的属性判断字符串": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"bind元素": {
"keywords": [],
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
"export": []
}
\ No newline at end of file
......@@ -5,13 +5,15 @@
{
"函数式接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"函数描述符": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"第 1 步:记得行为参数化": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第 2 步:使用函数式接口来传递行为": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第 3 步:执行一个行为": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"第 4 步:传递Lambda": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"Predicate": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Consumer": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"Function": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,25 +5,29 @@
{
"类型检查": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"同样的Lambda,不同的函数式接口": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"类型推断": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"使用局部变量": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"管中窥豹": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"构造函数引用": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,19 +5,22 @@
{
"比较器复合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"谓词复合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"函数复合": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
......@@ -5,13 +5,15 @@
{
"积分": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
},
{
"与Java 8的Lambda联系起来": {
"keywords": [],
"children": []
"children": [],
"node_id": "569d5e11c4fc5de7844053d9a733c5e8"
}
}
],
......
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": []
"keywords": [],
"children": [],
"export": []
}
\ No newline at end of file
因为 它太大了无法显示 source diff 。你可以改为 查看blob
# -*- coding: UTF-8 -*-
import importlib
def dispatch(config, options, actions, targets):
''' 分发命令行 action '''
action_len = len(actions)
if action_len < 2:
return
index = 1
next = targets
action = actions[index]
print(f"[命令路由中..]: {actions[0]}")
while action_len >= index:
if type(next) == type({}):
if index == action_len:
if next.get('run') != None:
print(f"[命令路由执行]:", '->'.join(actions))
next['run']()
break
action = actions[index]
if next.get(action) != None:
print(f"[命令路由中..]: {action}")
next = next[action]
index += 1
else:
print("[命令路由错误]: 未找到支持的命令行路由:", '->'.join(actions))
index += 1
else:
print(f"[命令路由执行]:", '->'.join(actions))
next()
index += 1
break
def dispatch_runner(config, options, actions, targets):
''' 分发命令行 action '''
action_len = len(actions)
if action_len < 2:
return
def load_and_run(target):
modules = target.split('.')
class_pos = len(modules)-2
path_pos = len(modules)-1
if class_pos >= 0 and modules[class_pos][0].isupper():
constructor = modules[class_pos]
runner = modules[path_pos]
module_path = '.'.join(modules[:class_pos])
importlib.import_module(module_path).__getattribute__(
constructor)(config, options).__getattribute__(runner)()
else:
runner = modules[path_pos]
module_path = '.'.join(modules[:path_pos])
importlib.import_module(module_path).__getattribute__(
runner)(config, options)
index = 1
next = targets
while action_len >= index:
if type(next) == type({}):
if index == action_len:
if next.get('run') != None:
load_and_run(next['run'])
break
action = actions[index]
if next.get(action) != None:
next = next[action]
index += 1
else:
load_and_run(next)
index += 1
break
# -*- coding: UTF-8 -*-
import os
import logging
import platform
from logging.handlers import RotatingFileHandler
def is_osx():
p = platform.platform()
return p.find('macOS') >= 0 or p.find('Darwin') >= 0
def get_root_log_dir(config, options):
action = 'default'
if options.action:
action = options.action
if is_osx():
return '/tmp/csdn/ai/{}'.format(action)
else:
is_dev = (options.cluster is None) or (options.cluster == 'dev')
if is_dev:
return '../log/csdn/ai/{}'.format(action)
else:
return '/var/csdn/csdn/ai/{}'.format(action)
class TruncatedFileHandler(RotatingFileHandler):
'''
日志文件按固定大小自动分割
'''
def __init__(self, filename, mode='a', maxBytes=0, encoding=None, delay=0):
super(TruncatedFileHandler, self).__init__(
filename, mode, maxBytes, 0, encoding, delay)
def doRollover(self):
"""Truncate the file"""
if self.stream:
self.stream.close()
dfn = self.baseFilename + ".1"
if os.path.exists(dfn):
os.remove(dfn)
os.rename(self.baseFilename, dfn)
os.remove(dfn)
self.mode = 'w'
self.stream = self._open()
def init_log(config, options):
# 创建日志目录
root_log_dir = get_root_log_dir(config, options)
os.makedirs(root_log_dir, exist_ok=True)
print('root_log_dir:', root_log_dir)
# 文件日志控制器
log_filename = root_log_dir+'/app.log'
file_handler = TruncatedFileHandler(log_filename, "w", 10*1024)
# 控制台日志控制器
console_handler = logging.StreamHandler()
# 日志配置
logging.basicConfig(
# 日志格式
format="[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d at %(funcName)s]: %(message)s",
# 日期格式
datefmt='%Y-%m-%d %H:%M:%S',
# 日志级别
level=logging.INFO,
# 输出目标,日志文件+控制台
handlers=[
file_handler,
console_handler
]
)
# -*- coding: UTF-8 -*-
import os
import json
from lib.apollo import ApolloClient
def load_apollo_config(options):
'''
阿波罗配置加载
===
* 如果是 `pro` 环境,则使用线上配置
* 否则,使用内网配置
'''
config_url = None
if options.cluster == 'pro':
config_url = 'http://pro.config.csdn.net:8080'
elif options.cluster == 'fat':
config_url = 'http://fat.config.csdn.net:8080'
elif options.cluster == 'uat':
config_url = 'http://uat.config.csdn.net:8080'
else:
config_url = 'http://dev.config.csdn.net:8080'
client = ApolloClient(
app_id="949",
cluster="default",
config_url=config_url,
start_hot_update=False
)
config = client.get_value("csdn-ai", namespace="application")
return json.loads(config)
def load_config(options, args):
'''
配置加载
===
* 如果本地 config/config 目录下存在配置,则使用本地配置文件
* 如果本地 config/config 目录下不存在配置,
* 默认使用 阿波罗配置中心 cluster=dev 配置
* 如果指定 --cluster,则使用指定 cluster 的阿波罗配置中心的配置
'''
profile_path = "config/config/{}.json".format(options.profile)
config = None
if options.cluster:
config = load_apollo_config(options)
else:
if os.path.exists(profile_path):
with open(profile_path, "r") as f:
config = json.loads(f.read())
else:
# try:
# options.cluster = 'dev'
# config = load_apollo_config(options)
# except:
config = {}
return config
# -*- coding: UTF-8 -*-
import hashlib
import sys
import socket
import logging
import os
import json
import os
import threading
import inspect
import ctypes
import time
import urllib.request
from urllib.error import HTTPError
from urllib import parse
import yaml
# 定义常量
CONFIGURATIONS = "configurations"
NOTIFICATION_ID = "notificationId"
NAMESPACE_NAME = "namespaceName"
# 对时间戳,uri,秘钥进行加签
def signature(timestamp, uri, secret):
import hmac
import base64
string_to_sign = '' + timestamp + '\n' + uri
hmac_code = hmac.new(
secret.encode(), string_to_sign.encode(), hashlib.sha1).digest()
return base64.b64encode(hmac_code).decode()
def url_encode_wrapper(params):
return url_encode(params)
def no_key_cache_key(namespace, key):
return "{}{}{}".format(namespace, len(namespace), key)
# 返回是否获取到的值,不存在则返回None
def get_value_from_dict(namespace_cache, key):
if namespace_cache:
# print(namespace_cache)
kv_data = namespace_cache.get(CONFIGURATIONS)
if kv_data is None:
return None
if key in kv_data:
return kv_data[key]
return None
def init_ip():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 53))
ip = s.getsockname()[0]
return ip
finally:
s.close()
return ""
def http_request(url, timeout, headers={}):
try:
request = urllib.request.Request(url, headers=headers)
res = urllib.request.urlopen(request, timeout=timeout)
body = res.read().decode("utf-8")
return res.code, body
except HTTPError as e:
if e.code == 304:
logging.getLogger(__name__).warning(
"http_request error,code is 304, maybe you should check secret")
return 304, None
logging.getLogger(__name__).warning(
"http_request error,code is %d, msg is %s", e.code, e.msg)
raise e
def url_encode(params):
return parse.urlencode(params)
def makedirs_wrapper(path):
os.makedirs(path, exist_ok=True)
class ApolloClient(object):
def __init__(self, config_url, app_id, cluster='default', secret='', start_hot_update=True,
change_listener=None, config_format='json', refresh=False):
# 核心路由参数
self.config_url = config_url
self.cluster = cluster
self.app_id = app_id
# 非核心参数
self.ip = init_ip()
self.secret = secret
self.config_format = config_format
# 检查参数变量
# 私有控制变量
self._cycle_time = 2
self._stopping = False
self._cache = {}
self._no_key = {}
self._hash = {}
self._pull_timeout = 75
self._cache_file_path = os.path.expanduser('~') + '/data/apollo/cache/'
self._long_poll_thread = None
self._change_listener = change_listener # "add" "delete" "update"
self.refresh = refresh
if self.refresh:
try:
os.remove(self._cache_file_path)
except:
pass
# 私有启动方法
self._path_checker()
# if start_hot_update:
# self._start_hot_update()
# 启动心跳线程
# heartbeat = threading.Thread(target=self._heartBeat)
# heartbeat.setDaemon(True)
# heartbeat.start()
def get_json_from_net(self, namespace='application'):
url = '{}/configs/{}/{}/{}?releaseKey={}&ip={}'.format(
self.config_url,
self.app_id,
self.cluster,
namespace,
"",
self.ip)
try:
print(url)
code, body = http_request(
url, timeout=3, headers=self._signHeaders(url))
# print(code, body)
if code == 200:
data = json.loads(body)
if self.config_format == 'yaml':
data = yaml.load(data["configurations"]
['content'], Loader=yaml.FullLoader)
else:
data = data["configurations"]
# print(data)
return_data = {CONFIGURATIONS: data}
# print('return_data:', return_data)
return return_data
else:
print('http_request error code', code)
return None
except Exception as e:
logging.getLogger(__name__).error(str(e))
return None
def get_value(self, key, default_val=None, namespace='application'):
try:
# 读取内存配置
# print('读取内存配置')
namespace_cache = self._cache.get(namespace)
val = get_value_from_dict(namespace_cache, key)
if val is not None:
# print('get value from cache')
return val
no_key = no_key_cache_key(namespace, key)
if no_key in self._no_key:
# print('get value from no_key_cache_key')
return default_val
# 读取网络配置
# print('读取网络配置')
namespace_data = self.get_json_from_net(namespace)
val = get_value_from_dict(namespace_data, key)
if val is not None:
# print('get_json_from_net:', namespace_cache)
self._update_cache_and_file(namespace_data, namespace)
return val
# 读取文件配置
# print('读取文件配置')
namespace_cache = self._get_local_cache(namespace)
val = get_value_from_dict(namespace_cache, key)
if val is not None:
# print('get_value_from_dict:', namespace_cache)
self._update_cache_and_file(namespace_cache, namespace)
return val
# 如果全部没有获取,则把默认值返回,设置本地缓存为None
# print('如果全部没有获取,则把默认值返回,设置本地缓存为None')
self._set_local_cache_none(namespace, key)
return default_val
except Exception as e:
logging.getLogger(__name__).error("get_value has error, [key is %s], [namespace is %s], [error is %s], ",
key, namespace, e)
return default_val
# 设置某个namespace的key为none,这里不设置default_val,是为了保证函数调用实时的正确性。
# 假设用户2次default_val不一样,然而这里却用default_val填充,则可能会有问题。
def _set_local_cache_none(self, namespace, key):
no_key = no_key_cache_key(namespace, key)
self._no_key[no_key] = key
def _start_hot_update(self):
self._long_poll_thread = threading.Thread(target=self._listener)
# 启动异步线程为守护线程,主线程推出的时候,守护线程会自动退出。
self._long_poll_thread.setDaemon(True)
self._long_poll_thread.start()
def stop(self):
self._stopping = True
logging.getLogger(__name__).info("Stopping listener...")
# 调用设置的回调函数,如果异常,直接try掉
def _call_listener(self, namespace, old_kv, new_kv):
if self._change_listener is None:
return
if old_kv is None:
old_kv = {}
if new_kv is None:
new_kv = {}
try:
for key in old_kv:
new_value = new_kv.get(key)
old_value = old_kv.get(key)
if new_value is None:
# 如果newValue 是空,则表示key,value被删除了。
self._change_listener("delete", namespace, key, old_value)
continue
if new_value != old_value:
self._change_listener("update", namespace, key, new_value)
continue
for key in new_kv:
new_value = new_kv.get(key)
old_value = old_kv.get(key)
if old_value is None:
self._change_listener("add", namespace, key, new_value)
except BaseException as e:
logging.getLogger(__name__).warning(str(e))
def _path_checker(self):
if not os.path.isdir(self._cache_file_path):
makedirs_wrapper(self._cache_file_path)
# 更新本地缓存和文件缓存
def _update_cache_and_file(self, namespace_data, namespace='application'):
# 不使用本地缓存
if self.refresh:
return
# 更新本地缓存
self._cache[namespace] = namespace_data
# 更新文件缓存
new_string = json.dumps(namespace_data)
new_hash = hashlib.md5(new_string.encode('utf-8')).hexdigest()
if self._hash.get(namespace) == new_hash:
pass
else:
with open(os.path.join(self._cache_file_path, '%s_configuration_%s.txt' % (self.app_id, namespace)),
'w') as f:
f.write(new_string)
self._hash[namespace] = new_hash
# 从本地文件获取配置
def _get_local_cache(self, namespace='application'):
cache_file_path = os.path.join(
self._cache_file_path, '%s_configuration_%s.txt' % (self.app_id, namespace))
if os.path.isfile(cache_file_path):
with open(cache_file_path, 'r') as f:
result = json.loads(f.readline())
return result
return {}
def _long_poll(self):
notifications = []
for key in self._cache:
namespace_data = self._cache[key]
notification_id = -1
if NOTIFICATION_ID in namespace_data:
notification_id = self._cache[key][NOTIFICATION_ID]
notifications.append({
NAMESPACE_NAME: key,
NOTIFICATION_ID: notification_id
})
try:
# 如果长度为0直接返回
if len(notifications) == 0:
return
url = '{}/notifications/v2'.format(self.config_url)
params = {
'appId': self.app_id,
'cluster': self.cluster,
'notifications': json.dumps(notifications, ensure_ascii=False)
}
param_str = url_encode_wrapper(params)
url = url + '?' + param_str
code, body = http_request(
url, self._pull_timeout, headers=self._signHeaders(url))
http_code = code
if http_code == 304:
logging.getLogger(__name__).debug('No change, loop...')
return
if http_code == 200:
data = json.loads(body)
for entry in data:
namespace = entry[NAMESPACE_NAME]
n_id = entry[NOTIFICATION_ID]
logging.getLogger(__name__).info(
"%s has changes: notificationId=%d", namespace, n_id)
self._get_net_and_set_local(
namespace, n_id, call_change=True)
return
else:
logging.getLogger(__name__).warning('Sleep...')
except Exception as e:
logging.getLogger(__name__).warning(str(e))
def _get_net_and_set_local(self, namespace, n_id, call_change=False):
namespace_data = self.get_json_from_net(namespace)
namespace_data[NOTIFICATION_ID] = n_id
old_namespace = self._cache.get(namespace)
self._update_cache_and_file(namespace_data, namespace)
if self._change_listener is not None and call_change:
old_kv = old_namespace.get(CONFIGURATIONS)
new_kv = namespace_data.get(CONFIGURATIONS)
self._call_listener(namespace, old_kv, new_kv)
def _listener(self):
logging.getLogger(__name__).info('start long_poll')
while not self._stopping:
self._long_poll()
time.sleep(self._cycle_time)
logging.getLogger(__name__).info("stopped, long_poll")
# 给header增加加签需求
def _signHeaders(self, url):
headers = {}
if self.secret == '':
return headers
uri = url[len(self.config_url):len(url)]
time_unix_now = str(int(round(time.time() * 1000)))
headers['Authorization'] = 'Apollo ' + self.app_id + \
':' + signature(time_unix_now, uri, self.secret)
headers['Timestamp'] = time_unix_now
return headers
def _heartBeat(self):
while not self._stopping:
time.sleep(60 * 10) # 10分钟
for namespace in self._notification_map:
self._do_heartBeat(namespace)
def _do_heartBeat(self, namespace):
release_key = self._release_key_map.get(namespace)
url = '{}/configs/{}/{}/{}?releaseKey={}&ip={}'.format(self.config_url, self.app_id, self.cluster, namespace,
release_key, self.ip)
try:
code, body = http_request(
url, timeout=3, headers=self._signHeaders(url))
if code == 200:
data = json.loads(body)
self._release_key_map[namespace] = data["releaseKey"]
data = data["configurations"]
self._update_cache_and_file(data, namespace)
else:
return None
except Exception as e:
logging.getLogger(__name__).error(str(e))
return None
if __name__ == "__main__":
client = ApolloClient(
app_id="949",
cluster="default",
config_url='http://dev.config.csdn.net:8080',
refresh=True
)
val = client.get_value("csdn-ai", namespace="application")
# print(val)
# -*- coding: UTF-8 -*-
from common.logger import init_log
from config.config import load_config
from options import parse_options, show_help
from tree import gen_tree
def test(config, options, actions):
import test as test
test.dispatch(config, options, actions)
def tree(config, options, actions):
import test as test
gen_tree("../data")
def run(options):
# 操作入口
if options.action is not None:
actions = options.action.split('.')
if len(actions) == 0:
return
print('@init config...')
config = load_config(options, args)
print('')
print('@init log...')
init_log(config, options)
print('')
print('@dispatch action:{}...'.format(options.action))
root_action = actions[0]
next = actions[1:]
dispatch = {
'test': lambda: test(config, options, next),
'tree': lambda: tree(config, options, next)
}
dispatch[root_action]()
else:
show_help()
if __name__ == "__main__":
[options, args] = parse_options()
run(options)
from optparse import OptionParser
def parse_common_options(parser):
'''
## 公共选项
* -t 或者 --tag_id : 某个操作限制到指定tag_id的数据范围
* --reset: 重置选项
* --tag_name: 标签名字
* --model: 模型名字
* --log: 日志级别
* --train: 训练
* --port: 端口
* --show_config: 显示配置
* --count: 指定数量
* --query: 自定义查询
'''
parser.add_option(
"-t", "--tag_id",
dest="tag_id",
help="tag_id",
metavar="TAG_ID"
)
parser.add_option(
"--reset",
dest="reset",
help="reset",
action="store_true",
metavar="RESET"
)
parser.add_option(
"--tag_name",
dest="tag_name",
help="tag_name",
metavar="TAG_NAME"
)
parser.add_option(
"--model",
dest="model",
help="model",
metavar="MODEL"
)
parser.add_option(
"--log",
dest="log",
help="log",
metavar="LOG"
)
parser.add_option(
"--train",
dest="train",
help="train",
action="store_true",
metavar="TRAIN"
)
parser.add_option(
"--port",
dest="port",
help="port",
metavar="PORT"
)
parser.add_option(
"--server",
dest="server",
help="server",
metavar="SERVER"
)
parser.add_option(
"--show_config",
dest="show_config",
help="show_config",
metavar="SHOW_CONFIG"
)
parser.add_option(
"--count",
dest="count",
help="count",
metavar="COUNT"
)
parser.add_option(
"--query",
dest="query",
help="query",
metavar="QUERY"
)
def parse_profile_options(parser):
'''
## 环境配置选项
* -p 或 --profile 指定配置环境,可选的有 `dev`, `fat`, `pre`, `pro`
* 如果本地 config/config 目录下存在配置,则使用本地配置文件
* 如果本地 config/config 目录下不存在配置,
* 默认使用 阿波罗配置中心 cluster=dev 配置
* 如果指定 --cluster,则使用指定 cluster 的阿波罗配置中心的配置
'''
parser.add_option(
"-p", "--profile",
dest="profile",
help="profile",
default='pro',
metavar="PROFILE"
)
parser.add_option(
"--cluster",
dest="cluster",
help="cluster",
metavar="REMOTE"
)
def parse_action_options(parser):
'''
## 操作选项
* -a 或 --action 指定了操作目标,多级目标用点号分割,例如:
* -a dataset.build.tag.all
* -a server.ask
* -a test.code
* 参考[README](./README.md)
'''
parser.add_option(
"-a", "--action",
dest="action",
help="action",
metavar="ACTION"
)
def parse_test_options(parser):
'''
## 测试选项
执行 -a test.xx 测试时默认执行冒烟测试,下面的选项改变行为
* --label 指定执行测试并生成待标注数据
* --count 指定标注上限
'''
parser.add_option(
"--label",
dest="label",
help="label",
action="store_true",
metavar="LABEL"
)
def parse_db_options(parser):
'''
## 数据库 migrate 选项
* --message 传入一个消息变量,db.migrate action 接收此参数
* --revision 传入版本参数,db.upgrade, db.downgrade, db.stamp, db.show, db.edit 接受此参数
'''
parser.add_option(
"--message",
dest="message",
help="message",
metavar="MESSAGE"
)
parser.add_option(
"--revision",
dest="revision",
help="revision",
metavar="REVISION"
)
def parse_options():
parser = OptionParser()
parse_common_options(parser)
parse_profile_options(parser)
parse_action_options(parser)
parse_test_options(parser)
parse_db_options(parser)
(options, args) = parser.parse_args()
return [options, args]
def show_help():
'''
命令行选项说明:
==
'''
help = '\n'.join([
show_help.__doc__,
parse_common_options.__doc__,
parse_profile_options.__doc__,
parse_action_options.__doc__
])
print(help)
......@@ -51,10 +51,17 @@ def gen_tree(data_path):
if os.path.isdir(no_dir):
yield no_dir, no_name
def ensure_node_id(cfg_path, cfg):
if cfg.get('node_id') is None:
cfg['node_id'] = gen_node_id()
dump_json(cfg_path, cfg, exist_ok=True, override=True)
def ensure_id_helper(node):
if node.get('node_id') is None:
node['node_id'] = gen_node_id()
if 'children' in node:
for c in node["children"]:
ensure_id_helper(list(c.values())[0])
def ensure_node_id(cfg_path, cfg):
ensure_id_helper(cfg)
dump_json(cfg_path, cfg, exist_ok=True, override=True)
def make_node(name, node_id, keywords, children=None):
node = {}
......@@ -89,6 +96,8 @@ def gen_tree(data_path):
level_name, cfg['node_id'], cfg['keywords'])
tree_node['children'].append(level_node)
# 章节点
for chapter_no_dir, chapter_no_name in list_dir(level_no_dir):
no, chapter_name = parse_no_name(chapter_no_name)
......@@ -104,8 +113,8 @@ def gen_tree(data_path):
for section_no_dir, section_no_name in list_dir(chapter_no_dir):
no, section_name = parse_no_name(section_no_name)
cfg_path = os.path.join(section_no_dir, 'config.json')
ensure_node_id(cfg_path, cfg)
cfg = load_json(cfg_path)
ensure_node_id(cfg_path, cfg)
section_node, section_node_children = make_node(
section_name, cfg['node_id'], cfg['keywords'], cfg['children'])
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册