java 将json转换成sql_search-sqlparams

json形式查询的设计与解析

对json形式的查询条件,解析成对应sql中的where条件部分。即有点类似mongodb的json查询的设计

例子:

1最简单的方式

{

"a.id@>":12

}

解析后的sql条件为: a.id>12

2模糊查询

{

"a.name@like":"%lg%"

}

解析后的sql条件为: a.name like '%lg%'

3in not 类似的查询

{

"a.id@in":[1,2,3]

}

解析后的sql条件为: a.id in (1,2,3)

4时间查询

{

"a.updateTime@time>":"2015-3-1"

}

解析后的sql条件为 : unix_timestamp(a.updateTime) > 1425139200

5多条件查询,条件之间默认是and的关系

{

"a.id@>":12,

"b.name":"lg"

}

解析后的sql条件为: a.id>12 and b.name='lg'

6多条件嵌套查询,$or 表示里面的查询条件是 or 的关系

{

"c.age@>":14,

"$or":{

"b.id@=":2,

"d.age@

}

}

解析后的sql条件为: c.age>14 and (b.id=2 or d.age<23)

7复杂的多条件嵌套查询

{

"a.name":"lg",

"$or":{

"b.age@>=":24,

"c.id":1,

"$and":{

"a.id@>":12,

"b.id@

}

}

}

解析后的sql条件为 : a.name='lg' and (b.age>=24 or c.id=1 or (a.id>12 and b.id<34) )

#案例

对于json形式的查询,可以先转化成map结构的参数,然后使用如下:

DefaultSqlParamsHandler defaultSqlParamsHandler=new DefaultSqlParamsHandler();

String sqlWhere=defaultSqlParamsHandler.getSqlWhereParams(map结构的参数));

上述方式直接输出对应的sql拼接形式,即 a.id>24 这样的一个字符串结果

如果想使用占位符,则使用如下:

DefaultSqlParamsHandler defaultSqlParamsHandler=new DefaultSqlParamsHandler();

SqlParamsParseResult sqlParamsParseResult=defaultSqlParamsHandler.getSqlWhereParamsResult(map结构的参数);

System.out.println("testNormal:"+sqlParamsParseResult.getBaseWhereSql());

System.out.println("testNormal:"+sqlParamsParseResult.getArguments());

解析结果的类型为:SqlParamsParseResult,它的baseWhereSql属性是 a.id>? 这样的字符串,它的arguments则是参数集合如 [24]

测试案例1如下:

@Test

public void testNormal(){

Map params=new HashMap();

params.put("a.name","lg");

params.put("b.age@>=",2);

System.out.println("--------------------------------------");

System.out.println("testNormal:"+defaultSqlParamsHandler.getSqlWhereParams(params));

SqlParamsParseResult sqlParamsParseResult=defaultSqlParamsHandler.getSqlWhereParamsResult(params);

System.out.println("testNormal:"+sqlParamsParseResult.getBaseWhereSql());

System.out.println("testNormal:"+sqlParamsParseResult.getArguments());

}

输出结果为:

testNormal:b.age >= 2 and a.name = 'lg'

testNormal:b.age >= ? and a.name = ?

testNormal:[2, lg]

测试案例2如下:

@Test

public void testAndOr(){

Map params=new HashMap();

Map sonParams=new HashMap();

sonParams.put("b.name","李四");

sonParams.put("c.age@

params.put("a.name","lg");

params.put("$or",sonParams);

System.out.println("--------------------------------------");

System.out.println("testAndOr:"+defaultSqlParamsHandler.getSqlWhereParams(params));

SqlParamsParseResult sqlParamsParseResult=defaultSqlParamsHandler.getSqlWhereParamsResult(params);

System.out.println("testAndOr:"+sqlParamsParseResult.getBaseWhereSql());

System.out.println("testAndOr:"+sqlParamsParseResult.getArguments());

}

输出结果为:

testAndOr:(c.age < 4 or b.name = '李四') and a.name = 'lg'

testAndOr:(c.age < ? or b.name = ?) and a.name = ?

testAndOr:[4, 李四, lg]

测试案例3如下:

@Test

public void testAndOrComplex(){

Map params=new HashMap();

Map sonParams=new HashMap();

Map sonSonParams=new HashMap();

sonSonParams.put("d.name","王五");

sonSonParams.put("e.age@>=",12);

sonParams.put("b.name","李四");

sonParams.put("c.age@

sonParams.put("$and",sonSonParams);

params.put("a.name","lg");

params.put("$or",sonParams);

System.out.println("--------------------------------------");

System.out.println("testAndOrComplex:"+defaultSqlParamsHandler.getSqlWhereParams(params));

SqlParamsParseResult sqlParamsParseResult=defaultSqlParamsHandler.getSqlWhereParamsResult(params);

System.out.println("testAndOrComplex:"+sqlParamsParseResult.getBaseWhereSql());

System.out.println("testAndOrComplex:"+sqlParamsParseResult.getArguments());

}

输出结果为:

testAndOrComplex:((e.age >= 12 and d.name = '王五') or c.age < 4 or b.name = '李四') and a.name = 'lg'

testAndOrComplex:((e.age >= ? and d.name = ?) or c.age < ? or b.name = ?) and a.name = ?

testAndOrComplex:[12, 王五, 4, 李四, lg]

#自定义扩展

@> @ in @ time> 这些都是内部定义的一些操作符。如果用户想使用自定义的操作符,可以如下操作:

第一步: 实现SqlParamsParser接口,实现自己的解析器

第二步: 向DefaultSqlParamsHandler注册自定义的解析器,即调用它的registerSqlParamsHandler(SqlParamsParser sqlParamsParser)方法即可

具体怎么实现,参考其中的实现类(还是很简单的)。

目前内置的解析器接口及其实现类如下:

e2680527eaef72a17c8525194d2d5265.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值