AnyLine的核心是一個(gè)基于spring-jdbc生態(tài)的(No-ORM)數(shù)據(jù)庫操作工具
其重點(diǎn)是:
摒棄了各種繁瑣呆板的Service/Dao/Entity/*O/Mapper 沒有mybatis 沒有各種配置 各種O
在實(shí)際開發(fā)中、業(yè)務(wù)開發(fā)人員經(jīng)常需要大量的時(shí)間,不厭其煩的從http/rpc中提取參數(shù),判斷驗(yàn)證,生成jdbc要求格式的參數(shù),再把參數(shù)依次傳到service、dao,最后返回一個(gè)實(shí)現(xiàn)bean。這整個(gè)過程中經(jīng)常有各種小細(xì)節(jié)容易忽略而導(dǎo)致異常,如空值處理,IN條件生成等。
而在整個(gè)項(xiàng)目中這些過程又是大量重復(fù)或類似的。這不但影響開發(fā)速度與代碼質(zhì)量,更影響心情。
所以AnyLine提供了一個(gè)統(tǒng)一約定格式來實(shí)現(xiàn)這些繁瑣的操作,格式大致如下
參數(shù)值? 約定格式? |
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}%
({}代表常量值,而不是參數(shù)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]
([]表示數(shù)組) |
CODE = 0 | 忽略 | CODE IN(0,1)
|
CODE IN(0,1) | 忽略 | 忽略 | 忽略 |
10 | CODE:[split(code)]
(調(diào)用默認(rèn)類org.anyline.jdbc.config.DefaultPrepare的split預(yù)處理參數(shù)值) |
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]}]
({[]}表示常量值是一個(gè)數(shù)組) |
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
(+表示當(dāng)前條件取值失敗后,默認(rèn)取null值) |
CODE = 0 | CODE IS NULL | CODE = 0
|
CODE = 0 | CODE IS NULL | 忽略 | 忽略 |
17 | ++CODE:code
(++表示當(dāng)前條件取值失敗后,整個(gè)sql不執(zhí)行) |
CODE = 0 | 不執(zhí)行 | CODE = 0
|
CODE = 0 | 不執(zhí)行 | 忽略 | 忽略 |
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取值成功,當(dāng)前條件才生效,注意與下一條的區(qū)別) |
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不相干,哪個(gè)有值取哪個(gè)) |
CODE = 0 | 忽略 | CODE = 0 OR CODE = 1
|
CODE = 0 OR CODE = 1 | CODE = 2 | 忽略 | 忽略 |
26 | CODE:code|CD:cd
(與上一條規(guī)則相同) |
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參數(shù)值實(shí)際應(yīng)該是密文) |
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在實(shí)際運(yùn)行中以占位符??
?生成,類似?CODE > '0'
?的條件實(shí)際是?CODE > ?
?,java中通過 preapreStatement賦值,最終執(zhí)行結(jié)果與數(shù)據(jù)類型有關(guān)
忽略:表示合成SQL時(shí)不拼接當(dāng)前查詢條件
不執(zhí)行:表示整個(gè)SQL不執(zhí)行,querys返回長(zhǎng)度為 0 的DataSet ,query 返回 null
"+"開頭表示必須條件,如果沒有值傳則生成?CODE IS NULL
?的條件(僅"="時(shí)有效,其他IN,>時(shí),當(dāng)前條件忽略)
“++”開頭時(shí),如果沒有傳值則整個(gè)SQL不執(zhí)行,返回長(zhǎng)度為零的DataSet
AnyLine提供了一對(duì)基礎(chǔ)的service/dao。通過接收上一步約定好格式的參數(shù),只需要在項(xiàng)目中注入AnylineService即可完成絕大部分的數(shù)據(jù)庫操作。(AnylineService已通過@Service("anyline.service")的形式注冊(cè)到Spring上下文中)
在實(shí)際開發(fā)過程中,通常是用項(xiàng)目的BaseController繼承tAnylineController(適用于springmvc框架,如果是Struts2框架則繼承AnylineAction)
AnylineController中已經(jīng)注入AnylineService serive,并重載了大量condition函數(shù)。
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");
實(shí)現(xiàn)功能:
根據(jù)TYPE_CODE,NM,IS_PUB列查詢HR_USER表,并根據(jù)http參數(shù)自動(dòng)分頁
生成的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根據(jù)http參數(shù)傳遞情況動(dòng)態(tài)生成,如果http/rpc中沒有相關(guān)的參數(shù)則相應(yīng)的查詢條件不生成。
IS_PUB值不是來自http
TYPE_CODE IN(?,?,?)中的占位符數(shù)量根據(jù)http中type參數(shù)數(shù)量生成
如果http中沒有提供zip則生成ZIP_CODE IS NULL的查詢條件
如果http中沒有提供dept則整個(gè)SQL將不執(zhí)行,當(dāng)前querys函數(shù)返回長(zhǎng)度為0的DataSet
如果http中沒有提供post,則取根據(jù)pt取值,如果沒有提供pt,則使用默認(rèn)值101,其中的{}表示常量,而不是http中的參數(shù)key
注意IS_PUB的值是一個(gè)固定值1,也不是通過http參數(shù)中取值,所以不需要放在condition函數(shù)中轉(zhuǎn)換
AnyLine默認(rèn)提供DataRow (類似于Map)與DataSet(類似于Collection<datarow>)兩種數(shù)據(jù)結(jié)構(gòu)用來實(shí)現(xiàn)MVC各層之間的數(shù)據(jù)傳輸,
DataRow,DataSet一般是通過http參數(shù)直接構(gòu)造,或AnylineSevice.query()函數(shù)返回,或通過json,xml等數(shù)據(jù)格式構(gòu)造,也可以new實(shí)例后執(zhí)行put,add等賦值操作。
AnyLine支持但不推薦實(shí)體Bean的形式
因?yàn)镈ataRow/DataSet上可以統(tǒng)一附加開發(fā)中常用的計(jì)算函數(shù),但實(shí)體Bean不方便,如:
排序,求和,截取,清除空值,按列去重,最大最小值,交集合集差集,分組,行列轉(zhuǎn)換,類SQL篩選(like,eq,in,less,between...),JSON,XML格式轉(zhuǎn)換
附加功能
針對(duì)view層提供了大量的JSP自定義標(biāo)簽用來簡(jiǎn)化前端操作。
如<al:navi/>用來配合后臺(tái)的condition函數(shù)快速實(shí)現(xiàn)ajax分頁查詢
<al:select/><al:checkbox/>用來根據(jù)DataSet數(shù)據(jù)源生成<select>/<input type="checkbox">標(biāo)簽,并根據(jù)條件設(shè)置默認(rèn)選中值。 其他如nvl,evl,date,escape,text,set,if,else等
以及對(duì)支付工具,阿里云,微信,QQ,高德,極光,環(huán)信等第三方平臺(tái)或插件的集成。讓開發(fā)人員不再需要關(guān)心加載更新配置文件、如何簽名/驗(yàn)簽、加密/解密以及網(wǎng)絡(luò)協(xié)議等細(xì)節(jié)。
同時(shí)提供了常用的圖片,HTTP,F(xiàn)TP,加密解密,簽名驗(yàn)簽,壓縮,F(xiàn)ile,Date,正則,反射等常用工具
更多建議: