我在 hibernate,mybatis,beetlsql 全面比較 中說明了BeetlSQL 在開發效率,維護性,跨數據庫等各指標全面比hibernate 佔優,但在ORM 方面不如Hibernate,這麼多年來,hibernate已經成爲Java的 ORMapping事實上的標準和方向,但我也在文章中指出,經過註解Annotation能指明java實體類的關係,但經過註解不能闡述全部的ORM查詢,好比,我想查詢跟訂單關聯的全部有效子訂單,而不是全部子訂單。 註解的表現力在ORMapping 中愈來愈不足,也使得大量ORMapping工具經過別的方式來實現ORM查詢,讓咱們看看BeeetlSQL 新增的ORM查詢是如何簡單靈活的實現ORM查詢的。html
以下一個經常使用場景,以用戶爲中心,一個用戶關聯到多個訂單,一個用戶屬於一個部門,用戶和角色是多對多的關係。這個場景涉及到了一對一,一對多,多對多。讓咱們看看BeetlSQL是如何輕鬆實現 ORM查詢的。(不想看文字直接看代碼的能夠訪問 https://code.csdn.net/xiandafu/beetlsql_orm_sample/tree/master)java
BeetSQL 實現ORM查詢是在sql查詢語句裏使用orm.single,orm.many 倆個函數,以下例子(位於src/main/resource/sql/user.md)sql
queryUsers 是一個普通的sql查詢,查詢全部的用戶,使用page函數來用於翻頁查詢,page函數能夠轉化成select count(1) 或者 select *,若是你不瞭解beetlsql 或者 支持的翻頁查詢函數page,能夠查看beetlsql的文檔,大概須要一早上就能看完。數據庫
這個普通的sql語句查詢裏,有使用了orm查詢函數。一行一行解釋以下:mybatis
orm.single({"departmentId":"id"},"Department"); app
single 說明user對象一對一關聯到第二個參數指明的類Department。關聯方式是將user對象的departmentId 屬性 映射爲Department的id屬性。使用了 {「departmentId」:"id"},框架
beetlsql 看到此函數調用,將會在Department對象裏發起一次單表查詢,ide
第二個many也使用一樣的方式查詢ProudctOrder,關聯方式是講user對象的id屬性映射到到ProductOrder 的userId屬性函數
第三個many 是使用了一個sql查詢user.selectRole 來查詢用戶關聯的角色,輸入的參數是將user的屬性id映射爲變量userId,傳給user.selectRole查詢語句工具
,經過查詢user_role 和 role 表,語句以下
orm函數能夠放到sql語句的任何地方,建議放到sql語句開始部分或者結束部分,orm函數自己不影響sql語句,他只是記錄了一下映射關係配置,而後在BeetSQL查詢完畢後,發現若是有映射關係存在,再發起額外的ORM查詢。
由於支持了ORM查詢,User對象也須要改動,但不像hibernate那樣,必須顯示的增長Role,Department,ProudctOrder屬性,BeetSQL不須要那麼作,BeetSQL有個概念叫Tail屬性,意思是在sql查詢中,映射不到Pojo的字段的其餘sql查詢結果能夠放到tail裏,本質上是一個Map。實現tail方式有三種,User對象採用最簡單的方式,User繼承TailBean,代碼以下:
所以,上面orm查詢結果將放到tail屬性裏,其引用的名字默認是類首字母小寫開頭,即department,productOrder,role。 整個java代碼以下
若是你對Beetlsql 不熟悉,請參看官方文檔,大概須要半天時間就能有初步掌握,比學其餘ORM工具快多了
BeetlSQL 的ORM查詢就這點新鮮知識,實現起來很是簡單且功能強大,並且,也很好理解,正是咱們熟悉的的ORM查詢思路。另外,他比基於註解的ORM查詢靈活太多了而又沒有任何反作用。是一種很是棒的ORM查詢方式。儘管BeetlSQL 一直宣稱本身是個DAO工具而非ORM框架,但經過orm 函數,也能輕易實現其餘ORM框架的功能。
若是你有興趣瞭解BeetlSQl,能夠查閱網站ibeetl.com,你能夠直接訪問 https://code.csdn.net/xiandafu/beetlsql_orm_sample/tree/master 下載代碼嘗試運行近一步瞭解BeetSQL.