ORM 是 Object Relational Mapping 的縮寫,譯為 “對象關係映射” 框架。
所謂的 ORM 框架就是一種為了解決面向對象與關係型數據庫中數據類型不匹配的技術,它通過描述 Java 對象與數據庫表之間的映射關係,自動將 Java 應用程序中的對象持久化到關係型數據庫的表中。
ORM 框架是一種數據持久化技術,即在對象模型和關係型數據庫之間建立起對應關係,並且提供一種機制,可通過 JavaBean 對象操作數據庫表中的數據。
在實際開發中,程序員使用面嚮對象的技術操作數據,而存儲數據時,使用的卻是關係型數據庫,這樣就造成了很多不便。ORM 可以在對象模型和關係型數據庫的表之間建立一座橋樑,程序員使用 API 直接操作 JavaBean 對象就可以實現數據的存儲、查詢、更改和刪除等操作。
MyBatis 框架通過簡單的 XML 或註解進行配置和原始映射,將實體類和 SQL 語句之間建立起映射關係,是一種半自動化的 ORM 實現。
主流的 Java ORM 框架
當前 Java ORM 框架產品有很多,常見的框架有 Hibernate 和 MyBatis,其主要區別如下。
1) Hibernate
Hibernate 框架是一個全表映射的框架。通常開發者只要定義好持久化對象到數據庫表的映射關係,就可以通過 Hibernate 框架提供的方法完成持久層操作。
開發者並不需要熟練地掌握 SQL 語句的編寫,Hibernate 框架會根據編制的存儲邏輯,自動生成對應的 SQL,並調用 JDBC 接口來執行,所以其開發效率會高於 MyBatis 框架。
然而 Hibernate 框架自身也存在一些缺點,例如:
多表關聯時,對 SQL 查詢的支持較差;
更新數據時,需要發送所有字段;
不支持存儲過程;
不能通過優化 SQL 來優化性能。
這些問題導致其只適合在場景不太複雜且對性能要求不高的項目中使用。
Hibernate 官網:http://hibernate.org/
2) MyBatis
MyBatis 框架是一個半自動映射的框架。這裏所謂的 “半自動” 是相對於 Hibernate 框架全表映射而言的,MyBatis 框架需要手動匹配提供 POJO、SQL 和映射關係,而 Hibernate 框架只需提供 POJO 和映射關係即可。
與 Hibernate 框架相比,雖然使用 MyBatis 框架手動編寫 SQL 要比使用 Hibernate 框架的工作量大,但 MyBatis 框架可以配置動態 SQL 並優化 SQL、通過配置決定 SQL 的映射規則,以及支持存儲過程等。對於一些複雜的和需要優化性能的項目來説,顯然使用 MyBatis 框架更加合適。
MyBatis 框架可應用於需求多變的互聯網項目,如電商項目;Hibernate 框架可應用於需求明確、業務固定的項目,如 OA 項目、ERP 項目等。
3) gaarason
讓連接數據庫以及對數據庫進行增刪改查操作變得非常簡單,不論希望使用原生 SQL、還是查詢構造器,還是 Eloquent ORM。
Eloquent ORM 提供一個美觀、簡單的與數據庫打交道的 ActiveRecord 實現,每個數據表都對應一個與該表數據結構對應的實體(Entity),以及的進行交互的模型(Model),通過模型類,你可以對數據表進行查詢、插入、更新、刪除等操作,並將結果反映到實體實例化的 java 對象中。
對於關聯關係 Eloquent ORM 提供了富有表現力的聲明方式,與簡潔的使用方法,並專注在內部進行查詢與內存優化,在複雜的關係中有仍然有着良好的體驗。
兼容於其他常見的 ORM 框架, 以及常見的數據源 (DataSource)
// 查詢id為4的一條數據 select * from student where id = 4 limit 1
Student student = studentModel.find(4).toObject();
// 表達式列名風格 select name,age from student where id in (1,2,3)
List<Student> Students = studentModel.newQuery().whereIn(Student::getId, 1,2,3)
.select(Student::getName).select(Student::getAge)
.get().toObjectList();
// 稍複雜嵌套的語句 select id,name from student where id=3 or(age>11 and id=7 and(id between 4 and 10 and age>11))
List<Student> Students = studentModel.newQuery().where("id", "3").orWhere(
builder -> builder.where("age", ">", "11").where("id", "7").andWhere(
builder2 -> builder2.whereBetween("id", "4", "10").where("age", ">", "11")
)
).select("id", "name").get().toObjectList();
// 關聯查詢 找出學生們的老師們的父親們的那些房子
List<Student> Students = studentModel.newQuery().whereIn("id", "1","2","3").get().with("teacher.father.house").toObjectList();
// 增加關聯 給id為8的學生增加3名老師(id分別為1,2,3)
studentModel.findOrFail(8).bind("teachers").attach( teacherModel.findMany(1,2,3) );
gaarason 中文文檔:https://github.com/gaarason/d...
4) spring data JPA
spirng data jpa是spring提供的一套簡化JPA開發的框架,按照約定好的【方法命名規則】寫dao層接口,就可以在不寫接口實現的情況下,實現對數據庫的訪問和操作。同時提供了很多除了CRUD之外的功能,如分頁、排序、複雜查詢等等。
Spring Data JPA 可以理解為 JPA 規範的再次封裝抽象,底層還是使用了 Hibernate 的 JPA 技術實現。