#安裝相應的jar包到maven倉庫mysql
##安裝2個項目git
有2個項目的jar包須要安裝,分別是:sql
上述兩個項目地址分別以下:mongodb
以search-sqlparams-1.3.0.jar爲例來講下安裝步驟:數據庫
對於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 形式,則表示項目搭建成功:
若是直接使用的是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表: 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關係
先有一個基本的瞭解與認識,以後再詳細說明細節