基于 Spring JDBC 的 ORM 框架:SBORM

yne7 9年前發布 | 40K 次閱讀 SBORM 持久層框架

一、SBORM 介紹

1、目前只考慮支持 mysql;

2、基于springjdbc的上層封裝,底層jdbc操作基于JdbcTemplate,對于使用springjdbc的人會有一點價值,比較簡潔的封裝可以節省很多重復勞動,具體節省多少可以看看example;

3、實現一套簡單的ORM(直接使用spring rowmapper,insert自己實現),可以基于對象進行crud和相對復雜(感覺比hibernate強大一點)的sql操作;

4、基于對象指定查詢的字段,大部分時候可以忘掉表結構進行業務開發;

5、支持簡單的數據庫路由,讀寫分離(半自動,需要指定取writer還是reader,默認規則reader采用隨機的方式,當然也可以手動指定);

6、支持簡單的分表,主要是針對一定規則的分表,比如百分表、千分表,也可以自己指定分表后綴;

7、簡單的單表查詢(比如所有條件是and或者or結構),基本實現0sql代碼編寫(類似HibernateTemplate selectByExample、findByCriteria、find等方法);

8、簡單的單表排序支持,支持多個排序條件組合;

9、對于復雜的sql查詢,提供獲取jdbctemplate實例進行操作,類似springjdbc的常規用法;

10、提供Entity代碼生成接口,Entity并非簡單的pojo(盡可能不要去修改此類),引入字段常量類,方便查詢的時候指定選擇字段,從而更好實現查詢條件的封裝;

二、為什么寫SBORM?

1、hibernate:過于臃腫,使用不夠靈活,優化難(其實主要是因為很少用),HQL感覺就是個渣,在 mysql幾乎一統天下的背景下,跨數據庫級別的兼容吃力不討好。Hibernate的對象化關聯處理確實挺強大,但是使用起來坑太多,有多少人敢在項目 中大范圍使用真不知道,屠龍刀不是人人都提的起啊。

2、mybatis:輕量級,基于xml的模式感覺不利于封裝,代碼量不小,基于xml維護也麻煩(個人觀點, 現在注解模式貌似也挺不錯),感覺mybatis更適合存在dba角色的年代,可以遠離代碼進行sql調優,復雜的查詢拼裝起來也更加優雅(java基本 就是if else ...),但是對于查詢業務簡單但是數據庫集群環境的場景有點憋屈(其實對mybatis使用也不多,瞎評論^_^)。

3、springjdbc:小巧,靈活,足夠優秀,個人比較喜歡使用,但是代碼量偏大,原生的接口重復勞動量大,比如insert、mapper之類的;

SBORM只是針對springjdbc的一些不方便的地方,做了一些封裝,更加簡化日常的開發工作,基于springjdbc的RowMapper自動實現對象映射,也勉強算的上叫ORM,只是大部分功能已經由springjdbc實現了。

平時不太喜歡使用hibernate和mybatis,主要是使用springjdbc,寫這個東西的出發點主要是平時使用springjdbc覺 得比較麻煩,重復性的代碼偏多,一方面通過自動mapper降低返回結果處理工作量,另一方面參考hibernate對象化查詢條件的模式,寫了一個 QueryBudiler,使得更多簡單的單表查詢可以通過對象組織查詢、更改邏輯,避免過多去寫相似性的SQL語句,減少DAO接口量。

三、一些亮點

1、Entity的設計:很多人看了也許會說,這個不是POJO,不是純粹的Java Bean,顯得很另類。但是有多人在開發過程中(特別是在寫sql的時候),經常要去看看表結構設計?還有多少次因為改了表某個字段,還得遍歷去查找哪些 sql使用了這個字段?多少次看到在代碼中直接傳入字段名作為查詢參數感到別扭?如果將表結構字段都用java對象去描述,能夠解決這些問題,就不必要在 乎是不是POJO了,后面看example的時候應該能體會這么做的一些好處,至少我覺得是挺方便的,將大部分查詢脫離表結構設計。

2、簡單的數據庫路由:如果分庫結構不是太復雜(比如簡單的讀寫分離、或者多個庫集成),BaseDao可以自 動進行路由(比如讀寫分離,根據業務模式指定讀、寫庫),如果非默認的路由規則,也可以通過手動設置的模式,進行數據庫路由。數據庫路由直接由 Entity指定,所有的路由都是根據Entity識別,也就是說查詢也是圍繞Entity展開的,避免類似使用springjdbc的時候,各種 template實例跳來跳去,硬編碼引入,寫一個業務還得看看到底該用哪個template,尤其是多個數據庫共用一個template實例的時候。

3、QueryBuilder:單表查詢基本上都可以實現零Sql(除非查詢條件特別復雜的),更新、刪除等操作也可以通過QueryBuilder進行批量處理,不局限于根據主鍵來處理。

4、分表操作的支持:對于分表操作和常規的使用沒有區別,只是指定分表規則,mybatis好像也可以通過制定參數實現分表處理,沒搞清楚hibernate對這個是怎么處理的(hibernate好像是bean和表一對一綁定的)?

【項目地址】:https://github.com/franticwind/sborm

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