天天看點

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

資料條件查詢和分頁

前面文檔主要介紹了中繼資料配置,包括表單定義和表關系管理,以及表單資料的錄入,本文主要介紹資料查詢和分頁在crudapi中的實作。

概要

資料查詢API

資料查詢主要是指按照輸入條件檢索出符合要求的資料清單,如果資料量大的情況下,需要考慮分頁。

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

API為/api/business/{name},其中name為對象名稱複數形式(相容對象名稱),查詢參數如下:

參數 類型 描述
select string 選擇查詢需要的字段和關聯子表,預設查詢全部字段和關聯子表
expand 選擇需要展開的關聯主表,預設關聯主表字段隻查詢id和name
search 全文檢索關鍵字,通過内置的系統字段全文索引fullTextBody實作
filter 智能查詢條件,格式為Condition對象JSON序列化後的字元串
orderby 排序方式,ASC和DESC
offset int32 分頁開始位置
limit 每頁數量
字段1 Object 最終轉換成mysql中=操作符
字段2
......

字段1,字段2,...之間的關系為并且AND關系

查詢客戶

字段查詢
MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

客戶customer一共錄入四條資料

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

分别通過名稱、手機、郵箱、會員卡号進行查詢,請求url如下:

/api/business/customer?offset=0&limit=10&name=劉禅&mobile=13088889999&[email protected]&membershipNo=VIP000000004

查到客戶劉禅

全文檢索
MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

通過關鍵字“劉”對客戶表全文檢索,請求url如下:

/api/business/customer?offset=0&limit=10&search=劉

查到客戶劉禅和劉備,具體原理如下:表單中所啟用了“可查詢”屬性的字段最終拼接成一個全文檢索文本fullTextBody,在插入資料和更新資料的時候及時更新,這樣就可以利用mysql全文檢索功能實作關鍵字查詢, 最終轉成SQL語句如下:

SELECT * FROM `ca_customer` 
WHERE ((MATCH(`fullTextBody`) AGAINST('張*' IN BOOLEAN MODE))) 
ORDER BY id DESC LIMIT 0, 10           
MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

類似的,通過關鍵字“liu”對客戶表全文檢索,通過郵箱比對,也可以查詢資料。

智能查詢原理

定義接口條件Condition,葉子條件LeafCondition繼承Condition,組合條件CompositeCondition條件繼承Condition,CompositeCondition由多個Condition組合而成,通過AND和OR兩種運算可以實作任何形式的複雜查詢條件,這樣就利用組合模式實作了智能查詢,

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           
MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

最終查詢到客戶關羽,因為手機号滿足條件。類似的,可以構造更複雜的組合條件。

字段選擇select

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

預設情況下會選擇所有字段,select如果不指定表示所有的意思

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

如果指定了字段,就查詢部分字段,比如隻查詢id,name和mobile,其它字段和子表profile就不需要查詢了,這樣可以節約時間和資料大小。

關聯表擴充expand

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

子主關系中,預設隻查詢主表id和name,避免主表查詢層次太深。

MySql資料庫清單資料分頁查詢、全文檢索API零代碼實作資料條件查詢和分頁

如果指定expand關聯對象名稱,就查詢主表所有字段,适用不需要延時加載的場景,比如查詢客戶資料時候一起查詢客戶customer完整資訊。

小結

本文介紹了清單查詢API所有的參數,包括智能查詢、全文檢索以及字段選擇等。crudapi系統通過配置的方式實作了對象的查詢和分頁。

附crudapi簡介

本系統屬于産品級的零代碼平台,不同于自動代碼生成器,不需要生成Controller、Service、Repository、Entity等業務代碼,程式運作起來就可以使用,真正0代碼,可以覆寫基本的和業務無關的CRUD RESTful API。