anyline 簡(jiǎn)介

2022-09-16 09:37 更新

AnyLine的核心是一個(gè)基于spring-jdbc生態(tài)的(No-ORM)數(shù)據(jù)庫操作工具 

其重點(diǎn)是:

  1. 以最簡(jiǎn)單、快速的方式操作數(shù)據(jù)庫
  2. 針對(duì)結(jié)果集的數(shù)據(jù)二次處理能力    

摒棄了各種繁瑣呆板的Service/Dao/Entity/*O/Mapper 沒有mybatis 沒有各種配置 各種O

http參數(shù)到j(luò)dbc參數(shù)的轉(zhuǎn)換

在實(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

常規(guī)數(shù)據(jù)庫操作

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)換

標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)與計(jì)算函數(shù)

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,正則,反射等常用工具

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)