MySql數據庫列表數據分頁查詢、全文檢索API在crudapi系統中零代碼實現

數據條件查詢和分頁

前面文檔主要介紹了元數據配置,包括表單定義和表關係管理,以及表單數據的錄入,本文主要介紹數據查詢和分頁在crudapi中的實現。javascript

概要

數據查詢API

數據查詢主要是指按照輸入條件檢索出符合要求的數據列表,若是數據量大的狀況下,須要考慮分頁。
listapi
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

查詢客戶

字段查詢

customerList
客戶customer一共錄入四條數據sql

liushanbr/>分別經過名稱、手機、郵箱、會員卡號進行查詢,請求url以下:
https://demo.crudapi.cn/api/business/customer?offset=0&limit=10&name=劉禪&mobile=13088889999&email=liushan@crudapi.cn&membershipNo=VIP000000004
查到客戶劉禪數據庫

全文檢索

liu
經過關鍵字「劉」對客戶表全文檢索,請求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

liu2
相似的,經過關鍵字「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

condition
最終查詢到客戶關羽,由於手機號知足條件。相似的,能夠構造更復雜的組合條件。

字段選擇select

select1
默認狀況下會選擇全部字段,select若是不指定表示全部的意思

select2
若是指定了字段,就查詢部分字段,好比只查詢id,name和mobile,其它字段和子表profile就不須要查詢了,這樣能夠節約時間和數據大小。

關聯表擴展expand

expand1
子主關係中,默認只查詢主表id和name,避免主表查詢層次太深。

expand2
若是指定expand關聯對象名稱,就查詢主表全部字段,適用不須要延時加載的場景,好比查詢客戶資料時候一塊兒查詢客戶customer完整信息。

小結

本文介紹了列表查詢API全部的參數,包括智能查詢、全文檢索以及字段選擇等。crudapi系統經過配置的方式實現了對象的查詢和分頁。

附demo演示

本系統屬於產品級的零代碼平臺,不一樣於自動代碼生成器,不須要生成Controller、Service、Repository、Entity等業務代碼,程序運行起來就可使用,真正0代碼,能夠覆蓋基本的和業務無關的CRUD RESTful API。

官網地址:https://crudapi.cn
測試地址:https://demo.crudapi.cn/crudapi/login

相關文章
相關標籤/搜索