現在的應用系統中,絕多多數的情況下都是要用到資料庫的,而适合java架構的資料庫處理方案太多了,這裡就不一一列出了。
現在又比較流行一種dsl(domain specific language)風格的資料庫通路方式,比如:jooq、querydsl等等,都比較成熟。仔細研究了一下,覺得存在如下問題:這兩貨都是收費的,這明顯不符合時代潮流麼;第二就是有點過度封裝的意思,有許多東西都封裝了,導緻學習及使用成本上升;再就是體量都比較大,能不能又瘦又小又好用?
當然,也有一些同學有自己的實作,不能一一研究并列舉,今天僅做驗證性開發,不足之處同學們盡快提出來,隻要合情合理,我們都會采納。
ok,說做就做,花點時間看看,可不可以自己做個實作?
<a href="http://my.oschina.net/tinyframework/blog/386112#">?</a>
1
2
3
4
5
6
7
<code>delete(user).where(</code>
<code> </code><code>user.name.eq(</code><code>"悠然"</code><code>)</code>
<code> </code><code>);</code>
<code> </code><code>delete(user).where(</code>
<code> </code><code>user.name.leftlike(</code><code>"a"</code><code>),</code>
<code> </code><code>user.age.between(</code><code>20</code><code>,</code><code>30</code><code>)</code>
<code>insertinto(user).values(</code>
<code> </code><code>user.name.value(</code><code>"悠然"</code><code>),</code>
<code> </code><code>user.age.value(</code><code>22</code><code>)</code>
<code>update(user).set(</code>
<code> </code><code>user.name.to(</code><code>"abc"</code><code>),</code>
<code> </code><code>user.age.to(</code><code>3</code><code>)</code>
<code> </code><code>).where(</code>
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<code>selectfrom(user);</code>
<code> </code><code>select(</code>
<code> </code><code>customfield(</code><code>"%s-%s"</code><code>),</code>
<code> </code><code>user.name,user.age</code>
<code> </code><code>).from(user);</code>
<code> </code><code>customfield(</code><code>"upper(%s)-%s"</code><code>),</code>
<code> </code><code>selectfrom(user).orderby(user.name.desc());</code>
<code> </code><code>selectfrom(user).where(</code>
<code> </code><code>user.name.eq(</code><code>"abc"</code><code>)</code>
<code> </code><code>user.name.like(</code><code>"abc"</code><code>)</code>
<code> </code><code>or(</code>
<code> </code><code>user.name.like(</code><code>"abc"</code><code>),</code>
<code> </code><code>user.age.gt(</code><code>20</code><code>)</code>
<code> </code><code>)</code>
<code> </code><code>user.age.gt(</code><code>20</code><code>).and(</code>
<code> </code>
<code> </code><code>user.name.leftlike(</code><code>"abc"</code><code>)</code>
<code> </code><code>user.age.between(</code><code>23</code><code>,</code><code>25</code><code>)</code>
<code> </code><code>select(user.age.max()).from(user);</code>
<code> </code><code>select(user.age.min()).from(user);</code>
<code> </code><code>select(user.age.avg()).from(user);</code>
<code> </code><code>select(user.age.count()).from(user);</code>
<code> </code><code>select(user.age.sum()).from(user);</code>
<code> </code><code>select(user.name.distinct()).from(user);</code>
<code> </code><code>select(user.age.sum()).from(user).having(</code>
<code> </code><code>user.age.sum().gt(</code><code>100</code><code>)</code>
<code> </code><code>).union(</code>
<code> </code><code>select(user.age.sum()).from(user).having(</code>
<code> </code><code>user.age.sum().gt(</code><code>100</code><code>)</code>
查詢是最複雜,也是最多變的,上面已經列舉了大多數情況。
通過上面的示例,基本上涵蓋了四種sql語句的處理方式。當然每種方案都有它自己的優點與缺點,正所謂蘿蔔芹菜各有所愛。
這個方案的優點是把sql邏輯用有語義的代碼進行編寫,更容易了解;同時由于其與sql語句的結構相當相似,也更容易寫出相應的sql邏輯,熟悉sql的人的學習成本非常低;同時也可以非常好的避免sql注入問題;較sql拼接是有相當的改善的。也避免了sql與java代碼分離導緻的開發和調試的不友善。
當然也有它的缺點,比如,經常聽到的反對聲音就是不如寫原生sql。
完整實作版即将推出。
如果關心tiny,可以通路tiny主站:http://www.tinygroup.org,也可以一起加入我們。