MySql數(shù)據(jù)庫(kù)列表數(shù)據(jù)分頁(yè)查詢、全文檢索API零代碼實(shí)現(xiàn)
數(shù)據(jù)條件查詢和分頁(yè)
前面文檔主要介紹了元數(shù)據(jù)配置,包括表單定義和表關(guān)系管理,以及表單數(shù)據(jù)的錄入,本文主要介紹數(shù)據(jù)查詢和分頁(yè)在crudapi中的實(shí)現(xiàn)。
概要
數(shù)據(jù)查詢API
數(shù)據(jù)查詢主要是指按照輸入條件檢索出符合要求的數(shù)據(jù)列表,如果數(shù)據(jù)量大的情況下,需要考慮分頁(yè)。?
?API為/api/business/{name},其中name為對(duì)象名稱復(fù)數(shù)形式(兼容對(duì)象名稱),查詢參數(shù)如下:
參數(shù)類型描述selectstring選擇查詢需要的字段和關(guān)聯(lián)子表,默認(rèn)查詢?nèi)孔侄魏完P(guān)聯(lián)子表expandstring選擇需要展開(kāi)的關(guān)聯(lián)主表,默認(rèn)關(guān)聯(lián)主表字段只查詢id和namesearchstring全文檢索關(guān)鍵字,通過(guò)內(nèi)置的系統(tǒng)字段全文索引fullTextBody實(shí)現(xiàn)filterstring智能查詢條件,格式為Condition對(duì)象JSON序列化后的字符串orderbystring排序方式,ASC和DESCoffsetint32分頁(yè)開(kāi)始位置limitint32每頁(yè)數(shù)量字段1Object最終轉(zhuǎn)換成mysql中=操作符字段2Object最終轉(zhuǎn)換成mysql中=操作符......Object最終轉(zhuǎn)換成mysql中=操作符
字段1,字段2,...之間的關(guān)系為并且AND關(guān)系
查詢客戶
字段查詢
?客戶customer一共錄入四條數(shù)據(jù)
?分別通過(guò)名稱、手機(jī)、郵箱、會(huì)員卡號(hào)進(jìn)行查詢,請(qǐng)求url如下: https://demo.crudapi.cn/api/business/customer?offset=0&limit=10&name=劉禪&mobile=13088889999&[email protected]&membershipNo=VIP000000004 查到客戶劉禪
全文檢索
?通過(guò)關(guān)鍵字“劉”對(duì)客戶表全文檢索,請(qǐng)求url如下: https://demo.crudapi.cn/api/business/customer?offset=0&limit=10&search=劉
查到客戶劉禪和劉備,具體原理如下:表單中所啟用了“可查詢”屬性的字段最終拼接成一個(gè)全文檢索文本fullTextBody,在插入數(shù)據(jù)和更新數(shù)據(jù)的時(shí)候及時(shí)更新,這樣就可以利用mysql全文檢索功能實(shí)現(xiàn)關(guān)鍵字查詢, 最終轉(zhuǎn)成SQL語(yǔ)句如下:
SELECT * FROM `ca_customer`
WHERE ((MATCH(`fullTextBody`) AGAINST('張*' IN BOOLEAN MODE)))
ORDER BY id DESC LIMIT 0, 10
?類似的,通過(guò)關(guān)鍵字“l(fā)iu”對(duì)客戶表全文檢索,通過(guò)郵箱匹配,也可以查詢數(shù)據(jù)。
智能查詢?cè)?/h5>
定義接口條件Condition,葉子條件LeafCondition繼承Condition,組合條件CompositeCondition條件繼承Condition,CompositeCondition由多個(gè)Condition組合而成,通過(guò)AND和OR兩種運(yùn)算可以實(shí)現(xiàn)任何形式的復(fù)雜查詢條件,這樣就利用組合模式實(shí)現(xiàn)了智能查詢,
public enum OperatorTypeEnum {
EQ,
NE,
LIKE,
IN,
INSELECT,
SEARCH,
GE,
GT,
LE,
LT,
BETWEEN
}
數(shù)據(jù)庫(kù)查詢操作符包括等于、大于、LIKE等
@JsonPropertyOrder(alphabetic = true)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY,property = "name")
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = CompositeCondition.class, name = "C"),
@JsonSubTypes.Type(value = LeafCondition.class, name = "L")
})
public interface Condition {
String toQuerySql();
List<Object> toQueryValues();
}
條件接口
@JsonPropertyOrder(alphabetic = true)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class LeafCondition implements Condition {
private String name = "L";
private String columnName;
@JsonProperty("operatorType")
private OperatorTypeEnum operatorType;
@JsonProperty("values")
private List<Object> valueList = new ArrayList<Object>();
}
葉子條件
@JsonPropertyOrder(alphabetic = true)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class CompositeCondition implements Condition {
private String name = "C";
@JsonProperty("conditionType")
private ConditionTypeEnum conditionType = ConditionTypeEnum.AND;
@JsonProperty("conditions")
private List<Condition> conditionList = new ArrayList<Condition>();
}
組合條件
#
智能查詢驗(yàn)證
Postman驗(yàn)證,首先溝通mobile等于13622228888的葉子條件如下:
{
"name": "L",
"columnName": "mobile"
"operatorType": "EQ",
"values": ["13622228888"]
}
序列化值為:
{"name":"L","columnName":"mobile","operatorType":"EQ","values":["13622228888"]}
通過(guò)encodeURIComponent編碼之后為:
%7B%22name%22%3A%22L%22%2C%22columnName%22%3A%22mobile%22%2C%22operatorType%22%3A%22EQ%22%2C%22values%22%3A%5B%2213622228888%22%5D%7D
?最終查詢到客戶關(guān)羽,因?yàn)槭謾C(jī)號(hào)滿足條件。類似的,可以構(gòu)造更復(fù)雜的組合條件。
#
字段選擇select
?默認(rèn)情況下會(huì)選擇所有字段,select如果不指定表示所有的意思
?如果指定了字段,就查詢部分字段,比如只查詢id,name和mobile,其它字段和子表profile就不需要查詢了,這樣可以節(jié)約時(shí)間和數(shù)據(jù)大小。
關(guān)聯(lián)表擴(kuò)展expand
?子主關(guān)系中,默認(rèn)只查詢主表id和name,避免主表查詢層次太深。
?如果指定expand關(guān)聯(lián)對(duì)象名稱,就查詢主表所有字段,適用不需要延時(shí)加載的場(chǎng)景,比如查詢客戶資料時(shí)候一起查詢客戶customer完整信息。
小結(jié)
本文介紹了列表查詢API所有的參數(shù),包括智能查詢、全文檢索以及字段選擇等。crudapi系統(tǒng)通過(guò)配置的方式實(shí)現(xiàn)了對(duì)象的查詢和分頁(yè)。
附demo演示
本系統(tǒng)屬于產(chǎn)品級(jí)的零代碼平臺(tái),不同于自動(dòng)代碼生成器,不需要生成Controller、Service、Repository、Entity等業(yè)務(wù)代碼,程序運(yùn)行起來(lái)就可以使用,真正0代碼,可以覆蓋基本的和業(yè)務(wù)無(wú)關(guān)的CRUD RESTful API。
官網(wǎng)地址:https://crudapi.cn
測(cè)試地址:https://demo.crudapi.cn/crudapi/login
