cms查詢系統(三)查詢demo體驗

#安裝相應的jar包到maven倉庫mysql

##安裝2個項目git

有2個項目的jar包須要安裝,分別是:sql

  • search-sqlparams-1.3.0.jar 主要用於查詢參數的解析
  • search-core-1.3.0.jar 總體的查詢流程體系,須要使用上述參數解析包

上述兩個項目地址分別以下:mongodb

以search-sqlparams-1.3.0.jar爲例來講下安裝步驟:數據庫

  • 第一步:fork search-sqlparams 項目(這兩個項目都是maven環境),把項目源代碼拉取到本地
  • 第二步:在該項目的目錄下,執行 mvn install 命令,就會將該項目編譯而且安裝jar包到maven倉庫中
  • 第三步:在該項目的目錄下,執行 mvn source:jar install 命令,就會將該項目的源碼包安裝到maven倉庫中

對於search-core項目同理,執行上述步驟,search-core必定要在search-sqlparams以後執行json

這樣操做,主要是方便本身去查看和修改源碼tomcat

##直接獲取項目的jar包app

若是不想關心項目的源碼,想直接獲取jar包和源碼包,下載地址以下:maven

search-sqlparams-1.3.0.jar和search-core-1.3.0.jaride

#搭建查詢demo

下載查詢demo工程,使用ide導入demo工程。工程地址以下: search-demo工程

  • 第一步:準備數據庫和數據

    demo項目中的類路徑下,有一個search.sql文件,連上mysql數據庫執行該sql文件,或者直接拷貝文件裏面的內容,到mysql客戶端直接執行這些內容。會建立一個search數據庫,裏面有a、b、c、d四張表和對應的數據

  • 第二步:修改項目中jdbc.properties的配置文件,改爲你實際的配置

  • 第三步:在tomcat中運行該項目(部署路徑設置爲/),訪問http://localhost:8080/ 以下 hello world 形式,則表示項目搭建成功:search-demo首頁

若是直接使用的是jar包,沒有安裝到maven倉庫,則須要去掉demo工程中的如下依賴

<!-- search -->
<dependency>
	<groupId>com.dboper</groupId>
	<artifactId>search-core</artifactId>
	<version>1.3.0</version>
</dependency>

而後將jar包直接放置到demo工程的classpath路徑下

#多樣化的實體查詢API

##功能介紹

對實體提供多樣化的查詢API,是有必定的使用場景的,它適用於那些簡單的查詢實體間父子關係的場景。

主要功能:

  • 1 對select語句查詢出的平鋪的結果展現進行聚合,使其具備父子關係

  • 2 對select語句查詢出的結果進行格式化,如true、false改成是、否

  • 3 對於查詢條件能夠隨意增添,支持相似mongodb的and or

##數據庫數聽說明

目前數據庫中有4張實體表,分別是a、b、c、d,他們的關係是:

  • a:b=1:N
  • b:c=1:N
  • c:d=1:N

字段內容分別以下:

a表: id、name、create_time
b表: id、name、create_time、aId
c表: id、name、create_time、bId
d表: id、name、create_time、cId

##查詢案例

分紅2部分來講,查詢實體間的關係和查詢條件,如下請求都是post請求,請求體爲json形式的字符串,同時content-type類型爲application/json。返回的數據都是list類型的,因此下面就只顯示一個數據的格式

###查詢實體間的關係

  • 1 查詢b實體的內容

    {
    	"entityColumns":["b"]
    }

    查詢返回的數據格式以下:

    {
        "id": 1,
        "name": "b1a1",
        "createTime": 1427817600000,
        "aId": "1"
    }
  • 2 查詢b實體的內容,同時想知道其父實體a的內容

    {
    	"entityColumns":["b","a@mapa"],
    	"tablesPath":"b left join a"
    }

    查詢返回的數據格式以下,b實體中有一個a屬性,屬性值爲a實體的內容:

    {
        "id": 1,
        "createTime": 1427817600000,
        "aId": "1",
        "a": {
            "id": 1,
            "createTime": 1427817600000,
            "name": "a1"
        },
        "name": "b1a1"
    }

    其中a@mapa分紅三部分a @map a,第一部分返回格式中的屬性名稱,第二部分表示該屬性是一個map形式,第三部分表示實體,綜合起來就是實體a要做爲實體b的一個屬性,而且屬性名稱爲a。

    其中tablesPath也能夠不寫,使用默認配置,可是b left join a和 b join a的結果是不同的,因此用戶能夠根據需求來自行配置。支持join 、left join 、right join

  • 3 查詢b實體的內容,同時想知道它所包含的全部c實體

    {
    	"entityColumns":["b","cs@listc"],
    	"tablesPath":"b left join c"
    }

    查詢返回的數據格式以下,b實體中有一個cs屬性,該屬性是c實體的一個集合

    {
        "id": 1,
        "createTime": 1427817600000,
        "aId": "1",
        "name": "b1a1",
        "cs": [
            {
                "id": 1,
                "createTime": 1428076800000,
                "name": "c1b1a1",
                "bId": "1"
            },
            {
                "id": 2,
                "createTime": 1428076800000,
                "name": "c2b1a1",
                "bId": "1"
            }
        ]
    }

    其中cs@listc分紅三部分 cs @list c,第一部分cs表示返回數據格式中的屬性,第二部分表示該屬性是一個集合形式,第三部分表示c實體,綜合起來就是c實體要做爲b實體cs屬性的一個成員。

    tablesPath同上。

  • 4 查詢b實體的內容,同時想知道它的父實體a和它所包含的全部的c實體的內容

    {
    	"entityColumns":["b","a@mapa","cs@listc"],
    	"tablesPath":"b left join a left join c"
    }

    返回的數據格式以下,b實體有一個a屬性,屬性類型爲map,值爲a實體的內容;b實體有一個cs屬性,屬性類型爲list,值爲c實體的集合

    {
        "id": 1,
        "createTime": 1427817600000,
        "aId": "1",
        "a": {
            "id": 1,
            "createTime": 1427817600000,
            "name": "a1"
        },
        "name": "b1a1",
        "cs": [
            {
                "id": 1,
                "createTime": 1428076800000,
                "name": "c1b1a1",
                "bId": "1"
            },
            {
                "id": 2,
                "createTime": 1428076800000,
                "name": "c2b1a1",
                "bId": "1"
            }
        ]
    }

    其中tablesPath能夠隨意寫,只要真實邏輯正確,不在意順序,如

    a right join b left join c
    b left join c left join a
    
    c right join a right join b 就不行,不是正常邏輯,
    由於 c right join a 沒有直接的關係(即便有的狀況是能夠查出來的,有的狀況也是查不出來的,最好不要這樣使用)
  • 5 查詢b實體的內容,同時想知道它的父實體a和它所包含的全部的c實體的內容,以及它所包含的全部d實體的內容

    {
    	"entityColumns":["b","a@mapa","cs@listc","ds@listd"],
    	"tablesPath":"b left join a left join c left join d"
    }

    同理,在上一個格式的基礎上,添加了一個ds的屬性,該屬性是d實體的集合,下面數據太長就省去了集合中的一部分實體

    {
        "id": 1,
        "createTime": 1427817600000,
        "aId": "1",
        "a": {
            "id": 1,
            "createTime": 1427817600000,
            "name": "a1"
        },
        "name": "b1a1",
        "ds": [
            {
                "id": 4,
                "createTime": 1428768000000,
                "name": "d2c2b1a1",
                "cId": "2"
            }
        ],
        "cs": [
            {
                "id": 2,
                "createTime": 1428076800000,
                "name": "c2b1a1",
                "bId": "1"
            }
        ]
    }

###查詢條件

上面說完了查詢實體間的關係,如今來看看在上面的基礎上如何添加查詢條件。上一部份內容就是整個查詢體系search-core項目所作的事情(還有不少其餘事情,以後再詳談),對於查詢條件部分則是search-sqlparams項目的主要功能,能夠參見cms查詢系統(二)json形式參數的設計與解析

  • 1 最簡單的查詢條件

    {
    	"entityColumns":["b"],
    	"params":{
    		"b.id":1
    	}
    }

    查詢條件爲b.id=1。下面的查詢就只寫params中的內容

  • 2 通常查詢

    {
    	"b.id@>":1
    }

    查詢條件爲b.id>1

    同理,支持的查詢條件還有以下:
    @=  @!=  @>  @>=  @<  @<=  @is
  • 3 in not in 查詢

    {
    	"b.id@in":[1,2,3]
    }
    
    {
    	"b.id@notIn":[1,2,3]
    }
  • 4 時間查詢

    {
    	"b.create_time@time>":"2014-4-3"
    }
    
    {
    	"b.create_time@full_time>":"2014-4-3 12:23:23"
    }
    
    同理還支持的查詢操做爲:
    @time> @time>= @time< @time<=
    @full_time> @full_time>= @full_time< @full_time<=
    還能夠支持自定義擴展
  • 5 like 查詢

    {
    	"b.name@like":"%a1%"
    }

    其中%用法和數據庫保持一致

  • 6 and 查詢

    {
    	"entityColumns":["b"],
    	"tablesPath":"b join a",
    	"params":{
          	"b.name@like":"%a%",
    		"a.id":1
    	}
    }

    表示要查詢的條件爲b.name like a 同時a.id=1。

    這時候tablesPath爲b和a實體間的關係,params中的查詢條件就能夠隨意的指定a、b中要查詢的字段。

    查詢條件之間默認是and的關係

  • 7 or 查詢

    {
    	"$or":{
    		"b.id@<2",
    		"b.id@>3"
    	}
    }

    上述表示的查詢條件爲 b.id<2 or b.id>3

    查詢條件之間若是想使用or的關係,則使用$or將他們包裹起來。

  • 8 and or 混合查詢

    {
    	"$or":{
    		"b.id@<2",
    		"$and":{
    			"b.create_time@time>":"2014-4-3",
    			"b.create_time@time<":"2014-4-7"
    		}
    	},
    	"b.name@like":"%a%"
    }

    上述表示的查詢條件爲:

    兩個b.create_time條件構成and關係,而後再與b.id條件構成or的關係,再與b.name條件構成and關係

先有一個基本的瞭解與認識,以後再詳細說明細節

相關文章
相關標籤/搜索