Mybatis框架簡介、搭建及核心元素講解
大家都知道當前比較流行的框架,如Spring、SpringMVC、Hibernate、Mybatis等框架,那今天咱們來講講當前比較流行的企業框架Mybatis。
首先先來介紹一下Mybatis這個框架:Mybatis是一個開源的資料持久化層框架,它內部封裝了通過JDBC訪問資料庫的操作,支援普通的SQL查詢,儲存過程和高階對映,幾乎消除了所有的JDBC程式碼和引數設定及結果集的檢索。
接下來說說Mybatis的優缺點:
優點:與JDBC相比,減少了50%以上的程式碼量,最簡單的持久化框架,小巧簡單易學,SQL程式碼從程式中徹底分離,可重用。提供了XML標籤,支援編寫動態SQL,提供對映標籤,支援物件與資料庫的ORM欄位對映。那麼什麼是ORM呢?
ORM(Object RelationMapping)即物件關係對映,是一種資料持久化技術,它在物件模型和關係型資料庫之間建立對應關係。
接下來說說Mybatis的缺點:
SQL語句編寫量大,對於開發人員有一定的要求,資料庫移植性差
Mybatis的環境搭建
首先我們的去Mybatis的官方網站(http://mybatis.org)下載最新Release版本的Mybatis
壓縮包解壓後可以看到一下的目錄結構
- lib
- LICENSE
- mybatis-3.2.2.jar
- mybatis-3.2.2.pdf
- NOTICE
在根目錄下存放著mybatis-3.2.2.jar,為Mybatis的jar檔案,Mybatis-3.2.2.pdf為Mybatis官方使用文件
lib目錄下存放著編譯依賴包,接下來來介紹一下Mybatis編譯的依賴包
- asm-3.3.1.jar:操作Java位元組碼的類庫
- cglib-2.2.2.jar:用來動態整合Java類或實現介面
- commons-logging-1.1.1.jar:用於通用日誌處理
- javassist-3.17.1-GA。jar:分析、編輯和建立java位元組碼的類庫、
- log4j-1.2.17.jar:日誌系統
- slf4j-api-1.7.5.jar:日誌系統的封裝,對外提供統一的API介面
- slf4j-log4j12-1.7.5.jar:slf4j對log4j的相應驅動,完成slf4j繫結log4j
其次是mybatis-3-mybatis-3.2.2.zip(Mybatis原始碼包):裡面是Mybatis的所有原始碼
目錄結構就講到這,至於具體建立Mybatis專案在這我就不多說了
接下來再介紹一下Mybatis的核心配置檔案configuration.xml
Mybatis核心配置檔案主要用於配置資料庫連線和Mybatis執行時所需要的各種特性,包含了設定和影響Mybatis行為的屬性
接下來說說配置檔案中的基本要素
<?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="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 將mapper檔案加入到配置檔案中 -->
<mappers>
<mapper resource="POJO/UserMapper.xml"/>
</mappers>
</configuration>
mybatis-config.xml檔案的幾個常用元素的作用如下:
- configuration:配置檔案的根元素節點
- properties:通過resource屬性從外部指定properties屬性檔案(database.properties),該屬性檔案描述資料庫連線的相關配置(資料庫驅動、連線資料庫的url、資料庫使用者名稱、資料庫密碼),位置也是在/resource目錄下。
- settings:設定Mybatis執行中的一些行為,比如此處設定Mybatis的log日誌實現為LOG4J,即使用log4j實現日誌功能。
- environments:配置Mybatis的多套執行環境,將SQL對映到多個不同的資料庫上,該元素節點下可以配置多個environment子元素節點,但是必須指定其中一個預設執行環境(通過default指定)。
- environment:配置Mybatis的一套執行環境,需指定ID、事務管理器、資料來源配置等相關資訊。
- mappers:作用是告訴Mybatis去哪裡找到SQL對映檔案(該檔案內容是開發者定義的對映SQL語句),整個專案可以有1個或者多個SQL對映檔案
- mapper:mappers的子元素節點,具體指定SQL對映檔案的路徑,其中resource屬性的值表述了SQL對映檔案的路徑(類資源路徑)
在這裡我稍微提一下注意事項:mybatis-config.xml檔案的元素節點是有一定的順序,節點位置若不按照順序排位的話,那麼XML檔案會報錯,至於元素的排列順序是:
1.properties
2.settings
3.typeAliases
4.typeHandlers
5.objectFactory
6.objectWrapperFactory
7.plugins
8.environments?
9.databaseIdProvider
10.mappers
常用元素
常用元素的順序大致就是這樣的,大家可以參考一下
有了Mybatis的核心配置檔案後,接下來就要準備持久化類和SQL對映檔案
那麼什麼是持久化類呢?持久化類是指其例項狀態需要被Mybatis持久化到資料庫中的類,在應用的設計中,持久化類通常對應業務中的業務實體,Mybatis一般採用POJO程式設計模型來實現持久化類,與POJO類配合完成持久化工作是Mybatis最常見的工作模式
既然都講到這了,我就再講講什麼是POJO吧!
POJO(Plain Ordinary Java Object):從字面上來說就是普通的Java物件,POJO類可以簡單地理解為符合JavaBean規範的實體類,它不需要繼承和實現任何特殊的Java基類或者介面,JavaBean物件的狀態儲存咋屬性中,訪問屬性必須通過對應的getter和setter方法
POJO實體類
接下里我用例項來向大家演示一下
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方法
SQL對映檔案
接下來,繼續進行SQL對映檔案的建立,完成與POJO(實體類)的對映,該檔案也是一個XML檔案,命名為UserMapper.xml,示例如下
<?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="POJO.UserMapper">
<!-- 查詢使用者列表記錄數 -->
<select id="count" resultType="int">
select count(1) as count from smbms_user
</select>
</mapper>
上面的程式碼就是所定義的SQL語句,其中元素的含義是
1.mapper:對映檔案的根元素節點,只有一個屬性namespace
- namespace:用於區分不同的mapper,全域性唯一
2.select:表示查詢語句,是Mybatis最常用的元素之一,常用屬性如下
- id屬性:該名稱空間下唯一識別符號
- resultType屬性:表示SQL語句返回值型別,此處通過SQL語句返回的是Int資料型別
測試類
SQl對映檔案也弄好了,接下來就是建立測試類了,具體的實現步驟:
1.讀取全域性配置檔案:mybatis-config.xml
String resource="mybatis-config.xml";
//獲取mybatis-config.xml檔案的輸入流
InputStream is=Resource.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();
上面咱們已經成功地將Mybatis搭建出來了,下面再來說說Mybatis的核心要素
核心要素
首先介紹一下Mybatis的核心介面和類
- 每個Mybatis的應用程式都以一個SQLSessionFactory物件的例項為核心
- 首先獲取SqlSessionFactoryBuilder物件,可以根據XML配置檔案或Configuration類的例項構建物件
- 然後獲取SQLSessionFactory物件,該物件例項可以通過SqlSessionFactoryBuilder物件來獲得
- 有了SQLSessionFactory物件之後,就可以進而獲取SqlSession例項,SqlSession物件中完全包含以資料庫為背景的所有執行SQL操作方法,可以用該例項來直接執行已對映的SQL語句
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder負責構建SQLSessionFactory,並且提供了多個build()方法的過載,分別是
- InputStream(位元組流)
- Reader(字元流)
- Configuration(類)
SqlSessionFactoryBuilder的生命週期和作用域
SqlSessionFactoryBuilder的最大特點就是:用過即丟。一旦建立了SQLSessionFactory物件之後,這個類就不再需要存在了,因此SqlSessionFactoryBuilder的最佳範圍就是存在於方法體內,也就是區域性變數而已。
SqlSessionFactory
SqlSessionFactory簡單的理解就是建立SqlSession例項的工廠。所有的Mybatis應用都是以SQLSessionFactory例項為中心,SQLSessionFactory的例項可以通過SqlSessionFactoryBuilder物件來獲取
SqlSessionFactory的生命週期和作用域
SqlSessionFactory物件一旦建立,就會在整個應用程式中始終存在。沒有理由去銷燬或再建立它,並且在應用程式執行中也不建議多次建立SQLSessionFactory,怎麼說呢,你可以吧SqlSessionFactoryBuilder當做建立工廠的工人,而SQLSessionFactory就是建立好的工廠,一般來說工廠建立好了之後,工人就不需要了,而工廠會被保留下來,這就是它們的生命週期吧!
以上就是本文所介紹Mybatis的內容了,大致的核心都介紹完了,接下來你可以自己去消化一下,加油!