天天看點

DSL風格資料庫程式設計之實踐删除代碼示例插入代碼示例更新代碼示例查詢代碼示例總結

現在的應用系統中,絕多多數的情況下都是要用到資料庫的,而适合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,也可以一起加入我們。