#安装相应的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关系
先有一个基本的了解与认识,以后再详细说明细节