简介
当我们需要把http请求参数, 组装成 sql where 条件时, 经常会遇到可选参数问题, 页面上有 10 个参数, 填了几个就几个条件.
此时一般会使用 mybatis 的 xml 或者 jpa 的 query 来解决.
本工具包已提供的与以上两种方式近似的 xml 和 query 方案, 但是在实际使用中发现还是不够满足需求.
在 es, mongo, presto, clickhouse 等数据库中 1 != “1”, 此时需要将 http 传输的 String 型参数转换为各种不同的数据类型.
创建查询 v:0.1.9
- 可以使用如下方式创建 SybnQuery:
// 从请求参数中生成一个query
Map<String, String> request = new LinkedHashMap<>();
request.put("id@eq@i", "1"); // @i表示value是int
request.put("type@ne@i", "0");
request.put("day@gl", "2018-01-01~2018-04-19");
request.put("name@like", "aaa");
// 这个 query 支持转换为 spring jpa 等其他 orm 工具的 query 对象, 详情参考 spring-mvc-helper 子项目.
SybnQuery<?> query = SybnQueryMapFactory.newQuery(request);
// id = 1 and type != 0 and day between '2018-01-01' and '2018-04-19' and name like '%aaa%'
String sql = query.toSqlWhere();
语法
字段名@字段类型@比较符 如: user_status@eq@i 等效于 user_status=toInt(?)
可用比较符
- re like 仅限字符串,仅限单个词,允许省略%
- RE like 仅限字符串,多个词逗号分开,or关系,允许省略%
- is/eq == 任意类型
- ne <> 任意类型
- gld/gl between A and B (20150601~20150601)
- gldt between A and B (20150601000000~20150601235959)
- gt > 仅限数字(@i或@l),注意:不支持日期
- gte >= 仅限数字(@i或@l),注意:不支持日期
- lt < 仅限数字(@i或@l),注意:不支持日期
- lte <= 仅限数字(@i或@l),注意:不支持日期
- in in 任意类型,多个词逗号分开,or关系
- nin not in 任意类型,多个词逗号分开,and关系
参数类型
- @s 字符串
- @d 时间
- @l 长整数
- @i 整数
- @b 布尔
数组
如果参数为逗号分隔的数组,则参数类型使用大写
如: user_id@I@in 等效于 user_id in (toInt(?), toInt(?), toInt(?)…)
范围查询
-
gl 等范围查询需要 2 个 between 条件, 此时应该用 ~ 作为分隔符.
-
参数是 @d 表示时间时, 支持日常常用的时间格式