BeetlSQL,簡單和強大數據庫訪問工具
beetlsql 仍然是一個在開發的工具,它集合了hibernate和mybatis的優點,去除了各自缺點,讓開發人員能更方便得開發數據庫應用
同時具有Hibernate 優點 & Mybatis優點功能,適用于承認以SQL為中心,同時又需求工具能自動能生成大量常用的SQL的應用。
- SQL 以更簡潔的方式,Markdown方式集中管理,同時方便程序開發和數據庫SQL調試
- 數據模型支持Pojo,也支持Map/List這種無模型的模型
- SQL 模板基于Beetl實現,更容易寫和調試,以及擴展
- 無需注解,自動生成大量內置SQL,輕易完成增刪改查功能
- 支持跨數據庫平臺,開發者所需工作減少到最小
- 具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他功能
- 內置支持主從數據庫,通過擴展,可以支持更復雜的分庫分表邏輯 </ul>
- XML格式過于復雜,書寫不方便
- XML 格式有保留符號,寫SQL的時候也不方便,如常用的< 符號 必須轉義
-
beetl執行效率業界出名的高效 ,因此對于基于模板的動態sql語句,采用beetl非常合適
-
beetl 語法簡單易用,可以通過半猜半式的方式實現,杜絕myBatis這樣難懂難記得語法。BeetlSql學習曲線幾乎沒有
-
利用beetl可以定制定界符號,完全可以將sql模板定界符好定義為數據庫sql注釋符號,這樣容易在數據庫中測試,如下也是sql模板(定義定界符為"--" 和 "null",null是回車意思);
selectByCond === select * form user where 1=1 --if(age!=null) age=#age# --}
-
beetl 錯誤提示非常友好,減少寫SQL腳本編寫維護時間
-
beetl 能容易與本地類交互(直接訪問Java類),能執行一些具體的業務邏輯 ,也可以直接在sql模板中寫入模型常量,即使sql重構,也會提前解析報錯
-
beetl語句易于擴展,提供各種函數,比如分表邏輯函數,跨數據庫的公共函數等
-
select_by_id : 根據主鍵查詢
-
select_by_template: 將實例變量作為模板查詢,如果其變量的屬性為空,則不計入查詢條件
-
update_by_id: 根據主鍵更新
-
update_by_template:根據模板更新
-
delete_by_id: 根據主鍵查詢
-
delete_by_template:根據模板查詢
-
insert: 自動插入,如果沒有主鍵Annotaion,則會尋找數據庫找到主鍵,并認為是自增主鍵。總共有如下三種主鍵Annotation
SeqId 用于oralce AutoId,用于自增。這是主鍵默認設置 AssignId,代碼指定主鍵
- DbStyle 描述了數據庫特性,注入insert語句,翻頁語句都通過其子類完成,用戶無需操心
- 提供一些默認的函數擴展,代替各個數據庫的函數,如時間和時間操作函數date等
- 監控sql執行較長時間語句,打印并收集(已完成)
- 對每一條sql語句執行后輸出其sql和參數,也可以根據條件只輸出特定sql集合的sql。便于用戶調試(已完成)
- 對sql預計解析,匯總sql執行情況(未完成,需要集成第三方sql分析工具)
- 數據庫分表分庫邏輯
代碼例子
List<User> list = SqlManager.getSQLScript("selectUser").select(paras,User.class); User user = SqlManager.getSql(User.class,SELECT_BY_ID).unque(id);
SQL例子
selectUser
select * from user where 1=1
@if(user.age==1){
and age = #user.age#
@}
selectAll
select * from user
@use("selectWhere");
selectWhere
where age = #age#</pre></div>
</div>
Markdown方式管理
BeetlSQL集中管理SQL語句,SQL 可以按照業務邏輯放到一個文件里,文件可以按照模塊邏輯放到一個目錄下。文件格式拋棄了XML格式,采用了Markdown,原因是
目前SQL文件格式如下
文件一些說明,放在頭部可有可無,如果有說明,可以是任意文字
SQL標示
===
SQL語句
SQL標示2
===
SQL語句 2
所有SQL文件建議放到一個db目錄,db目錄有多個子目錄,表示數據庫類型,比如db下有common,這是公共SQL語句 還有mysql,oralce。當程序獲取SQL語句得時候,先會根據數據庫找特定數據庫下的sql語句,如果未找到,會尋找common下的。如下代碼
SqlScript sql = SqlManager.getSql("sys.user.update");
SqlManager 會根據當前使用的數據庫,先找db/mysql/sys/user.md 文件,確認是否有update語句,如果沒有,則會尋找db/common/sys/user.md
豐富的數據模型支持
BeetlSql 適合各種類型的引用,對于大中小型應用,模型通常是Pojo,這樣易于維護和與三方系統交互,對于特小型項目,往往不需要嚴格的模型,表示業務實體通常是 Map/List 組合。SQL語句的輸入可以是Pojo或者Map,SQL語句執行結果也可以映射到Pojo和Map。
SqlScript sql = SqlManager.getSql("user.update");
int result = sql.update(user);
SqlScript sql = SqlManager.getSql("user.select");
List<User> list = sql.select(user,User.class);
SqlScript sql = SqlManager.getSql("user.select");
Map paras = new HashMap();
paras.put("age",11);
User user = sql.single(paras,User.class);
//or
Map user = sql.single(paras,Map.class);
SQL 模板基于Beetl實現,更容易寫和調試,以及擴展
SQL語句可以動態生成,基于Beetl語言,這是因為
無需注解,自動生成大量內置SQL,輕易完成增刪改查功能
BeetlSql雖然不是一個O/R Mapping 工具,但能根據默認約定,生成大量常用SQl而幾乎不需要注解(對于oralce,需要注解SeqId(name="seqName")),BeetlSql 根據輸入的class,自動能生成如下sql
支持跨數據庫平臺,開發者所需工作減少到最小
如前所述,BeetlSql 可以通過sql文件的管理和搜索來支持跨數據庫開發,如前所述,先搜索特定數據庫,然后再查找common。另外BeetlSql也提供了一些夸數據庫解決方案
具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他功能
BeetlSql可以在執行sql前后執行一系列的Intercetor,從而有機會執行各種擴展和監控,這比已知的通過數據庫連接池做Interceptor更加容易。如下Interceptor都是有可能的
內置支持主從數據庫,通過擴展,可以支持更復雜的分庫分表邏輯
BeetlSql管理數據源,如果只提供一個數據源,則認為讀寫均操作此數據源,如果提供多個,則默認第一個為寫庫,其他為讀庫。用戶在開發代碼的時候,無需關心操作的是哪個數據庫,因為調用sqlScrip 的 select相關api的時候,總是去讀取從庫,add/update/delete 的時候,總是讀取主庫。
sqlScript.insert(user) // 操作主庫,如果只配置了一個數據源,則無所謂主從
sqlScript.selectById(id,User.class) //讀取從庫
當然,也可以根據自己具體邏輯來確定如果選擇主從庫,只需要擴展BeetlSql,這一切對開發者是透明的
開發者也可以通過在Sql 模板里完成分表邏輯而對使用者透明,如下sql語句
insert into
#text("log"+date())#
values () ...
注:text函數直接輸出表達式到sql語句,而不是輸出?。
log表示按照一定規則分表,table可以根據輸入的時間去確定是哪個表
select * from
#text("log"+log.date)#
where
注:text函數直接輸出表達式到sql語句,而不是輸出?。
同樣,根據輸入條件決定去哪個表,或者查詢所有表
@ var tables = getLogTables();
@ for(table in tables){
select * from #text(table)#
@ if(!tableLP.isLast) print("union");
@}
where name = #name#
BeetlSQL 仍然還在開發過程中,因為業余時間有限,原本計劃的1個月開發完畢,已經耽誤了數周了,但相信8月底或者9月初就會有一個版本出來,希望beetl粉絲繼續支持。
來自:http://my.oschina.net/xiandafu/blog/493438
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
selectUserselect * from user where 1=1 @if(user.age==1){ and age = #user.age# @}
selectAll
select * from user @use("selectWhere");
selectWhere
where age = #age#</pre></div>
</div>
Markdown方式管理
BeetlSQL集中管理SQL語句,SQL 可以按照業務邏輯放到一個文件里,文件可以按照模塊邏輯放到一個目錄下。文件格式拋棄了XML格式,采用了Markdown,原因是
目前SQL文件格式如下
文件一些說明,放在頭部可有可無,如果有說明,可以是任意文字 SQL標示 === SQL語句 SQL標示2 === SQL語句 2
所有SQL文件建議放到一個db目錄,db目錄有多個子目錄,表示數據庫類型,比如db下有common,這是公共SQL語句 還有mysql,oralce。當程序獲取SQL語句得時候,先會根據數據庫找特定數據庫下的sql語句,如果未找到,會尋找common下的。如下代碼
SqlScript sql = SqlManager.getSql("sys.user.update");
SqlManager 會根據當前使用的數據庫,先找db/mysql/sys/user.md 文件,確認是否有update語句,如果沒有,則會尋找db/common/sys/user.md
豐富的數據模型支持
BeetlSql 適合各種類型的引用,對于大中小型應用,模型通常是Pojo,這樣易于維護和與三方系統交互,對于特小型項目,往往不需要嚴格的模型,表示業務實體通常是 Map/List 組合。SQL語句的輸入可以是Pojo或者Map,SQL語句執行結果也可以映射到Pojo和Map。
SqlScript sql = SqlManager.getSql("user.update"); int result = sql.update(user); SqlScript sql = SqlManager.getSql("user.select"); List<User> list = sql.select(user,User.class); SqlScript sql = SqlManager.getSql("user.select"); Map paras = new HashMap(); paras.put("age",11); User user = sql.single(paras,User.class); //or Map user = sql.single(paras,Map.class);
SQL 模板基于Beetl實現,更容易寫和調試,以及擴展
SQL語句可以動態生成,基于Beetl語言,這是因為
無需注解,自動生成大量內置SQL,輕易完成增刪改查功能
BeetlSql雖然不是一個O/R Mapping 工具,但能根據默認約定,生成大量常用SQl而幾乎不需要注解(對于oralce,需要注解SeqId(name="seqName")),BeetlSql 根據輸入的class,自動能生成如下sql
支持跨數據庫平臺,開發者所需工作減少到最小
如前所述,BeetlSql 可以通過sql文件的管理和搜索來支持跨數據庫開發,如前所述,先搜索特定數據庫,然后再查找common。另外BeetlSql也提供了一些夸數據庫解決方案
具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他功能
BeetlSql可以在執行sql前后執行一系列的Intercetor,從而有機會執行各種擴展和監控,這比已知的通過數據庫連接池做Interceptor更加容易。如下Interceptor都是有可能的
內置支持主從數據庫,通過擴展,可以支持更復雜的分庫分表邏輯
BeetlSql管理數據源,如果只提供一個數據源,則認為讀寫均操作此數據源,如果提供多個,則默認第一個為寫庫,其他為讀庫。用戶在開發代碼的時候,無需關心操作的是哪個數據庫,因為調用sqlScrip 的 select相關api的時候,總是去讀取從庫,add/update/delete 的時候,總是讀取主庫。
sqlScript.insert(user) // 操作主庫,如果只配置了一個數據源,則無所謂主從 sqlScript.selectById(id,User.class) //讀取從庫
當然,也可以根據自己具體邏輯來確定如果選擇主從庫,只需要擴展BeetlSql,這一切對開發者是透明的
開發者也可以通過在Sql 模板里完成分表邏輯而對使用者透明,如下sql語句
insert into #text("log"+date())# values () ... 注:text函數直接輸出表達式到sql語句,而不是輸出?。
log表示按照一定規則分表,table可以根據輸入的時間去確定是哪個表
select * from #text("log"+log.date)# where 注:text函數直接輸出表達式到sql語句,而不是輸出?。
同樣,根據輸入條件決定去哪個表,或者查詢所有表
@ var tables = getLogTables(); @ for(table in tables){ select * from #text(table)# @ if(!tableLP.isLast) print("union"); @} where name = #name#
BeetlSQL 仍然還在開發過程中,因為業余時間有限,原本計劃的1個月開發完畢,已經耽誤了數周了,但相信8月底或者9月初就會有一個版本出來,希望beetl粉絲繼續支持。
來自:http://my.oschina.net/xiandafu/blog/493438