尤德華 翟高粵
摘 要:MyBatis是當(dāng)今流行的ORM開發(fā)框架,它能解決大部分企業(yè)數(shù)據(jù)庫應(yīng)用開發(fā)的復(fù)雜性問題。對于Java開發(fā)人員來說,掌握ORM框架的基本使用,已是入職Java軟件開發(fā)行業(yè)的必備技能之一。本文主要介紹MyBatis框架及其體系結(jié)構(gòu)的基本內(nèi)容及應(yīng)用,并通過一個(gè)實(shí)例說明MyBatis框架的基本使用方法,以面向?qū)ο蟮姆绞絹聿僮鞒志没瘜ο?,通過ORM框架的映射關(guān)系把面向?qū)ο蟮牟僮鬓D(zhuǎn)換成底層的SQL操作。
關(guān)鍵詞:MyBatis框架;ORM;對象關(guān)系映射;數(shù)據(jù)庫編程
一、引言
MyBatis是當(dāng)前主流的Java持久層框架之一,它是一種ORM框架,它的性能優(yōu)異,具有高度的靈活性、可優(yōu)化性和易于維護(hù)等特點(diǎn),受到了廣大互聯(lián)網(wǎng)企業(yè)的青睞,是目前大型互聯(lián)網(wǎng)項(xiàng)目的首選框架。MyBatis 的主要思想是將程序中的大量 SQL 語句剝離出來,使用 XML 文件或注解的方式實(shí)現(xiàn) SQL 的靈活配置,將 SQL 語句與程序代碼分離,在不修改程序代碼的情況下,直接在配置文件中修改 SQL 語句。
二、相關(guān)理論
(一)ORM與MyBatis
MyBatis是一個(gè)支持普通SQL查詢、存儲過程以及高級映射的持久層框架,它消除了幾乎所有的JDBC代碼和參數(shù)的手動設(shè)置以及對結(jié)果集的檢索,并使用簡單的XML或注解進(jìn)行配置和原始映射,用以將接口和Java的POJO映射成數(shù)據(jù)庫的記錄,使得Java開發(fā)人員可以使用面向?qū)ο蟮木幊趟枷雭聿僮鲾?shù)據(jù)庫。
MyBatis框架也被稱為ORM框架。所謂ORM就是一種為了解決面向?qū)ο笈c關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)類型不匹配的技術(shù),它通過描述Java對象與數(shù)據(jù)庫表之間的映射關(guān)系,自動將Java應(yīng)用程序中的對象持久化到關(guān)系型數(shù)據(jù)庫的表中。ORM框架的工作原理如圖1所示。
從圖1可以看出,使用ORM框架后,應(yīng)用程序不再直接訪問底層數(shù)據(jù)庫,而是以面向?qū)ο蟮姆绞絹聿僮鞒志没瘜ο?,而ORM框架則會通過映射關(guān)系將這些面向?qū)ο蟮牟僮鬓D(zhuǎn)換成底層的SQL操作。另外,MyBatis還可以配置動態(tài)SQL并優(yōu)化SQL,可以通過配置決定SQL的映射規(guī)則,對于一些復(fù)雜的和需要優(yōu)化性能的項(xiàng)目來說,使用MyBatis更加合適。
(二)MyBatis的工作原理
MyBatis的工作原理詳見圖2所示。從圖2可以看出,MyBatis框架在操作數(shù)據(jù)庫時(shí),大體經(jīng)過了8個(gè)步驟。
(1)讀取MyBatis配置文件mybatis-congfig.xml文件,該文件作為MyBatis的全局配置文件,配置了MyBatis的運(yùn)行環(huán)境等信息,其中主要內(nèi)容是獲取數(shù)據(jù)庫連接。
(2)加載映射文件Mapper.xml,該文件配置了操作數(shù)據(jù)庫的SQL語句,但需要在mybatis-congfig.xml中加載才能執(zhí)行,可以加載多個(gè)配置文件,每個(gè)配置文件對應(yīng)數(shù)據(jù)庫中的一張表。
(3)構(gòu)建會話工廠,通過MyBatis的環(huán)境等配置信息構(gòu)建會話工廠SqlSessionFactory。
(4)創(chuàng)建SqlSession對象,由會話工廠創(chuàng)建SqlSession對象,該對象中包含了執(zhí)行SQL的所有方法。
(5)MyBatis底層定義了一個(gè)Executor接口來操作數(shù)據(jù)庫,它會根據(jù)SqlSessionFactory傳遞的參數(shù)動態(tài)地生成需要執(zhí)行的SQL語句,同時(shí)負(fù)責(zé)查詢緩存的維護(hù)。
(6)在Executor接口的執(zhí)行方法中,包含一個(gè)MappedStatement類型的參數(shù),該參數(shù)是對映射信息的封裝,用于存儲映射的SQL語句的id、參數(shù)等。
(7)輸入?yún)?shù)映射。
(8)輸出結(jié)果映射。
三、MySql數(shù)據(jù)庫
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。
MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型和大型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。
MySQL和MyBatis進(jìn)行配合使用,兼容性好,開發(fā)效率高。
四、ORM編程實(shí)例
下面以一個(gè)查詢實(shí)例來說明MyBatis的編程步驟。在許多項(xiàng)目的實(shí)際開發(fā)中,單條數(shù)據(jù)的簡單查詢經(jīng)常被涉及。單條數(shù)據(jù)查詢的性質(zhì)是精確查詢,接下來本文以一系列步驟的形式來說明如何使用MyBatis框架根據(jù)客戶編號查詢客戶信息。
根據(jù)客戶編號查詢客戶信息主要是通過查詢客戶表中的主鍵來實(shí)現(xiàn)的。
(1)在MySQL數(shù)據(jù)庫中,創(chuàng)建一個(gè)名為mybatis的數(shù)據(jù)庫,在此數(shù)據(jù)庫中創(chuàng)建一個(gè)t_customer表,同時(shí)預(yù)先插入幾條數(shù)據(jù)。
(2)在MyEclipse中,創(chuàng)建一個(gè)名為firstMyBatis的Web項(xiàng)目,將MyBatis的核心JAR包、lib目錄中的依賴JAR包,以及MySQL數(shù)據(jù)庫的驅(qū)動JAR包一同添加到項(xiàng)目lib目錄下,并發(fā)布到類路徑中。
(3)編輯MyBatis的log4j輸出日志信息文件,通過該文件可以在控制臺輸出SQL語句。
(4)在src目錄下,創(chuàng)建一個(gè)com.itheima.po包,在該包下創(chuàng)建持久化類Customer,并在類中聲明id、username、jobs和phone屬性,及其對應(yīng)的getter和setter方法。
(5)在src目錄下,創(chuàng)建一個(gè)com.itheima.mapper包,并在包中創(chuàng)建映射文件CustomerMapper.xml,部分核心代碼如下。
<!--根據(jù)客戶編號獲取客戶信息 -->
(6)在src目錄下,創(chuàng)建MyBatis的核心配置文件mybatis-config.xml,部分核心代碼如下。
<!--1.配置環(huán)境 ,默認(rèn)的環(huán)境id為mysql-->
<!--1.2.配置id為mysql的數(shù)據(jù)庫環(huán)境 -->
<!-- 使用JDBC的事務(wù)管理 -->
<!--數(shù)據(jù)庫連接池 -->
value="jdbc:mysql://localhost:3306/mybatis" /> <!--2.配置Mapper的位置 --> (7)在src目錄下,創(chuàng)建一個(gè)com.itheima.test包,在該包下創(chuàng)建測試類MyBatisTest,并在類中編寫測試方法findCustomerByIdTest(),核心代碼如下。 // 1、讀取配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 2、根據(jù)配置文件構(gòu)建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3、通過SqlSessionFactory創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 4、SqlSession執(zhí)行映射文件中定義的SQL,并返回映射結(jié)果 Customer customer = sqlSession.selectOne("com.itheima.mapper" + ".CustomerMapper.findCustomerById", 1); // 打印輸出結(jié)果 System.out.println(customer.toString()); // 5、關(guān)閉SqlSession sqlSession.close(); 五、結(jié)論 本文首先對MyBatis框架的概念、特點(diǎn)和下載使用進(jìn)行了描述說明,然后對MyBatis框架的工作原理進(jìn)行了流程分析,最后通過一個(gè)簡單的查找實(shí)例來演示MyBatis框架的基本使用。通過本文的學(xué)習(xí),可以了解MyBatis的概念和作用,熟悉MyBatis的工作原理,并能使用MyBatis框架來完成基本的數(shù)據(jù)庫操作。 參考文獻(xiàn): [1]沃爾斯. Spring實(shí)戰(zhàn) [M]. 人民郵電出版社,2016. [2]卡內(nèi)爾. Spring開發(fā)三劍客[M],人民郵電出版社, 2020. [3] 陳恒等. Spring Boot從入門到實(shí)戰(zhàn)[M]. 清華大學(xué)出版社出版社,2020.