美文网首页crudapi
MySql数据库列表数据分页查询、全文检索API零代码实现

MySql数据库列表数据分页查询、全文检索API零代码实现

作者: crudapi | 来源:发表于2021-02-27 11:44 被阅读0次

    数据条件查询和分页

    前面文档主要介绍了元数据配置,包括表单定义和表关系管理,以及表单数据的录入,本文主要介绍数据查询和分页在crudapi中的实现。

    概要

    数据查询API

    数据查询主要是指按照输入条件检索出符合要求的数据列表,如果数据量大的情况下,需要考虑分页。


    listapi

    API为/api/business/{name},其中name为对象名称复数形式(兼容对象名称),查询参数如下:

    参数 类型 描述
    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关系

    查询客户

    字段查询
    customerList

    客户customer一共录入四条数据

    liushan
    分别通过名称、手机、邮箱、会员卡号进行查询,请求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语句如下:
    SELECT * FROM `ca_customer` 
    WHERE ((MATCH(`fullTextBody`) AGAINST('张*' IN BOOLEAN MODE))) 
    ORDER BY id DESC LIMIT 0, 10
    
    liu2

    类似的,通过关键字“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
    
    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

    相关文章

      网友评论

        本文标题:MySql数据库列表数据分页查询、全文检索API零代码实现

        本文链接:https://www.haomeiwen.com/subject/mcobfltx.html