本文爲Mybatis的基礎講解,歡迎閱讀學習,一起進步。
一.MyBatis簡介
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis 。2013年11月遷移到Github。
iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(sDAO)
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。
MyBatis 避免了幾乎所有的 JDBC代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
二.框架特點
- ①簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
- ②靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。sql寫在xml裏,便於統一管理和優化。通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。
- ③解除sql與程序代碼的耦合:通過提供DAL層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
- ④提供映射標籤,支持對象與數據庫的orm字段關係映射
- ⑤提供對象關係映射標籤,支持對象關係組建維護
- ⑥提供xml標籤,支持編寫動態sql
三.總體流程
- ①
加載配置並初始化
- 觸發條件:加載配置文件
- 處理過程:將SQL的配置信息加載成爲一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
- ②
接收調用請求
- 觸發條件:調用Mybatis提供的API
- 傳入參數:爲SQL的ID和傳入參數對象
- 處理過程:將請求傳遞給下層的請求處理層進行處理。
- ③
處理操作請求
- 觸發條件:API接口層傳遞請求過來
- 傳入參數:爲SQL的ID和傳入參數對象
- 處理過程:
- (A)根據SQL的ID查找對應的MappedStatement對象。
- (B)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
- ©獲取數據庫連接,根據得到的最終SQL語句和執行傳入參數到數據庫執行,並得到執行結果。
- (D)根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
- (E)釋放連接資源。
- ④
返回處理結果將最終的處理結果返回
四.功能架構
- Mybatis的功能架構分爲三層:
- API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。
- 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
- 基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。
五.體系結構
- mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了數據源、事務等信息;映射文件配置了SQL執行相關的信息。
- ①mybatis通過讀取配置文件信息(全局配置文件和映射文件),構造出SqlSessionFactory,即會話工廠。
- ②通過SqlSessionFactory,可以創建SqlSession即會話。Mybatis是通過SqlSession來操作數據庫的。
- ③SqlSession本身不能直接操作數據庫,它是通過底層的Executor執行器接口來操作數據庫的。Executor接口有兩個實現類,一個是普通執行器,一個是緩存執行器(默認)。
- ④Executor執行器要處理的SQL信息是封裝到一個底層對象MappedStatement中。該對象包括:SQL語句、輸入參數映射信息、輸出結果集映射信息。其中輸入參數和輸出結果的映射類型包括java的簡單類型、HashMap集合對象、POJO對象類型。
六.MyBatis和數據交互的方式
- MyBatis和數據庫交互方式主要分兩種:
- ①使用傳統的MyBatis提供的API;
- 通過調用MyBatis中SqlSession對象的方法從而達到與數據庫交互的方式,有一些類似DBUtils的操作!
上述使用MyBatis的方法,是創建一個和數據庫打交道的SqlSession對象,然後根據Statement Id和參數來操作數據庫
,這種方式固然很簡單和實用,但是它不符合面嚮對象語言的概念和麪向接口編程的編程習慣。
由於面向接口的編程是面向對象的大趨勢,MyBatis爲了適應這一趨勢,增加了第二種使用MyBatis 支持接口(Interface)調用方 式。
- ②使用Mapper接口;
- MyBatis將核心配置文件中的每一個節點抽象爲一個 Mapper 接口,而這個接口中聲明的方法和跟節點中的<select|update|delete|insert>節點項對應,即<select|update|delete|insert> 節點的id值爲Mapper接口中的方法名稱,parameterType值表示Mapper對應方法的入參類型,而resultMap值則對應了Mapper接口表示的返回值類型或者返回結果集的元素類型。
- 小結:MyBatis引用Mapper接口這種調用方式,純粹是爲了滿足面向接口編程的需要。(其實還有一個原因是在於,面向接口的編程,使得用戶在接口上可以使用註解來配置SQL語句,這樣就可以脫離XML配置文件,實現“0配置”)
七.MyBatis配置文件
- 1.核心配置文件
- 在classpath下,創建SqlMapConfig.xml文件,該文件爲核心配置文件,可以配置當前環境信息,加載映射文件,加載properties文件,配置全局參數,定義別名等。
<?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>
<!-- 加載properties文件
先加載property子標籤的內容,後加載properties文件
如果名稱相同,後邊覆蓋前邊內容
-->
<properties resource="jdbc.properties">
<property name="jdbc.password" value="12345"/>
</properties>
<!-- 全局參數配置:二級緩存,延遲加載
<settings></settings>
-->
<!-- 定義別名 -->
<typeAliases>
<!-- 給單個的類起別名
<typeAlias type="com.qf.domain.User" alias="user"/>
-->
<!-- 給指定包下的類起別名
別名的定義規則:類名首字母小寫
-->
<package name="com.qf.domain"/>
</typeAliases>
<!-- 配置mybatis的環境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事務控制,由mybatis進行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據源,採用mybatis連接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加載映射文件 -->
<mappers>
<!-- 使用資源的路徑 -->
<mapper resource="User.xml"/>
<!-- <mapper resource="com/qf/mapper/UserMapper.xml"/> -->
<!-- 使用資源的絕對路徑<mapper url=""/> -->
<!--
Mapper接口的全類名
要求:Mapper接口的名稱與映射文件名稱一致
1.8.2 映射文件
在指定的目錄下創建映射文件,配置要執行的statement,即增刪改查等語句。
必須在同一個目錄下
<mapper class="com.qf.mapper.UserMapper"/>
-->
<!-- 加載某個包下的映射文件 (推薦)
要求:Mapper接口的名稱與映射文件名稱一致
必須在同一個目錄下
-->
<package name="com.qf.mapper"/>
</mappers>
</configuration>
- 2.映射文件
- 在指定的目錄下創建映射文件,配置要執行的statement,即增刪改查等語句。
<?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">
<!--
namespace:配置名稱空間,對配置的statement進行分類管理
此時名稱可以任意
當使用Mapper代理時,namespace具有特殊的含義與功能
-->
<mapper namespace="test">
<!--
根據id查詢用戶,User findById(int id)
select:配置查詢語句
id:可以通過id找到執行的statement,statement唯一標識
parameterType:輸入參數類型
resultType:輸出結果類型
#{}:相當於佔位符
#{id}:其中的id可以表示輸入參數的名稱,如果是簡單類型名稱可以任意
-->
<select id="findById" parameterType="int" resultType="com.qf.domain.User" >
select * from user where id=#{id}
</select>
<!--
根據用戶名稱來模糊查詢用戶信息列表;
${}:表示拼接sql語句
${value}:表示輸入參數的名稱,如果參數是簡單類型,參數名稱必須是value
-->
<select id="findByUsername" parameterType="java.lang.String"
resultType="com.qf.domain.User">
select * from user where username like '%${value}%'
</select>
<!-- 添加用戶
#{username}:名稱與類中的屬性名一致
-->
<insert id="addUser" parameterType="com.qf.domain.User">
<!--
selectKey:查詢主鍵
keyProperty:主鍵對應的屬性名稱
resultType:結果類型,主鍵的類型
order:在插入記錄的之前或之後查詢主鍵的值
select last_insert_id()
mysql提供 的函數,與insert語句搭配使用,查詢主鍵
-->
<selectKey keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into user(username,sex,birthday,address)
values(#{username},#{sex},#{birthday},#{address})
</insert>
<!-- 刪除用戶 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<!-- 修改用戶 -->
<update id="updateUser" parameterType="com.qf.domain.User">
update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#
{address}
where id= #{id}
</update>
</mapper>
The best investment is in yourself.
2020.03.21 記錄辰兮的第34篇博客