为什么需要ORM 框架
通過上面的操作,其實(shí)我們已經(jīng)了解ORM 框架的基本實(shí)現(xiàn)原理。ORM 是指對(duì)象關(guān)系映射(Object Relation Mapping),映射的不僅僅只是對(duì)象值,還有對(duì)象與對(duì)象之間的關(guān)系。例如一對(duì)多、多對(duì)多、一對(duì)一這樣的表關(guān)系。現(xiàn)在市面上ORM 框架也非常之多,有大家所熟知的Hibernate、Spring JDBC、MyBatis、JPA 等。我在這里做一個(gè)簡單的總結(jié),如下表:
| Hibernate | 全自動(dòng)(檔) | 不需要寫一句SQL |
| MyBatis | 半自動(dòng)(檔) | 手自一體,支持簡單的映射,復(fù)雜關(guān)系需要自己寫SQL |
| Spring JDBC | 純手動(dòng)(檔) | 所有的SQL 都要自己,它幫我們?cè)O(shè)計(jì)了一套標(biāo)準(zhǔn)流程 |
既然,市面上有這么多選擇,我又為什么還要自己寫ORM 框架呢?
這得從我的一次空降擔(dān)任架構(gòu)師的經(jīng)驗(yàn)說起。空降面臨最大的難題就是如何取得團(tuán)隊(duì)小伙伴們的信任。當(dāng)時(shí),團(tuán)隊(duì)總共就8 人,每個(gè)人水平層次不齊,甚至有些還沒接觸過MySQL,諸如Redis 等緩存中間件就不需要談。基本只會(huì)使用Hibernate 的CRUD,而且已經(jīng)影響到了系統(tǒng)性能。由于工期緊張,沒有時(shí)間和精力給團(tuán)隊(duì)做系統(tǒng)培訓(xùn),也為了兼顧可控性,于是就產(chǎn)生了自研ORM 框架的想法。我做了這樣的頂層設(shè)計(jì),以降低團(tuán)隊(duì)小伙伴的存息成本,頂層接口統(tǒng)一參數(shù)、統(tǒng)一返回值,具體如下:
1、規(guī)定查詢方法的接口模型為:
/*** 獲取列表* @param queryRule 查詢條件* @return*/ List<T> select(QueryRule queryRule) throws Exception;/*** 獲取分頁結(jié)果* @param queryRule 查詢條件* @param pageNo 頁碼* @param pageSize 每頁條數(shù)* @return*/ Page<?> select(QueryRule queryRule,int pageNo,int pageSize) throws Exception;/*** 根據(jù)SQL獲取列表* @param sql SQL語句* @param args 參數(shù)* @return*/ List<Map<String,Object>> selectBySql(String sql, Object... args) throws Exception;/*** 根據(jù)SQL獲取分頁* @param sql SQL語句* @param pageNo 頁碼* @param pageSize 每頁條數(shù)* @return*/ Page<Map<String,Object>> selectBySqlToPage(String sql, Object [] param, int pageNo, int pageSize) throws Exception;2、規(guī)定刪除方法的接口模型為:
?
3、規(guī)定插入方法的接口模型為:
/*** 插入一條記錄并返回插入后的ID* @param entity 只要entity不等于null,就執(zhí)行插入* @return*/ PK insertAndReturnId(T entity) throws Exception;/*** 插入一條記錄自增ID* @param entity* @return* @throws Exception*/ boolean insert(T entity) throws Exception;/*** 批量插入* @param list* @return 返回受影響的行數(shù)* @throws Exception*/ int insertAll(List<T> list) throws Exception;4、規(guī)定修改方法的接口模型為:
/*** 修改一條記錄* @param entity entity中的ID不能為空,如果ID為空,其他條件不能為空,都為空不予執(zhí)行* @return* @throws Exception*/ boolean update(T entity) throws Exception;利用這一套基礎(chǔ)的API,后面我又基于Redis、MongoDB、ElasticSearch、Hive、HBase各封裝了一套,以此來講降低團(tuán)隊(duì)學(xué)習(xí)成本。也大大提升了程序可控性,也更方便統(tǒng)一監(jiān)控。
?
總結(jié)
以上是生活随笔為你收集整理的为什么需要ORM 框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据一致性理解
- 下一篇: 搭建基础架构-Page