前面文檔主要介紹了元數據配置,包括表單定義和表關係管理,以及表單數據的錄入,本文主要介紹數據查詢和分頁在crudapi中的實現。javascript
數據查詢主要是指按照輸入條件檢索出符合要求的數據列表,若是數據量大的狀況下,須要考慮分頁。
API爲/api/business/{name},其中name爲對象名稱複數形式(兼容對象名稱),查詢參數以下:java
參數 | 類型 | 描述 |
---|---|---|
select | string | 選擇查詢須要的字段和關聯子表,默認查詢所有字段和關聯子表 |
expand | string | 選擇須要展開的關聯主表,默認關聯主表字段只查詢id和name |
search | string | 全文檢索關鍵字,經過內置的系統字段全文索引fullTextBody實現 |
filter | string | 智能查詢條件,格式爲Condition對象JSON序列化後的字符串 |
orderby | string | 排序方式,ASC和DESC |
offset | int32 | 分頁開始位置 |
limit | int32 | 每頁數量 |
字段1 | Object | 最終轉換成mysql中=操做符 |
字段2 | Object | 最終轉換成mysql中=操做符 |
...... | Object | 最終轉換成mysql中=操做符 |
字段1,字段2,...之間的關係爲而且AND關係mysql
客戶customer一共錄入四條數據sql
經過關鍵字「劉」對客戶表全文檢索,請求url以下:
https://demo.crudapi.cn/api/business/customer?offset=0&limit=10&search=劉
查到客戶劉禪和劉備,具體原理以下:表單中所啓用了「可查詢」屬性的字段最終拼接成一個全文檢索文本fullTextBody,在插入數據和更新數據的時候及時更新,這樣就能夠利用mysql全文檢索功能實現關鍵字查詢, 最終轉成SQL語句以下:api
SELECT * FROM `ca_customer` WHERE ((MATCH(`fullTextBody`) AGAINST('張*' IN BOOLEAN MODE))) ORDER BY id DESC LIMIT 0, 10
相似的,經過關鍵字「liu」對客戶表全文檢索,經過郵箱匹配,也能夠查詢數據。bash
定義接口條件Condition,葉子條件LeafCondition繼承Condition,組合條件CompositeCondition條件繼承Condition,CompositeCondition由多個Condition組合而成,經過AND和OR兩種運算能夠實現任何形式的複雜查詢條件,這樣就利用組合模式實現了智能查詢,ide
public enum OperatorTypeEnum { EQ, NE, LIKE, IN, INSELECT, SEARCH, GE, GT, LE, LT, BETWEEN }
數據庫查詢操做符包括等於、大於、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>(); }
組合條件
Postman驗證,首先溝通mobile等於13622228888的葉子條件以下:
{ "name": "L", "columnName": "mobile" "operatorType": "EQ", "values": ["13622228888"] }
序列化值爲:
{"name":"L","columnName":"mobile","operatorType":"EQ","values":["13622228888"]}
經過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
最終查詢到客戶關羽,由於手機號知足條件。相似的,能夠構造更復雜的組合條件。
默認狀況下會選擇全部字段,select若是不指定表示全部的意思
若是指定了字段,就查詢部分字段,好比只查詢id,name和mobile,其它字段和子表profile就不須要查詢了,這樣能夠節約時間和數據大小。
子主關係中,默認只查詢主表id和name,避免主表查詢層次太深。
若是指定expand關聯對象名稱,就查詢主表全部字段,適用不須要延時加載的場景,好比查詢客戶資料時候一塊兒查詢客戶customer完整信息。
本文介紹了列表查詢API全部的參數,包括智能查詢、全文檢索以及字段選擇等。crudapi系統經過配置的方式實現了對象的查詢和分頁。
本系統屬於產品級的零代碼平臺,不一樣於自動代碼生成器,不須要生成Controller、Service、Repository、Entity等業務代碼,程序運行起來就可使用,真正0代碼,能夠覆蓋基本的和業務無關的CRUD RESTful API。
官網地址:https://crudapi.cn
測試地址:https://demo.crudapi.cn/crudapi/login