anyline 简介
AnyLine的核心是一个基于spring-jdbc生态的(No-ORM)数据库操作工具
其重点是:
- 以最简单、快速的方式操作数据库
- 针对结果集的数据二次处理能力
摒弃了各种繁琐呆板的Service/Dao/Entity/*O/Mapper 没有mybatis 没有各种配置 各种O
http参数到jdbc参数的转换
在实际开发中、业务开发人员经常需要大量的时间,不厌其烦的从http/rpc中提取参数,判断验证,生成jdbc要求格式的参数,再把参数依次传到service、dao,最后返回一个实现bean。这整个过程中经常有各种小细节容易忽略而导致异常,如空值处理,IN条件生成等。
而在整个项目中这些过程又是大量重复或类似的。这不但影响开发速度与代码质量,更影响心情。
所以AnyLine提供了一个统一约定格式来实现这些繁琐的操作,格式大致如下
参数值⇢ 约定格式⇣ |
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
code=0 | code= | code=0&code=1&cd=2&user=5 | code=0,1&cd=2&user=5
|
cd=2&cd=3 | code=0(密文) | cd=2(密文)&cd=3(密文) | ||
1 | CODE:code | CODE = 0 | 忽略 | CODE = 0
|
CODE = 0 | 忽略 | 忽略 | 忽略 |
2 | CODE:%code% | CODE LIKE '%0%' | 忽略 | CODE LIKE '%0%'
|
CODE LIKE '%0%'
|
忽略 | 忽略 | 忽略 |
3 | CODE:%code | CODE LIKE '%0' | 忽略 | CODE LIKE '%0'
|
CODE LIKE '%0' | 忽略 | 忽略 | 忽略 |
4 | CODE:code% | CODE LIKE '0%' | 忽略 | CODE LIKE '0%'
|
CODE LIKE '0%' | 忽略 | 忽略 | 忽略 |
5 | CODE:%code:cd%
(依次通过code,cd取值) |
CODE LIKE '%0%' | 忽略 | CODE LIKE '%0%'
|
CODE LIKE '%0%' | CODE LIKE '%2%' | 忽略 | 忽略 |
6 | CODE:%code:cd:${9}%
({}代表常量值,而不是参数key) |
CODE LIKE '%0%' | CODE LIKE '%9%' | CODE LIKE '%0%'
|
CODE LIKE '%0%' | CODE LIKE '%2%' | 忽略 | 忽略 |
7 | CODE:%code:cd | CODE LIKE '%0' | 忽略 | CODE LIKE '%0'
|
CODE LIKE '%0' | CODE LIKE '%2' | 忽略 | 忽略 |
8 | CODE:%code:cd:${9} | CODE LIKE '%0' | CODE LIKE '%9' | CODE LIKE '%0'
|
CODE LIKE '%0' | CODE LIKE '%2' | 忽略 | 忽略 |
9 | CODE:[code]
([]表示数组) |
CODE = 0 | 忽略 | CODE IN(0,1)
|
CODE IN(0,1) | 忽略 | 忽略 | 忽略 |
10 | CODE:[split(code)]
(调用默认类org.anyline.jdbc.config.DefaultPrepare的split预处理参数值) |
CODE = 1 | 忽略
|
CODE IN(0,1)
|
CODE IN(0,1)
|
忽略
|
忽略
|
忽略
|
11 | CODE:[org.ClassA.split(code)]
(指定完整的包名.类名.方法名) |
CODE = 1 | 忽略
|
CODE IN(0,1)
|
CODE IN(0,1)
|
忽略
|
忽略
|
忽略
|
12 | CODE:[code:cd] | CODE = 0 | 忽略 | CODE IN(0,1)
|
CODE IN(0,1) | CODE IN(2,3) | 忽略 | 忽略 |
13 | CODE:[cd+] | 忽略
|
忽略
|
CODE = 2
|
CODE = 2 | CODE IN(2,3) | 忽略
|
CODE IN(2,3) |
14 | CODE:[code:cd:${[6,7,8]}]
({[]}表示常量值是一个数组) |
CODE = 0 | CODE IN(6,7,8) | CODE IN(0,1)
|
CODE IN(0,1) | CODE IN(2,3) | 忽略 | 忽略 |
15 | CODE:[code:cd:${6,7,8}]
|
CODE = 0 | CODE IN(6,7,8) | CODE IN(0,1)
|
CODE IN(0,1) | CODE IN(2,3) | 忽略 | 忽略 |
16 | +CODE:code
(+表示当前条件取值失败后,默认取null值) |
CODE = 0 | CODE IS NULL | CODE = 0
|
CODE = 0 | CODE IS NULL | 忽略 | 忽略 |
17 | ++CODE:code
(++表示当前条件取值失败后,整个sql不执行) |
CODE = 0 | 不执行 | CODE = 0
|
CODE = 0 | 不执行 | 忽略 | 忽略 |
18 | CODE:>code | CODE > 0 | 忽略 | CODE > 0
|
CODE > 0 | 忽略 | 忽略 | 忽略 |
19 | CODE:>code:cd | CODE > 0 | 忽略 | CODE > 0
|
CODE > 0 | CODE > 2 | 忽略 | 忽略 |
20 | CODE:>code:${9} | CODE > 0 | CODE > 9 | CODE > 0
|
CODE >0 | CODE > 9 | CODE > 9 | CODE > 9 |
21 | CODE:code:cd | CODE = 0 | 忽略 | CODE = 2
|
CODE = 2 | CODE = 2 | 忽略 | 忽略 |
22 | CODE:code:cd:${9} | CODE = 0 | CODE = 9 | CODE = 0
|
CODE = 0 | CODE = 2 | 忽略 | 忽略 |
23 | CODE:code|cd
(只有code取值成功,当前条件才生效,注意与下一条的区别) |
CODE = 0 | 忽略 | CODE =0 OR CODE = 2
|
CODE =0 OR CODE = 2 | 忽略 | 忽略 | 忽略 |
24 | CODE:code|{NULL} | CODE = 0 OR CODE IS NULL | 忽略 | CODE = 0 OR CODE IS NULL
|
CODE = 0 OR CODE IS NULL | 忽略
|
忽略
|
忽略
|
25 | CODE:code|CODE:cd
(code与cd不相干,哪个有值取哪个) |
CODE = 0 | 忽略 | CODE = 0 OR CODE = 1
|
CODE = 0 OR CODE = 1 | CODE = 2 | 忽略 | 忽略 |
26 | CODE:code|CD:cd
(与上一条规则相同) |
CODE = 0 | 忽略 | CODE = 0 OR CD = 2
|
CODE = 0 OR CD = 2 | CD = 2 | 忽略 | 忽略 |
27 | CODE:code:cd|user
|
CODE = 0 | 忽略 | CODE = 0 OR CODE = 5
|
CODE = 0 OR CODE = 5 | CODE = 2 | 忽略 | 忽略 |
28 | CODE:code:cd|{9}
|
CODE = 0
|
忽略 | CODE = 0 OR CODE = 9
|
CODE = 0 OR CODE = 9 | CODE = 2 OR CODE = 9 | CODE = 9 | CODE = 9 |
29 | CODE:code+:${9}
(http参数值实际应该是密文) |
CODE = 9 | CODE = 9 | CODE = 9
|
CODE = 9 | CODE = 9 | CODE = 0 | CODE = 9 |
30 | CODE:code+:cd:${9}
(code需要密文,cd需要明文) |
CODE = 9 | CODE = 9 | CODE = 2
|
CODE = 2 | CODE = 2 | CODE = 0 | CODE = 9 |
31 | CODE:code+:cd+ | 忽略
|
忽略
|
忽略
|
忽略
|
忽略
|
CODE = 0 | CODE = 2 |
32 | CODE:code|CODE:cd|CD:cd|CD:code | CODE = 0 OR CD = 0 | 忽略 | CODE =0 OR CODE = 2 OR ID =0 OR ID = 2
|
CODE =0 OR CODE = 2 OR ID =0 OR ID = 2 | CODE =2 OR CD =2 | 忽略 | 忽略 |
33 | CODE:code:${9}|CD:cd:${9} | CODE = 0 OR CD = 9 | CODE = 9 OR CD = 9 | CODE = 0 OR CD = 2
|
CODE = 0 OR CD = 2 | CODE = 9 OR CD = 2 | CODE = 9 OR CD = 9 | CODE = 9 OR CD = 9 |
以上SQL在实际运行中以占位符?
生成,类似CODE > '0'
的条件实际是CODE > ?
,java中通过 preapreStatement赋值,最终执行结果与数据类型有关
忽略:表示合成SQL时不拼接当前查询条件
不执行:表示整个SQL不执行,querys返回长度为 0 的DataSet ,query 返回 null
"+"开头表示必须条件,如果没有值传则生成CODE IS NULL
的条件(仅"="时有效,其他IN,>时,当前条件忽略)
“++”开头时,如果没有传值则整个SQL不执行,返回长度为零的DataSet
常规数据库操作
AnyLine提供了一对基础的service/dao。通过接收上一步约定好格式的参数,只需要在项目中注入AnylineService即可完成绝大部分的数据库操作。(AnylineService已通过@Service("anyline.service")的形式注册到Spring上下文中)
在实际开发过程中,通常是用项目的BaseController继承tAnylineController(适用于springmvc框架,如果是Struts2框架则继承AnylineAction)
AnylineController中已经注入AnylineService serive,并重载了大量condition函数。
Controller层操作过程大致如下:
DataSet set = service.querys("HR_USER(ID,NM)"
, condition(true,"TYPE_CODE:[type]","NM:nm%","+ZIP_CODE:zip:","++DEPT_CODE:dept","POST_CODE:post:pt:{101}")
, "IS_PUB:1");
实现功能:
根据TYPE_CODE,NM,IS_PUB列查询HR_USER表,并根据http参数自动分页
生成的SQL(以mysql为例):
SELECT
ID,NM
FROM HR_USER
WHERE
TYPE_CODE IN (?,?,?)
AND NM LIKE CONCAT(?,'%')
AND ZIP_CODE = ?
AND DEPT_CODE = ?
AND POST_CODE = ?
AND IS_PUB = ?
LIMIT 0,10
以SQL根据http参数传递情况动态生成,如果http/rpc中没有相关的参数则相应的查询条件不生成。
IS_PUB值不是来自http
TYPE_CODE IN(?,?,?)中的占位符数量根据http中type参数数量生成
如果http中没有提供zip则生成ZIP_CODE IS NULL的查询条件
如果http中没有提供dept则整个SQL将不执行,当前querys函数返回长度为0的DataSet
如果http中没有提供post,则取根据pt取值,如果没有提供pt,则使用默认值101,其中的{}表示常量,而不是http中的参数key
注意IS_PUB的值是一个固定值1,也不是通过http参数中取值,所以不需要放在condition函数中转换
标准数据结构与计算函数
AnyLine默认提供DataRow (类似于Map)与DataSet(类似于Collection<datarow>)两种数据结构用来实现MVC各层之间的数据传输,
DataRow,DataSet一般是通过http参数直接构造,或AnylineSevice.query()函数返回,或通过json,xml等数据格式构造,也可以new实例后执行put,add等赋值操作。
AnyLine支持但不推荐实体Bean的形式
因为DataRow/DataSet上可以统一附加开发中常用的计算函数,但实体Bean不方便,如:
排序,求和,截取,清除空值,按列去重,最大最小值,交集合集差集,分组,行列转换,类SQL筛选(like,eq,in,less,between...),JSON,XML格式转换
附加功能
针对view层提供了大量的JSP自定义标签用来简化前端操作。
如<al:navi/>用来配合后台的condition函数快速实现ajax分页查询
<al:select/><al:checkbox/>用来根据DataSet数据源生成<select>/<input type="checkbox">标签,并根据条件设置默认选中值。 其他如nvl,evl,date,escape,text,set,if,else等
以及对支付工具,阿里云,微信,QQ,高德,极光,环信等第三方平台或插件的集成。让开发人员不再需要关心加载更新配置文件、如何签名/验签、加密/解密以及网络协议等细节。
同时提供了常用的图片,HTTP,FTP,加密解密,签名验签,压缩,File,Date,正则,反射等常用工具
更多建议: