BeetlSQL,簡單和強大數據庫訪問工具

jopen 9年前發布 | 54K 次閱讀 BeetlSQL 持久層框架

beetlsql 仍然是一個在開發的工具,它集合了hibernate和mybatis的優點,去除了各自缺點,讓開發人員能更方便得開發數據庫應用

同時具有Hibernate 優點 & Mybatis優點功能,適用于承認以SQL為中心,同時又需求工具能自動能生成大量常用的SQL的應用。

  • SQL 以更簡潔的方式,Markdown方式集中管理,同時方便程序開發和數據庫SQL調試
  • 數據模型支持Pojo,也支持Map/List這種無模型的模型
  • SQL 模板基于Beetl實現,更容易寫和調試,以及擴展
  • 無需注解,自動生成大量內置SQL,輕易完成增刪改查功能
  • 支持跨數據庫平臺,開發者所需工作減少到最小
  • 具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他功能
  • 內置支持主從數據庫,通過擴展,可以支持更復雜的分庫分表邏輯
  • </ul>

    代碼例子

    List<User>  list = SqlManager.getSQLScript("selectUser").select(paras,User.class);
    User user = SqlManager.getSql(User.class,SELECT_BY_ID).unque(id);
    </div>

    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,原因是

    • XML格式過于復雜,書寫不方便
    • XML 格式有保留符號,寫SQL的時候也不方便,如常用的< 符號 必須轉義

    目前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語言,這是因為

    • 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語句易于擴展,提供各種函數,比如分表邏輯函數,跨數據庫的公共函數等

    無需注解,自動生成大量內置SQL,輕易完成增刪改查功能

    BeetlSql雖然不是一個O/R Mapping 工具,但能根據默認約定,生成大量常用SQl而幾乎不需要注解(對于oralce,需要注解SeqId(name="seqName")),BeetlSql 根據輸入的class,自動能生成如下sql

    • 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,代碼指定主鍵

    支持跨數據庫平臺,開發者所需工作減少到最小

    如前所述,BeetlSql 可以通過sql文件的管理和搜索來支持跨數據庫開發,如前所述,先搜索特定數據庫,然后再查找common。另外BeetlSql也提供了一些夸數據庫解決方案

    • DbStyle 描述了數據庫特性,注入insert語句,翻頁語句都通過其子類完成,用戶無需操心
    • 提供一些默認的函數擴展,代替各個數據庫的函數,如時間和時間操作函數date等

    具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他功能

    BeetlSql可以在執行sql前后執行一系列的Intercetor,從而有機會執行各種擴展和監控,這比已知的通過數據庫連接池做Interceptor更加容易。如下Interceptor都是有可能的

    • 監控sql執行較長時間語句,打印并收集(已完成)
    • 對每一條sql語句執行后輸出其sql和參數,也可以根據條件只輸出特定sql集合的sql。便于用戶調試(已完成)
    • 對sql預計解析,匯總sql執行情況(未完成,需要集成第三方sql分析工具)
    • 數據庫分表分庫邏輯

    內置支持主從數據庫,通過擴展,可以支持更復雜的分庫分表邏輯

    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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!