ORM
ORM 即對象關系映射(Object Relational Mapping),是一種程序設計技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。下面從基本概念、工作原理、優勢與劣勢、常見的 ORM 框架等方面詳細介紹 ORM。
常見的orm框架有:Mybatis-plus(ibatis)、Hibernate、Jpa。
基本概念
在軟件開發中,面向對象編程(OOP)使用對象來表示數據和處理邏輯,而關系型數據庫(RDBMS)則使用表、行和列來存儲數據。這兩種模型在數據表示和操作方式上存在差異,ORM 就是為了解決這種差異而出現的技術。它將數據庫中的表映射為對象,表中的行映射為對象的實例,列映射為對象的屬性,從而讓開發者可以使用面向對象的方式來操作數據庫,而無需編寫復雜的 SQL 語句。
工作原理
ORM 框架的核心工作流程如下:
- 映射配置:開發者需要定義對象和數據庫表之間的映射關系。這可以通過注解、XML 配置文件等方式來實現。例如,在 Java 中使用 Hibernate 框架時,可以使用?
@Entity
、@Table
、@Column
?等注解來指定對象和表的映射關系。- 對象操作:開發者使用面向對象的方式對對象進行創建、讀取、更新和刪除(CRUD)操作。例如,創建一個對象實例并設置其屬性值,然后調用 ORM 框架提供的方法將對象保存到數據庫中。
- SQL 生成:ORM 框架根據對象的操作和映射配置,自動生成相應的 SQL 語句。例如,當調用保存對象的方法時,ORM 框架會生成?
INSERT
?語句;當調用查詢對象的方法時,會生成?SELECT
?語句。- 數據庫交互:ORM 框架將生成的 SQL 語句發送到數據庫執行,并將數據庫返回的結果集轉換為對象實例。例如,將查詢結果集中的每一行數據轉換為一個對象實例,并將列值賦給對象的屬性。
優勢
- 提高開發效率:開發者可以使用面向對象的方式操作數據庫,避免編寫大量的 SQL 語句,減少了開發時間和工作量。
- 降低代碼耦合度:將數據庫操作封裝在 ORM 框架中,使業務邏輯和數據庫操作分離,提高了代碼的可維護性和可測試性。
- 支持跨數據庫:ORM 框架可以屏蔽不同數據庫之間的差異,開發者可以在不修改業務代碼的情況下切換數據庫。
劣勢
- 性能開銷:ORM 框架需要進行對象和數據庫之間的映射和轉換,會帶來一定的性能開銷。在處理大量數據或復雜查詢時,性能可能不如原生 SQL。
- 學習成本:使用 ORM 框架需要學習框架的使用方法和配置規則,對于初學者來說可能有一定的學習成本。
- 復雜查詢受限:對于一些復雜的 SQL 查詢,ORM 框架可能無法直接支持,需要編寫原生 SQL 語句。
常見的 ORM 框架
- Java 中的 Hibernate:是一個廣泛使用的 Java ORM 框架,功能強大,支持多種數據庫,提供了豐富的映射配置和查詢功能。
- Java 中的 MyBatis:是一個輕量級的 Java ORM 框架,它允許開發者靈活地編寫 SQL 語句,同時也提供了對象映射功能。
- Python 中的 SQLAlchemy:是一個流行的 Python ORM 框架,支持多種數據庫,提供了高級的查詢和事務管理功能。
- .NET 中的 Entity Framework:是微軟官方提供的 .NET ORM 框架,與 .NET 平臺緊密集成,支持多種數據庫。
實現面向對象編程語言里,不同類型系統的數據之間轉換
Java ??????????數據庫
Integer ?????Integer
String? ? ? ? ?varchar
ORM的優點:
最大的優勢隱藏了數據訪問細節,“封閉”的通用數據庫交互,ORM的核心。他使得我們的通用數據庫交互變得簡單易行,并且完全不用考慮該死的SQL語句。快速開發,由此而來。
ORM的缺點:
?1,性能較低。無可避免的,自動化意味著映射和關聯管理,代價是犧牲性能(早期,這是所有不喜歡ORM人的共同點)。現在的各種ORM框架都在嘗試使用各種方法來減輕這塊(LazyLoad,Cache),效果還是很顯著的。
?2,對多表查詢力不從心。
JDBC(Java Database Connectivity)
概念
JDBC 是 Java 編程語言用于與數據庫進行交互的標準 API,它為 Java 開發人員提供了一種統一的方式來訪問各種不同類型的數據庫,如 MySQL、Oracle、SQL Server 等。通過 JDBC,開發者可以執行 SQL 語句,實現對數據庫的增刪改查操作。
工作原理
- 加載數據庫驅動:不同的數據庫有不同的 JDBC 驅動程序,需要使用?
Class.forName()
?方法加載相應的驅動類。- 建立數據庫連接:使用?
DriverManager.getConnection()
?方法,傳入數據庫的 URL、用戶名和密碼,建立與數據庫的連接。- 創建 Statement 對象:通過連接對象創建?
Statement
、PreparedStatement
?或?CallableStatement
?對象,用于執行 SQL 語句。- 執行 SQL 語句:使用?
Statement
?對象的?executeQuery()
、executeUpdate()
?等方法執行 SQL 語句。- 處理結果集:如果執行的是查詢語句,會返回一個?
ResultSet
?對象,通過該對象可以遍歷查詢結果。- 關閉資源:使用完數據庫連接、
Statement
?對象和?ResultSet
?對象后,需要關閉它們,以釋放資源。
缺點:
- 編碼繁瑣,效率低(指的是編碼效率低,重復代碼多)。
- 數據庫連接的創建和釋放比較重復,也造成了系統資源的浪費
- 大量硬編碼,缺乏靈活性,不利于后期維護
- 參數的賦值和數據的封裝全是手動進行
try?{//加載數據庫驅動Class.forName("com.mysql.jdbc.Driver");//通過驅動管理類獲取數據庫鏈接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");//定義sql語句?表示占位符String sql = "select * from t_book where author = ?";//獲取預處理statementPreparedStatement ?preparedStatement = connection.prepareStatement(sql);//設置參數,第一個參數為sql語句中參數的序號(從1開始),第二個參數為設置的參數值preparedStatement.setString(1, "張三");//向數據庫發出sql執行查詢,查詢出結果集ResultSet??resultSet = ?preparedStatement.executeQuery();//遍歷查詢結果集bookList = new ArrayList<>();while(resultSet.next()){Book book=new Book();book.setId(resultSet.getInt("id"));book.setName(resultSet.getString("bname"));book.setAuthor(resultSet.getString("author"));book.setPrice(resultSet.getDouble("price"));bookList.add(book);}} catch (Exception e) {}finally{//釋放資源resultSet.close();preparedStatement.close();connection.close(); ???}
第一類:著重對JDBC進行API層的抽取和封裝,以及功能的增強,
典型代表是Apache的DbUtils。
第二類:借鑒面向對象的思想,讓程序員以操作對象的方式操作數據庫,無需編寫sql語句,典型代表是ORM(mybits )。
JDBC有四個核心對象:
(1)DriverManager,用于注冊數據庫連接
(2)Connection,與數據庫連接對象
(3)Statement/PrepareStatement,操作數據庫SQL語句的對象
(4)ResultSet,結果集或一張虛擬表
Mybatis
?集成第三方分頁插件(如 PageHelper)
待完善