- SSM輕量級框架應用實戰
- 肖睿 肖靜 董寧
- 4630字
- 2019-03-07 14:02:06
任務2 搭建MyBatis環境
關鍵步驟如下。
? 下載需要的jar文件。
? 部署jar文件。
? 創建MyBatis核心配置文件configuration.xml。
? 創建持久化類(POJO)和SQL映射文件。
? 創建測試類。
1.2.1 什么是數據持久化
數據持久化是將內存中的數據模型轉換為存儲模型,以及將存儲模型轉換為內存中的數據模型的統稱。例如,文件的存儲、數據的讀取等都是數據持久化操作。數據模型可以是任何數據結構或對象模型,存儲模型可以是關系模型、XML、二進制流等。
結合以上的概念描述,我們思考一下,之前是否接觸過數據持久化?是否做過數據持久化的操作?答案是肯定的。編寫應用程序操作數據表,對數據表進行增刪改查等操作,都是數據持久化操作。MyBatis和數據持久化之間有什么關系呢?帶著這個問題來學習下面的內容。
1.2.2 MyBatis框架及ORM
1.MyBatis框架簡介
MyBatis是一個開源的數據持久層框架。它內部封裝了通過JDBC訪問數據庫的操作,支持普通的SQL查詢、存儲過程和高級映射,幾乎消除了所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis作為持久層框架,其主要思想是將程序中的大量SQL語句剝離出來,配置在配置文件中,實現SQL的靈活配置。這樣做能將SQL與程序代碼分離,可以在不修改程序代碼的情況下,直接在配置文件中修改SQL。
MyBatis的前身是iBatis,是Apache的一個開源項目,2010年這個項目由Apache Software Foundation遷移到了Google Code,并更名為MyBatis。2013年又遷移到Github。
MyBatis官網:http://mybatis.org。
Github:https://github.com/mybatis。
2.什么是ORM

持久化與ORM
對象/關系映射(Object/Relational Mapping, ORM)是一種數據持久化技術。它在對象模型和關系型數據庫之間建立起對應關系,并且提供了一種機制,通過JavaBean對象去操作數據庫表中的數據,如圖1.4所示。

圖1.4 ORM映射關系
在實際開發中,程序員使用面向對象的技術操作數據,而當存儲數據時,使用的卻是關系型數據庫,這樣造成了很多不便。ORM在對象模型和關系數據庫的表之間建立了一座橋梁,有了它,程序員就不需要再使用SQL語句操作數據庫中的表,使用API直接操作JavaBean對象就可以實現數據的存儲、查詢、更改和刪除等操作。MyBatis通過簡單的XML或者注解進行配置和原始映射,在實體類和SQL語句之間建立映射關系,是一種半自動化的ORM實現。
3.MyBatis是ORM解決方案

搭建MyBatis開發環境
基于ORM, MyBatis在對象模型和關系數據庫的表之間建立了一座橋梁。通過MyBatis,可以建立SQL關系映射,便捷地實現數據存儲、查詢、更改和刪除等操作。
1.2.3 搭建MyBatis環境
在MyEclipse中新建工程后,需做以下準備工作才可以使用MyBatis,如圖1.5所示。

圖1.5 MyBatis環境準備步驟
1.下載需要的jar文件
MyBatis的官網可以下載到最新發布版本的MyBatis,其他發布版本的MyBatis的jar文件也可以從官方網站下載。
提示
推薦下載mybatis-3.2.2.zip和mybatis-3-mybatis-3.2.2.zip(通過相應版本的“Source Code(zip)”鏈接下載)。
(1)mybatis-3.2.2.zip
mybatis-3.2.2.zip是MyBatis的jar文件,解壓后的目錄結構如圖1.6所示。

圖1.6 目錄結構
注意查看根目錄(mybatis-3.2.2)和lib目錄。在根目錄下存放著mybatis-3.2.2.jar和mybatis-3.2.2.pdf,后者為MyBatis官方使用手冊。
lib目錄下存放著編譯依賴包,如圖1.7所示。這些jar文件的作用如表1-1所示。

圖1.7 MyBatis編譯依賴包
表1-1 MyBatis編譯依賴包中文件說明

(2)mybatis-3-mybatis-3.2.2.zip
mybatis-3-mybatis-3.2.2.zip是MyBatis的源碼包,里面是MyBatis的所有源代碼,解壓后目錄結構如圖1.8所示。

圖1.8 目錄結構
2.部署jar文件
部署jar文件的具體操作步驟如下。
(1)將下載的mybatis-3.2.2.jar、mysql-connector-java-5.1.0-bin.ja(r MySQL數據庫驅動jar文件)及log4j-1.2.17.jar(負責日志輸出的jar文件)復制到建好的工程WEB-INF下的lib目錄中。
(2)下面通過MyEclipse導入上述包。首先在MyEclipse中的工程上右擊,選擇“Build Path→Configure Build Path”選項,如圖1.9所示。

圖1.9 “Configure Build Path”選擇界面
(3)在彈出的窗體中單擊“Add JARs”按鈕,如圖1.10所示。

圖1.10 “Add JARs”選用界面
(4)在彈出的“JAR Selection”窗體中選擇lib下剛剛復制的jar文件,如圖1.11所示。

圖1.11 復制jar文件界面
(5)單擊“OK”按鈕,這時在工程中加入了所選的jar文件,如圖1.12所示。

圖1.12 導入支持的jar文件界面
為了更方便地學習MyBatis,可以在MyEclipse環境中設置當前工程中mybatis-3.2.2.jar的源碼,具體步驟如下。
(1)選中mybatis-3.2.2.jar,單擊右鍵彈出的快捷菜單如圖1.13所示。

圖1.13 右擊mybatis-3.2.2.jar彈出的快捷菜單
(2)選擇“Properties”選項,進入屬性界面,選中“Java Source Attachment”選項,如圖1.14所示。

圖1.14 查看mybatis-3.2.2.jar的屬性
(3)單擊“External Folder”按鈕,找到源碼所在的目錄,即/ mybatis-3-mybatis-3.2.2,如圖1.15所示,選中目錄后單擊“確定”按鈕即可。需要注意的是,若源碼為jar文件,則單擊“External File”按鈕,找到源碼所在的目錄,選中jar文件即可,此處不再贅述。

圖1.15 定位MyBatis源碼所在目錄
3.創建MyBatis核心配置文件configuration.xml
MyBatis核心配置文件主要用于配置數據庫連接和MyBatis運行時所需的各種特性,包含了設置和影響MyBatis行為的屬性。
為了方便管理以后各框架集成所需的配置文件,需在項目工程下新建Source Folder類型的resources目錄,并在此目錄下添加MyBatis的核心配置文件,默認文件名為“configuration.xml”。需要注意的是,為了在框架集成時更好地區分各個配置文件,我們一般將此文件命名為“mybatis-config.xml”。該文件需要配置數據庫連接信息和MyBatis的參數,關鍵代碼如示例1所示。
注意
MyBatis的示例和上機練習均使用超市訂單管理系統,該系統使用MySQL數據庫,在root用戶下導入SQL腳本(smbms_db.sql)后,數據庫為smbms,包括用戶表、角色表、供應商表、訂單表、地址信息表。在任務2最后的技能訓練中會有超市訂單管理系統的功能介紹。
如果沒有特別說明,MyBatis的示例和上機練習都在測試類中運行,運行結果在控制臺輸出。
示例1
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <! -- 引入database.properties文件--> <properties resource="database.properties"/> <! -- 配置mybatis的log實現為LOG4J --> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <! -- 配置mybatis多套運行環境 --> <environments default="development"> <environment id="development"> <! --配置事務管理,采用JDBC的事務管理 --> <transactionManager type="JDBC"></transactionManager> <! -- POOLED:mybatis自帶的數據源,JNDI:基于tomcat的數據源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <! -- 將mapper文件加入配置文件中 --> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.xml"/> </mappers> </configuration>
mybatis-config.xml文件中幾個常用元素的作用如下。
(1)configuration:配置文件的根元素節點。
(2)properties:通過resource屬性從外部指定properties屬性文件(database. properties),該屬性文件描述數據庫連接的相關配置(數據庫驅動、連接數據庫的url、數據庫用戶名、數據庫密碼),其位置也是在/resources目錄下。
(3)settings:設置MyBatis運行中的一些行為,比如此處設置MyBatis的log日志實現為LOG4J,即使用log4j實現日志功能。
(4)environments:表示配置MyBatis的多套運行環境,將SQL映射到多個不同的數據庫上,該元素節點下可以配置多個environment子元素節點,但是必須指定其中一個為默認運行環境(通過default指定)。
(5)environment:配置MyBatis的一套運行環境,需指定運行環境ID、事務管理、數據源配置等相關信息。
(6)mappers:作用是告訴MyBatis去哪里找到SQL映射文件(該文件內容是開發者定義的映射SQL語句),整個項目中可以有一個或多個SQL映射文件。
(7)mapper:mappers的子元素節點,具體指定SQL映射文件的路徑,其中resource屬性的值表述了SQL映射文件的路徑(類資源路徑)。

編寫MyBatis的核心配置文件
注意
mybatis-config.xml文件的元素節點是有一定順序的,如果節點位置不按順序排位,那么XML文件會報錯。
完成了MyBatis的配置文件mybatis-config.xml的創建,接下來就要準備持久化類和SQL映射文件。
4.創建持久化類(POJO)和SQL映射文件
持久化類是指其實例狀態需要被MyBatis持久化到數據庫中的類。在應用的設計中,持久化類通常對應需求中的業務實體。MyBatis一般采用POJO(Plain Ordinary Java Object)編程模型來實現持久化類,與POJO類配合完成持久化工作是MyBatis最常見的工作模式。
POJO從字面上來講就是普通Java對象。POJO類可以簡單地理解為符合JavaBean規范的實體類,它不需要繼承和實現任何特殊的Java基類或者接口。JavaBean對象的狀態保存在屬性中,訪問屬性必須通過對應的getter和setter方法。
下面首先以用戶表(smbms_user)為例,定義用戶POJO類。User.java的關鍵代碼如示例2所示。
示例2
public class User { /* 字段 */ private Integer id; //id private String userCode; //用戶編碼 private String userName; //用戶名稱 private String userPassword; //用戶密碼 private Integer gender; //性別 private Date birthday; //出生日期 private String phone; //電話 private String address; //地址 private Integer userRole; //用戶角色 private Integer createdBy; //創建者 private Date creationDate; //創建時間 private Integer modifyBy; //更新者 private Date modifyDate; //更新時間 //省略getter&setter方法 }
注意
在MyBatis中,不需要POJO類名與數據庫表名一致,因為MyBatis是POJO與SQL語句之間的映射機制,一般情況下,保證POJO對象的屬性與數據庫表的字段名一致即可。
接下來,繼續創建SQL映射文件,完成與POJO(實體類)的映射,該文件也是一個XML文件,名為UserMapper.xml,關鍵代碼如示例3所示。
示例3
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.smbms.dao.user.UserMapper"> <! -- 查詢用戶表記錄數 --> <select id="count" resultType="int"> select count(1) as count from smbms_user </select> </mapper>
經驗
SQL映射文件一般都對應于相應的POJO,所以一般都是以POJO的名稱+Mapper的規則來命名。當然該mapper文件屬于DAO層的操作,應該放置在dao包下,并根據業務功能進行分包放置,如cn.smbms.dao.user.UserMapper. xml。
示例3中UserMapper.xml定義了SQL語句,其中各元素的含義如下。
? mapper:映射文件的根元素節點,只有一個屬性namespace。
? namespace:用于區分不同的mapper,全局唯一。
? select:表示查詢語句,是MyBatis最常用的元素之一,常用屬性如下。
? id屬性:該命名空間下唯一標識符。
? resultType屬性:表示SQL語句返回值類型,此處通過SQL語句返回的是int數據類型。
5.創建測試類
在工程中加入JUnit4,創建測試類(UserMapperTest.java)進行功能測試,并在后臺打印出用戶表的記錄數,具體的實現步驟如下。
(1)讀取全局配置文件mybatis-config.xml,如以下代碼所示:
String resource = "mybatis-config.xml"; // 獲取mybatis-config.xml文件的輸入流 InputStream is = Resources.getResourceAsStream(resource);
(2)創建SqlSessionFactory對象,此對象可以完成對配置文件的讀取,如以下代碼所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
(3)創建SqlSession對象,此對象的作用是調用mapper文件進行數據操作,必須先把mapper文件引入到mybatis-config.xml中才能生效,如以下代碼所示:
int count = 0; SqlSession sqlSession = null; sqlSession = factory.openSession(); //MyBatis通過mapper文件的namespace和子元素的id來找到相應的SQL,從而執行查詢操作 count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count"); logger.debug("UserMapperTest count---> " + count);
(4)關閉SqlSession對象,如以下代碼所示:
sqlSession.close();
注意
本書所有的項目案例以及上機練習要求不再使用System.out.print進行后臺日志的輸出,一律使用log4j來實現日志的輸出。這需要在resources目錄下加入log4j.properties,并在MyBatis的核心配置文件(mybatis-config.xml)中設置MyBatis的LOG實現為log4j。
通過前面的學習,了解了MyBatis框架,學習了如何搭建MyBatis環境。接下來就根據上面的示例來對比JDBC,介紹一下MyBatis框架的優缺點。
1.2.4 MyBatis框架的優缺點及其適用場合
回顧DAO層代碼,以查詢用戶表記錄數為例,直接使用JDBC和MyBatis查詢的兩種實現方式的代碼如圖1.16所示。

圖1.16 JDBC與MyBatis直觀對比
用JDBC查詢返回的是ResultSet對象,ResultSet往往不能直接使用,還需要轉換成其他封裝類型,因此通過JDBC查詢并不能直接得到具體的業務對象,在整個查詢的過程中就需要做很多重復性的轉換工作,而使用MyBatis則可以將如下幾行JDBC代碼分解包裝。
? 第1、2行:對數據庫連接的管理,包括事務管理。
? 第3、4、5行:MyBatis通過配置文件來管理SQL以及輸入參數的映射。
? 第6、7、8、9行:MyBatis獲取返回結果到Java對象的映射,也通過配置文件管理。
1.MyBatis框架的優點
(1)與JDBC相比,減少了50%以上的代碼量。
(2)MyBatis是最簡單的持久化框架,小巧并且簡單易學。
(3)MyBatis相當靈活,不會對應用程序或者數據庫的現有設計強加任何影響,SQL寫在XML里,從程序代碼中徹底分離,既降低耦合度,又便于統一管理和優化,還可重用。
(4)提供XML標簽,支持編寫動態SQL語句。
(5)提供映射標簽,支持對象與數據庫的ORM字段關系映射。
2.MyBatis框架的缺點
(1)SQL語句的編寫工作量較大,對開發人員編寫SQL語句的功底有一定要求。
(2)SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。
3.MyBatis框架適用場合
MyBatis專注于SQL本身,是一個足夠靈活的DAO層解決方案。對性能要求很高的項目,或者需求變化較多的項目,如互聯網項目,MyBatis將是不錯的選擇。
介紹完MyBatis框架的特點之后,接下來介紹超市訂單管理系統,并完成相應的上機練習。
技能訓練
超市訂單管理系統是一個B/S架構的信息管理平臺,該系統的主要業務需求包括:記錄并維護某超市的供應商信息以及該超市與供應商之間的交易訂單信息。包括三種角色:系統管理員、經理、普通員工。其主要結構如圖1.17所示。

圖1.17 超市訂單管理系統
該系統使用MySQL數據庫,請按圖1.18所示的描述創建數據表。

圖1.18 超市訂單管理系統數據庫表及表間關系
圖1.18描述了超市訂單管理系統中的五張表以及它們之間的關系,下面通過表1-2至表1-6對這五張表進行說明。
表1-2 用戶表結構

表1-3 角色表結構

表1-4 供應商表結構

表1-5 訂單表結構

表1-6 地址信息表結構

注意
數據表的字段命名按照Java的駝峰命名規則,這樣在進行實體映射的時候,一是方便開發者的工作,二是使用MyBatis框架開發,也方便數據表字段與POJO的屬性進行自動映射。
上機練習1——搭建MyBatis環境并實現對供應商表的總記錄數的查詢
需求說明
為超市訂單管理系統搭建MyBatis環境,并實現對供應商表的總記錄數的查詢。
提示
(1)在MyEclipse中創建工程smbms,導入MyBatis所需的jar文件。
(2)創建MyBatis配置文件mybatis-config.xml。
(3)創建供應商表對應的實體類Provider和SQL映射文件ProviderMapper.xml。
(4)編寫測試類ProvideMapperTest.java,后臺運行輸出結果。