栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

APIJSON 博客2 AbstractSQLConfig 第二篇

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

APIJSON 博客2 AbstractSQLConfig 第二篇

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 getPreparedValueList();
	SQLConfig setPreparedValueList(List preparedValueList);


	String getAlias();

	SQLConfig setAlias(String alias);

	String getWhereString(boolean hasPrefix) throws Exception;

	String getRawSQL(String key, Object value) throws Exception;

	boolean isKeyPrefix();

	SQLConfig setKeyPrefix(boolean keyPrefix);


	List getJoinList();

	SQLConfig setJoinList(List joinList);

	boolean hasJoin();


	String getSubqueryString(Subquery subquery) throws Exception;

	SQLConfig setProcedure(String procedure);


} 

在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部分代码的分析。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号