2021SC@SDUSC
Config是什么?微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的!
上图所示,假如有三个配置文件,然后每一个配置文件都连接了数据库(同一个),这个时候如果我要换一个数据库使用,那么就要将所有配置文件中的配置进行替换,这个时候我们就可以使用 Config Server 来进行统一配置,这样在我们管理的时候也会比较简单!
我们来看AbstractSQLConfig第一部
1.
PATTERN_RANGE = Pattern.compile("^[0-9%,!=\<\>/\.\+\-\*\^]+$");
// ^[a-zA-Z0-9_*%!=<>(),"]+$ 导致 exists(select*from(Comment)) 通过!
PATTERN_FUNCTION = Pattern.compile("^[A-Za-z0-9%,:_@&~!=\<\>\|\[\]\{\} /\.\+\-\*\^\?\$]+$");
//TODO 改成更好的正则,校验前面为单词,中间为操作符,后面为值
凡是 SQL 边界符、分隔符、注释符 都不允许,例如 ' " ` ( ) ; # -- ,以免拼接 SQL 时被注入意外可执行指令
这里用到了 java.util.regex.Pattern
Pattern.compile函数语法
Pattern Pattern.compile(String regex, int flag)
知识学习
Pattern.compile函数中两个参数
1、regex 表示定义的规则
2、flag 表示设置的参数类型,主要包含以下几种情况:
(1)Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。让表达式忽略大小写进行匹配。
(2)Pattern.COMMENTS(?x) 此种模式下,匹配时会忽略表达式中空格字符(表达式里的空格,tab,回车)。注释从#开始,一直到这行结束。
(3)Pattern.UNIX_LINES(?d) 此种模式下,只有’n’才被认作一行的中止,并且与’.’,’^’,以及’$’进行匹配。
(4)Pattern.MULTILINE(?m) 此种模式下,上箭头和单引号分别匹配一行的开始和结束。此外,’^‘仍然匹配字符串的开始,’’也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
(5)Pattern.DOTALL:此种模式下,表达式’.‘可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.'不匹配行的结束符。
实现的功能是对字符串进行截取,排除SQL 边界符、分隔符、注释符的情况
2.
TABLE_KEY_MAP = new HashMap(); TABLE_KEY_MAP.put(Table.class.getSimpleName(), Table.TABLE_NAME); TABLE_KEY_MAP.put(Column.class.getSimpleName(), Column.TABLE_NAME); TABLE_KEY_MAP.put(PgClass.class.getSimpleName(), PgClass.TABLE_NAME); TABLE_KEY_MAP.put(PgAttribute.class.getSimpleName(), PgAttribute.TABLE_NAME); TABLE_KEY_MAP.put(SysTable.class.getSimpleName(), SysTable.TABLE_NAME); TABLE_KEY_MAP.put(SysColumn.class.getSimpleName(), SysColumn.TABLE_NAME); TABLE_KEY_MAP.put(ExtendedProperty.class.getSimpleName(), ExtendedProperty.TABLE_NAME);
此处用到了java.util.HashMap;
知识学习
HashMap是我们最常用的类之一,它实现了hash算法
HashMap存储的是key-value形式的键值对,这个键值对在实现中使用一个静态内部类Entry来表示,它存储了key、value、hash值、以及在hash冲突时链表中下一个元素的引用。
HashMap底层实现使用了一个数组来存储元素。它的初始容量默认是16,而且必须容量必须是2的整数次幂,最大容量是1<<30(10.7亿+),同时还使用一个加载因子(load factor)来控制这个map的这个hash表的扩容,默认为0.75,即当容量达到初始容量3/4时会扩容(当然不只这样,后面会说明)。
在往HashMap中添加元素时,会计算key的hashCode,然后基于这个hashCode和数组大小来确定它在数组中的存储位置,当遇到hash冲突时,会以链表的形式存储在数组中。
简介put(key, value)方法的执行过程:
通过key值,使用散列算法计算出来一个hash值,用来确定该元素需要存储到数组中的哪个位置(index)。
根据计算出来的位置(index),可以查看该位置是否被占用:
如果位置(index)未被占用,将(keyvalue)封装成一个节点,保存到该位置。
如果位置(index)被占用,使用key和链表中的节点一一比较:
---->如果链表中不存在该key,将(key/value)封装成节点添加到该链表中。
---->如果链表中已存在该key,替换该key对应节点的value值。
上图代码中使用的put方法将键值对加入到Map中,
如果key在Map中已经存在,则会被替换并且返回这个旧值,不存在则返回null
V put(K key, V value);
在本项目代码中使用的意义在于将方法名和值对应起来
如Table.class.getSimpleName()=Table.TABLE_NAME
3.
CONFIG_TABLE_LIST = new ArrayList<>(); // Table, Column 等是系统表 AbstractVerifier.SYSTEM_ACCESS_MAP.keySet()); CONFIG_TABLE_LIST.add(Function.class.getSimpleName()); CONFIG_TABLE_LIST.add(Request.class.getSimpleName()); CONFIG_TABLE_LIST.add(Response.class.getSimpleName()); CONFIG_TABLE_LIST.add(Access.class.getSimpleName()); CONFIG_TABLE_LIST.add(document.class.getSimpleName()); CONFIG_TABLE_LIST.add(TestRecord.class.getSimpleName()); DATAbase_LIST = new ArrayList<>(); DATAbase_LIST.add(DATAbase_MYSQL); DATAbase_LIST.add(DATAbase_POSTGRESQL); DATAbase_LIST.add(DATAbase_SQLSERVER); DATAbase_LIST.add(DATAbase_ORACLE); DATAbase_LIST.add(DATAbase_DB2); DATAbase_LIST.add(DATAbase_CLICKHOUSE);
这里用到了java.util.ArrayList;
知识学习
数组和数组列表之间有着重大的区别。数组是 Java 语言的一个特征,对于每个元素类型 T ,都有数组类型 T[]; 然而, ArrayList 类是个定义 java.util 包中的类库。这是一个存放 object 类型元素的 " 普通性 " 的类型。要注意的是,要从数组列表中提取元素时,需要进行类型转换。
使用 add 方法可以向数组列表中添加新元素:
ArrayList staff = new ArrayList();
staff.add(new Employee(....));
staff.add(new Employee(....));
在该段代码中,是向CONFIG_TABLE_LIST和DATAbase_LIST中添加数据
这里需要一提的是
public abstract class AbstractSQLConfig implements SQLConfig
该类实现SQLConfig接口
这里放上SQLConfig的代码
package apijson.orm;
import java.util.List;
import java.util.Map;
import apijson.NotNull;
import apijson.RequestMethod;
import apijson.RequestRole;
public interface SQLConfig {
String DATAbase_MYSQL = "MYSQL";
String DATAbase_POSTGRESQL = "POSTGRESQL";
String DATAbase_SQLSERVER = "SQLSERVER";
String DATAbase_ORACLE = "ORACLE";
String DATAbase_DB2 = "DB2";
String DATAbase_CLICKHOUSE = "CLICKHOUSE";
String SCHEMA_INFORMATION = "information_schema"; //MySQL, PostgreSQL, SQL Server 都有的系统模式
String SCHEMA_SYS = "sys"; //SQL Server 系统模式
String TABLE_SCHEMA = "table_schema";
String TABLE_NAME = "table_name";
int TYPE_CHILD = 0;
int TYPE_ITEM = 1;
int TYPE_ITEM_CHILD_0 = 2;
boolean isMySQL();
boolean isPostgreSQL();
boolean isSQLServer();
boolean isOracle();
boolean isDb2();
boolean isClickHouse();
//暂时只兼容以上 5 种
// boolean isSQL();
// boolean isTSQL();
// boolean isPLSQL();
// boolean isAnsiSQL();
boolean limitSQLCount(); //用来给 Table, Column 等系统属性表来绕过 MAX_SQL_COUNT 等限制
@NotNull
String getIdKey();
@NotNull
String getUserIdKey();
String getDBVersion();
String getDBUri();
String getDBAccount();
String getDBPassword();
String getSQL(boolean prepared) throws Exception;
boolean isTest();
SQLConfig setTest(boolean test);
int getType();
SQLConfig setType(int type);
int getCount();
SQLConfig setCount(int count);
int getPage();
SQLConfig setPage(int page);
int getQuery();
SQLConfig setQuery(int query);
int getPosition();
SQLConfig setPosition(int position);
int getCache();
SQLConfig setCache(int cache);
boolean isExplain();
SQLConfig setExplain(boolean explain);
RequestMethod getMethod();
SQLConfig setMethod(RequestMethod method);
Object getId();
SQLConfig setId(Object id);
RequestRole getRole();
SQLConfig setRole(RequestRole role); // TODO 提供 String 类型的,方便扩展
public boolean isDistinct();
public SQLConfig setDistinct(boolean distinct);
String getDatabase();
SQLConfig setDatabase(String database);
String getSchema();
SQLConfig setSchema(String schema);
String getDatasource();
SQLConfig setDatasource(String datasource);
String getQuote();
String getTable();
String getSQLTable();
String getTablePath();
List getRaw();
SQLConfig setRaw(List raw);
SQLConfig setTable(String table);
String getGroup();
SQLConfig setGroup(String group);
String getHaving();
SQLConfig setHaving(String having);
String getOrder();
SQLConfig setOrder(String order);
List getJson();
SQLConfig setJson(List json);
Subquery getFrom();
SQLConfig setFrom(Subquery from);
List getColumn();
SQLConfig setColumn(List column);
List> getValues();
SQLConfig setValues(List> values);
Map getContent();
SQLConfig setContent(Map content);
Map getWhere();
SQLConfig setWhere(Map where);
Map> getCombine();
SQLConfig setCombine(Map> combine);
Object getWhere(String key);
Object getWhere(String key, boolean exactMatch);
SQLConfig putWhere(String key, Object value, boolean prior);
boolean isPrepared();
SQLConfig setPrepared(boolean prepared);
boolean isMain();
SQLConfig setMain(boolean main);
List
在AbstractSQLConfig中用到的部分代码在SQLConfig已经定义好,对其方法进行了实现。
4.
RAW_MAP = new linkedHashMap<>(); // 保证顺序,避免配置冲突等意外情况
SQL_FUNCTION_MAP = new linkedHashMap<>(); // 保证顺序,避免配置冲突等意外情况
// MySQL 字符串函数
SQL_FUNCTION_MAP.put("ascii", ""); // ASCIi(s) 返回字符串 s 的第一个字符的 ASCII 码。
SQL_FUNCTION_MAP.put("char_length", ""); // CHAR_LENGTH(s) 返回字符串 s 的字符数
SQL_FUNCTION_MAP.put("character_length", ""); // CHARACTER_LENGTH(s) 返回字符串 s 的字符数
SQL_FUNCTION_MAP.put("concat", ""); // CONCAt(s1, s2...sn) 字符串 s1,s2 等多个字符串合并为一个字符串
SQL_FUNCTION_MAP.put("concat_ws", ""); // CONCAT_Ws(x, s1, s2...sn) 同 CONCAt(s1, s2 ...) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
SQL_FUNCTION_MAP.put("field", ""); // FIELD(s, s1, s2...) 返回第一个字符串 s 在字符串列表 (s1, s2...)中的位置
SQL_FUNCTION_MAP.put("find_in_set", ""); // FIND_IN_SET(s1, s2) 返回在字符串s2中与s1匹配的字符串的位置
SQL_FUNCTION_MAP.put("format", ""); // FORMAT(x, n) 函数可以将数字 x 进行格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入。
SQL_FUNCTION_MAP.put("insert", ""); // INSERT(s1, x, len, s2) 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
SQL_FUNCTION_MAP.put("locate", ""); // LOCATE(s1, s) 从字符串 s 中获取 s1 的开始位置
SQL_FUNCTION_MAP.put("lcase", ""); // LCASE(s) 将字符串 s 的所有字母变成小写字母
SQL_FUNCTION_MAP.put("left", ""); // LEFt(s, n) 返回字符串 s 的前 n 个字符
SQL_FUNCTION_MAP.put("length", ""); // LENGTH(s) 返回字符串 s 的字符数
SQL_FUNCTION_MAP.put("lower", ""); // LOWER(s) 将字符串 s 的所有字母变成小写字母
SQL_FUNCTION_MAP.put("lpad", ""); // LPAd(s1, len, s2) 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len
SQL_FUNCTION_MAP.put("ltrim", ""); // LTRIm(s) 去掉字符串 s 开始处的空格
SQL_FUNCTION_MAP.put("mid", ""); // MId(s, n, len) 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRINg(s, n, len)
SQL_FUNCTION_MAP.put("position", ""); // POSITION(s, s1); 从字符串 s 中获取 s1 的开始位置
SQL_FUNCTION_MAP.put("repeat", ""); // REPEAT(s, n) 将字符串 s 重复 n 次
SQL_FUNCTION_MAP.put("replace", ""); // REPLACE(s, s1, s2) 将字符串 s2 替代字符串 s 中的字符串 s1
SQL_FUNCTION_MAP.put("reverse", ""); // REVERSe(s); // ) 将字符串s的顺序反过来
SQL_FUNCTION_MAP.put("right", ""); // RIGHt(s, n) 返回字符串 s 的后 n 个字符
SQL_FUNCTION_MAP.put("rpad", ""); // RPAD(s1, len, s2) 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len
SQL_FUNCTION_MAP.put("rtrim", ""); // RTRIM", ""); // ) 去掉字符串 s 结尾处的空格
SQL_FUNCTION_MAP.put("space", ""); // SPACe(n) 返回 n 个空格
SQL_FUNCTION_MAP.put("strcmp", ""); // STRCMP(s1, s2) 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1d2 之间相隔的天数
SQL_FUNCTION_MAP.put("date_add", ""); // DATE_ADD(d,INTERVAL expr type) 计算起始日期 d 加上一个时间段后的日期
SQL_FUNCTION_MAP.put("date_format", ""); // DATE_FORMAT(d,f) 按表达式 f的要求显示日期 d
SQL_FUNCTION_MAP.put("date_sub", ""); // DATE_SUB(date,INTERVAL expr type) 函数从日期减去指定的时间间隔。
SQL_FUNCTION_MAP.put("day", ""); // DAY(d) 返回日期值 d 的日期部分
SQL_FUNCTION_MAP.put("dayname", ""); // DAYNAME(d) 返回日期 d 是星期几,如 Monday,Tuesday
SQL_FUNCTION_MAP.put("dayofmonth", ""); // DAYOFMonTH(d) 计算日期 d 是本月的第几天
SQL_FUNCTION_MAP.put("dayofweek", ""); // DAYOFWEEK(d) 日期 d 今天是星期几,1 星期日,2 星期一,以此类推
SQL_FUNCTION_MAP.put("dayofyear", ""); // DAYOFYEAR(d) 计算日期 d 是本年的第几天
SQL_FUNCTION_MAP.put("extract", ""); // EXTRACT(type FROM d) 从日期 d 中获取指定的值,type 指定返回的值。
SQL_FUNCTION_MAP.put("from_days", ""); // FROM_DAYS(n) 计算从 0000 年 1 月 1 日开始 n 天后的日期
SQL_FUNCTION_MAP.put("hour", ""); // 'HOUR(t) 返回 t 中的小时值
SQL_FUNCTION_MAP.put("last_day", ""); // LAST_DAY(d) 返回给给定日期的那一月份的最后一天
SQL_FUNCTION_MAP.put("localtime", ""); // LOCALTIME() 返回当前日期和时间
SQL_FUNCTION_MAP.put("localtimestamp", ""); // LOCALTIMESTAMP() 返回当前日期和时间
SQL_FUNCTION_MAP.put("makedate", ""); // MAKEDATE(year, day-of-year) 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期
SQL_FUNCTION_MAP.put("maketime", ""); // MAKETIME(hour, minute, second) 组合时间,参数分别为小时、分钟、秒
SQL_FUNCTION_MAP.put("microsecond", ""); // MICROSECOND(date) 返回日期参数所对应的微秒数
SQL_FUNCTION_MAP.put("minute", ""); // MINUTE(t) 返回 t 中的分钟值
SQL_FUNCTION_MAP.put("monthname", ""); // MonTHNAME(d) 返回日期当中的月份名称,如 November
SQL_FUNCTION_MAP.put("month", ""); // MonTH(d) 返回日期d中的月份值,1 到 12
SQL_FUNCTION_MAP.put("now", ""); // NOW() 返回当前日期和时间
SQL_FUNCTION_MAP.put("period_add", ""); // PERIOD_ADD(period, number) 为 年-月 组合日期添加一个时段
SQL_FUNCTION_MAP.put("period_diff", ""); // PERIOD_DIFF(period1, period2) 返回两个时段之间的月份差值
SQL_FUNCTION_MAP.put("quarter", ""); // QUARTER(d) 返回日期d是第几季节,返回 1 到 4
SQL_FUNCTION_MAP.put("second", ""); // SECOND(t) 返回 t 中的秒钟值
SQL_FUNCTION_MAP.put("sec_to_time", ""); // SEC_TO_TIME", ""); // ) 将以秒为单位的时间 s 转换为时分秒的格式
SQL_FUNCTION_MAP.put("str_to_date", ""); // STR_TO_DATE", ""); // tring, format_mask) 将字符串转变为日期
SQL_FUNCTION_MAP.put("subdate", ""); // SUBDATE(d,n) 日期 d 减去 n 天后的日期
SQL_FUNCTION_MAP.put("subtime", ""); // SUBTIME(t,n) 时间 t 减去 n 秒的时间
SQL_FUNCTION_MAP.put("sysdate", ""); // SYSDATE() 返回当前日期和时间
SQL_FUNCTION_MAP.put("time", ""); // TIME(expression) 提取传入表达式的时间部分
SQL_FUNCTION_MAP.put("time_format", ""); // TIME_FORMAT(t,f) 按表达式 f 的要求显示时间 t
SQL_FUNCTION_MAP.put("time_to_sec", ""); // TIME_TO_SEC(t) 将时间 t 转换为秒
SQL_FUNCTION_MAP.put("timediff", ""); // TIMEDIFF(time1, time2) 计算时间差值
SQL_FUNCTION_MAP.put("timestamp", ""); // TIMESTAMP(expression, interval) 单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和
SQL_FUNCTION_MAP.put("to_days", ""); // TO_DAYS(d) 计算日期 d 距离 0000 年 1 月 1 日的天数
SQL_FUNCTION_MAP.put("week", ""); // WEEK(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53
SQL_FUNCTION_MAP.put("weekday", ""); // WEEKDAY(d) 日期 d 是星期几,0 表示星期一,1 表示星期二
SQL_FUNCTION_MAP.put("weekofyear", ""); // WEEKOFYEAR(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53
SQL_FUNCTION_MAP.put("year", ""); // YEAR(d) 返回年份
SQL_FUNCTION_MAP.put("yearweek", ""); // YEARWEEK(date, mode) 返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
SQL_FUNCTION_MAP.put("unix_timestamp", ""); // UNIX_TIMESTAMP(date) 获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数
SQL_FUNCTION_MAP.put("from_unixtime", ""); // FROM_UNIXTIME(date) 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数
// MYSQL JSON 函数
SQL_FUNCTION_MAP.put("json_append", ""); // JSON_APPEND(json_doc, path, val[, path, val] ...)) 插入JSON数组
SQL_FUNCTION_MAP.put("json_array", ""); // JSON_ARRAY(val1, val2...) 创建JSON数组
SQL_FUNCTION_MAP.put("json_array_append", ""); // JSON_ARRAY_APPEND(json_doc, val) 将数据附加到JSON文档
SQL_FUNCTION_MAP.put("json_array_insert", ""); // JSON_ARRAY_INSERT(json_doc, val) 插入JSON数组
SQL_FUNCTION_MAP.put("json_contains", ""); // JSON_ConTAINS(json_doc, val) JSON文档是否在路径中包含特定对象
SQL_FUNCTION_MAP.put("json_contains_path", ""); // JSON_CONTAINS_PATH(json_doc, path) JSON文档是否在路径中包含任何数据
SQL_FUNCTION_MAP.put("json_depth", ""); // JSON_DEPTH(json_doc) JSON文档的最大深度
SQL_FUNCTION_MAP.put("json_extract", ""); // JSON_EXTRACT(json_doc, path) 从JSON文档返回数据
SQL_FUNCTION_MAP.put("json_insert", ""); // JSON_INSERT(json_doc, val) 将数据插入JSON文档
SQL_FUNCTION_MAP.put("json_keys", ""); // JSON_KEYS(json_doc[, path]) JSON文档中的键数组
SQL_FUNCTION_MAP.put("json_length", ""); // JSON_LENGTH(json_doc) JSON文档中的元素数
SQL_FUNCTION_MAP.put("json_merge", ""); // JSON_MERGE(json_doc1, json_doc2) (已弃用) 合并JSON文档,保留重复的键。JSON_MERGE_PRESERVE()的已弃用同义词
SQL_FUNCTION_MAP.put("json_merge_patch", ""); // JSON_MERGE_PATCH(json_doc1, json_doc2) 合并JSON文档,替换重复键的值
SQL_FUNCTION_MAP.put("json_merge_preserve", ""); // JSON_MERGE_PRESERVE(json_doc1, json_doc2) 合并JSON文档,保留重复的键
SQL_FUNCTION_MAP.put("json_object", ""); // JSON_OBJECT(key1, val1, key2, val2...) 创建JSON对象
SQL_FUNCTION_MAP.put("json_overlaps", ""); // JSON_OVERLAPS(json_doc1, json_doc2) (引入8.0.17) 比较两个JSON文档,如果它们具有相同的键值对或数组元素,则返回TRUE(1),否则返回FALSE(0)
SQL_FUNCTION_MAP.put("json_pretty", ""); // JSON_PRETTY(json_doc) 以易于阅读的格式打印JSON文档
SQL_FUNCTION_MAP.put("json_quote", ""); // JSON_QUOTE(json_doc1) 引用JSON文档
SQL_FUNCTION_MAP.put("json_remove", ""); // JSON_REMOVE(json_doc1, path) 从JSON文档中删除数据
SQL_FUNCTION_MAP.put("json_replace", ""); // JSON_REPLACE(json_doc1, val1, val2) 替换JSON文档中的值
SQL_FUNCTION_MAP.put("json_schema_valid", ""); // JSON_SCHEMA_VALID(json_doc) (引入8.0.17) 根据JSON模式验证JSON文档;如果文档针对架构进行验证,则返回TRUE / 1;否则,则返回FALSE / 0
SQL_FUNCTION_MAP.put("json_schema_validation_report", ""); // JSON_SCHEMA_VALIDATION_REPORT(json_doc, mode) (引入8.0.17) 根据JSON模式验证JSON文档;以JSON格式返回有关验证结果的报告,包括成功或失败以及失败原因
SQL_FUNCTION_MAP.put("json_search", ""); // JSON_SEARCH(json_doc, val) JSON文档中值的路径
SQL_FUNCTION_MAP.put("json_set", ""); // JSON_SET(json_doc, val) 将数据插入JSON文档
// SQL_FUNCTION_MAP.put("json_storage_free", ""); // JSON_STORAGE_FREE() 部分更新后,JSON列值的二进制表示形式中的可用空间
// SQL_FUNCTION_MAP.put("json_storage_size", ""); // JSON_STORAGE_SIZE() 用于存储JSON文档的二进制表示的空间
SQL_FUNCTION_MAP.put("json_table", ""); // JSON_TABLE() 从JSON表达式返回数据作为关系表
SQL_FUNCTION_MAP.put("json_type", ""); // JSON_TYPE(json_doc) JSON值类型
SQL_FUNCTION_MAP.put("json_unquote", ""); // JSON_UNQUOTE(json_doc) 取消引用JSON值
SQL_FUNCTION_MAP.put("json_valid", ""); // JSON_VALID(json_doc) JSON值是否有效
SQL_FUNCTION_MAP.put("json_arrayagg", ""); // JSON_ARRAYAGG(key) 将每个表达式转换为 JSON 值,然后返回一个包含这些 JSON 值的 JSON 数组
SQL_FUNCTION_MAP.put("json_objectagg", ""); // JSON_OBJECTAGG(key, val)) 将每个表达式转换为 JSON 值,然后返回一个包含这些 JSON 值的 JSON 对象
// MySQL 高级函数
// SQL_FUNCTION_MAP.put("bin", ""); // BIn(x) 返回 x 的二进制编码
// SQL_FUNCTION_MAP.put("binary", ""); // BINARY(s) 将字符串 s 转换为二进制字符串
SQL_FUNCTION_MAP.put("case", ""); // CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
SQL_FUNCTION_MAP.put("cast", ""); // CAST(x AS type) 转换数据类型
SQL_FUNCTION_MAP.put("coalesce", ""); // COALESCE(expr1, expr2, ...., expr_n) 返回参数中的第一个非空表达式(从左向右)
// SQL_FUNCTION_MAP.put("conv", ""); // CONv(x,f1,f2) 返回 f1 进制数变成 f2 进制数
// SQL_FUNCTION_MAP.put("convert", ""); // ConVERT(s, cs) 函数将字符串 s 的字符集变成 cs
SQL_FUNCTION_MAP.put("if", ""); // IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
SQL_FUNCTION_MAP.put("ifnull", ""); // IFNULL(v1,v2) 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
SQL_FUNCTION_MAP.put("isnull", ""); // ISNULL(expression) 判断表达式是否为 NULL
SQL_FUNCTION_MAP.put("nullif", ""); // NULLIF(expr1, expr2) 比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1
SQL_FUNCTION_MAP.put("group_concat", ""); // GROUP_CONCAt([DISTINCT], s1, s2...)
本段代码是将MySQL 字符串函数、MySQL 数字函数、MySQL 时间与日期函数、MYSQL JSON 函数放入SQL_FUNCTION_MAP中。
以上就是本周对AbstractSQLConfig部分代码的分析。



