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)方法即可
具體怎么實現,參考其中的實現類(還是很簡單的)。
目前內置的解析器接口及其實現類如下:
總結
以上是生活随笔為你收集整理的java 将json转换成sql_search-sqlparams的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java包和访问权限_Java包和访问权
- 下一篇: concat函数java_MySql中C