????????在第一篇博客中,我們掌握了 MyBatis 的基礎概念與環境搭建,成功通過簡單查詢實現了數據持久化。但要真正用好 MyBatis,還需深入理解其 “內部工作原理” 與 “企業級開發規范”。本篇將聚焦三大核心:MyBatis 架構與核心類、全局配置文件詳解、Mapper 代理開發(企業主流方案),幫你從 “會用” 升級到 “懂原理、能規范開發”。
目錄
一、深入 MyBatis 架構:三層架構 + 核心類解析
1.1 三層架構:從 “調用入口” 到 “基礎支撐”
(1)API 接口層:上層應用的 “交互入口”
(2)數據處理層(核心層):MyBatis 的 “業務大腦”
(3)基礎支撐層:MyBatis 的 “后勤保障”
1.2 5 個核心類:MyBatis 的 “關鍵零件”
核心類工作流程示例(以 “查詢部門” 為例):
二、MyBatis 全局配置文件:SqlMapConfig.xml 詳解
2.1?properties標簽:靈活管理數據源參數
方式 1:內部直接定義屬性(簡單但不推薦)
方式 2:加載外部jdbc.properties文件(推薦)
方式 3:動態傳入屬性(了解,特殊場景用)
2.2?settings標簽:MyBatis 的 “運行開關”
配置示例:
2.3?typeAliases標簽:簡化全限定類名的 “別名神器”
方式 1:為單個類定義別名(簡單場景用)
方式 2:為包下所有類定義別名(推薦,企業常用)
2.4?environments標簽:多環境配置(開發 / 測試 / 生產)
配置示例:
關鍵子標簽說明:
切換環境:
2.5?mappers標簽:告訴 MyBatis “SQL 在哪里”
方式 1:加載類路徑下的 Mapper.xml(入門用)
方式 2:加載本地文件系統的 Mapper.xml(了解)
方式 3:加載單個 Mapper 接口(Mapper 代理用)
方式 4:掃描包下所有 Mapper 接口(推薦,企業常用)
三、Mapper 代理開發:企業級 Dao 層開發規范
3.1 為什么要放棄 “原始 Dao 開發”?
3.2 Mapper 代理開發的 4 個核心規范
3.3 Mapper 代理開發實戰步驟
步驟 1:創建 Mapper 接口(DeptMapper.java)
步驟 2:創建對應的 Mapper.xml(DeptMapper.xml)
步驟 3:配置SqlMapConfig.xml的mappers標簽
步驟 4:編寫測試類,通過代理對象調用方法
代理開發的優勢總結:
四、總結與下一步預告
一、深入 MyBatis 架構:三層架構 + 核心類解析
????????就像開車需要了解方向盤、油門的作用,使用 MyBatis 前,搞懂其架構與核心類,能讓你在遇到問題時快速定位原因。MyBatis 的功能架構自上而下分為三層,核心類則是每層的 “關鍵執行器”。
1.1 三層架構:從 “調用入口” 到 “基礎支撐”
MyBatis 的架構設計清晰,每層職責明確,協同完成數據庫操作,具體如下:
(1)API 接口層:上層應用的 “交互入口”
????????這是我們最常接觸的一層,核心對象是SqlSession
—— 它是上層應用(如 Service 層)與 MyBatis 的 “橋梁”,提供了 CRUD 操作的所有方法(如selectList()
查詢列表、insert()
插入數據、update()
更新數據)。
我們無需關心底層如何執行 SQL,只需通過SqlSession
調用對應的方法即可。例如:
// 通過SqlSession調用查詢方法,定位SQL的“namespace+id”
List<Dept> depts = session.selectList("com.jr.mapper.DeptMapper.selectDept");
當SqlSession
接收到調用請求后,會將任務交給下一層(數據處理層)執行。
(2)數據處理層(核心層):MyBatis 的 “業務大腦”
這是 MyBatis 的核心,負責完成數據庫操作的全流程,主要做四件事:
- 參數映射:將 Java 代碼傳入的參數(如
Integer deptno
)解析并轉換為 JDBC 支持的類型(如SQL INTEGER
); - SQL 解析:讀取 Mapper.xml 中的 SQL 語句,處理動態 SQL(如
<if>
、<where>
標簽),生成最終可執行的 SQL; - SQL 執行:通過執行器(
Executor
)調用 JDBC API 執行 SQL,與數據庫交互; - 結果映射:將數據庫返回的 ResultSet 結果集,自動映射為 Java 實體類(如
Dept
對象),無需手動遍歷賦值。
這一層的核心組件是Executor
(執行器),它是 SQL 執行的 “實際操作者”,MyBatis 提供了三種常用執行器:
SimpleExecutor
:默認執行器,每次執行 SQL 都會創建新的PreparedStatement
;ReuseExecutor
:重用PreparedStatement
,避免重復創建,提升性能;BatchExecutor
:支持批量更新,適用于大量插入 / 更新場景。
(3)基礎支撐層:MyBatis 的 “后勤保障”
這一層提供通用功能支撐,為上層(數據處理層)服務,核心能力包括:
- 連接管理:通過數據源(
DataSource
)管理數據庫連接,支持連接池(如POOLED
類型),避免頻繁創建 / 關閉連接; - 事務管理:支持 JDBC 事務(手動提交 / 回滾)和 MANAGED 事務(交給容器管理,如 Spring);
- 緩存處理:實現一級緩存(
SqlSession
級別)和二級緩存(Mapper
級別),減少數據庫訪問次數; - 工具類:提供 XML 解析、反射、日志打印等基礎工具,簡化框架內部邏輯。
1.2 5 個核心類:MyBatis 的 “關鍵零件”
理解核心類的作用與生命周期,是排查問題、優化性能的關鍵,下表整理了必須掌握的 5 個核心類:
核心類 | 核心作用 | 生命周期 | 關鍵特點 |
---|---|---|---|
SqlSessionFactory | 創建SqlSession 的 “工廠” | 應用啟動時創建,全局唯一 | 一旦創建,需一直存在,不可重復創建(浪費資源) |
SqlSession | 與數據庫的 “一次會話”,提供 CRUD 方法 | 每次操作數據庫時創建,用完關閉 | 非線程安全,必須手動關閉(推薦try-finally ) |
Executor | 執行器,負責 SQL 的實際執行(查詢 / 更新) | 每個SqlSession 對應一個Executor | 可通過配置切換執行器類型(如批量執行器) |
MappedStatement | 存儲 Mapper.xml 中的 SQL 信息(id、參數、結果映射) | 應用啟動時加載,全局唯一 | 每個 SQL 節點(如<select> )對應一個實例 |
Configuration | 存儲 MyBatis 的所有配置信息(數據源、映射、settings) | 應用啟動時解析配置文件生成 | 是 MyBatis 的 “配置中心”,所有核心類都依賴它 |
核心類工作流程示例(以 “查詢部門” 為例):
- 應用啟動時,解析
SqlMapConfig.xml
和DeptMapper.xml
,生成Configuration
對象; - 通過
SqlSessionFactoryBuilder
讀取Configuration
,創建SqlSessionFactory
; - 調用
SqlSessionFactory.openSession()
,創建SqlSession
,并為其分配Executor
; - 調用
SqlSession.selectList("com.jr.mapper.DeptMapper.selectDept")
,SqlSession
通過 “namespace+id” 找到對應的MappedStatement
; Executor
根據MappedStatement
中的 SQL 信息,執行 SQL 并處理結果,最終返回Dept
列表;- 關閉
SqlSession
,釋放Executor
與數據庫連接。
二、MyBatis 全局配置文件:SqlMapConfig.xml 詳解
SqlMapConfig.xml
是 MyBatis 的 “全局控制中心”,所有影響 MyBatis 行為的配置都集中在這里。上篇我們只寫了基礎配置,本篇將詳細解析 5 個核心配置標簽,覆蓋企業開發中的常用場景。
2.1?properties
標簽:靈活管理數據源參數
properties
標簽用于加載數據庫連接參數(如驅動、URL、用戶名、密碼),避免硬編碼在配置文件中,支持三種使用方式,推薦第二種(加載外部屬性文件)。
方式 1:內部直接定義屬性(簡單但不推薦)
直接在properties
標簽內寫死參數,修改時需改配置文件,靈活性差:
<configuration><!-- 內部定義數據源參數 --><properties><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mytestdb?serverTimezone=GMT&useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></properties><!-- 使用參數:${屬性名} --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><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>
</configuration>
方式 2:加載外部jdbc.properties
文件(推薦)
將參數放在獨立的屬性文件中,實現 “參數與配置分離”,修改參數無需動SqlMapConfig.xml
:
在src/main/resources
下新建jdbc.properties
文件:
# jdbc.properties:單獨存儲數據源參數
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytestdb?serverTimezone=GMT&useSSL=false
username=root
password=root
在SqlMapConfig.xml
中加載該文件:
<configuration><!-- 加載外部屬性文件,resource指定文件路徑(類路徑下) --><properties resource="jdbc.properties"/><!-- 直接使用${屬性名}引用參數 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><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>
</configuration>
方式 3:動態傳入屬性(了解,特殊場景用)
通過SqlSessionFactoryBuilder.build()
方法動態傳入參數,覆蓋配置文件中的值,適用于 “臨時切換數據源” 場景:
// 1. 加載配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 動態創建屬性,覆蓋url
Properties props = new Properties();
props.setProperty("url", "jdbc:mysql://localhost:3306/testdb2?serverTimezone=GMT&useSSL=false");
// 3. 傳入屬性,創建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is, props);
重要優先級規則:動態傳入的屬性 > 外部屬性文件 > 內部定義的屬性,即后加載的屬性會覆蓋先加載的同名屬性。
2.2?settings
標簽:MyBatis 的 “運行開關”
settings
標簽用于配置 MyBatis 的全局運行參數,這些參數直接影響框架的性能與行為。企業開發中常用的配置如下:
設置項 | 作用描述 | 默認值 | 推薦配置 |
---|---|---|---|
cacheEnabled | 開啟全局二級緩存(后續博客詳解) | true | 保持默認 true |
lazyLoadingEnabled | 開啟延遲加載(按需加載關聯數據,如查員工時不默認查部門) | false | 復雜項目設為 true |
aggressiveLazyLoading | 開啟 “積極懶加載”:訪問實體類任一屬性,加載所有關聯數據 | false(3.4.1+) | 設為 false(按需加載,更靈活) |
mapUnderscoreToCamelCase | 開啟 “下劃線轉駝峰”:數據庫字段dept_name 自動映射為實體類屬性deptName | false | 必須設為 true(避免手動映射字段) |
logImpl | 指定日志實現(如 SLF4J、LOG4J) | 未設置 | 開發環境設為 LOG4J(方便看 SQL 日志) |
配置示例:
<configuration><properties resource="jdbc.properties"/><!-- settings標簽必須在properties之后、typeAliases之前 --><settings><!-- 開啟下劃線轉駝峰,避免手動映射字段 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 開啟延遲加載,優化關聯查詢性能 --><setting name="lazyLoadingEnabled" value="true"/><!-- 關閉積極懶加載,按需加載關聯數據 --><setting name="aggressiveLazyLoading" value="false"/></settings><!-- 其他配置... -->
</configuration>
2.3?typeAliases
標簽:簡化全限定類名的 “別名神器”
????????在 Mapper.xml 中,resultType
/parameterType
需要寫實體類的全限定類名(如com.jr.pojo.Dept
),重復書寫繁瑣且易出錯。typeAliases
標簽可給實體類定義 “別名”,簡化書寫。
方式 1:為單個類定義別名(簡單場景用)
<configuration><properties resource="jdbc.properties"/><settings>...</settings><!-- 為單個實體類定義別名 --><typeAliases><!-- alias:別名,type:實體類全限定類名 --><typeAlias alias="dept" type="com.jr.pojo.Dept"/><typeAlias alias="emp" type="com.jr.pojo.Emp"/></typeAliases><!-- 其他配置... -->
</configuration>
使用時直接寫別名,無需全限定類名:
<!-- Mapper.xml中使用別名 -->
<select id="selectDept" resultType="dept"> <!-- 直接用“dept”代替“com.jr.pojo.Dept” -->select * from dept
</select>
方式 2:為包下所有類定義別名(推薦,企業常用)
????????若實體類較多,逐個定義別名太麻煩,可直接掃描整個包,MyBatis 會自動將 “類名首字母小寫” 作為別名(如Dept
→dept
、Emp
→emp
):
<configuration><properties resource="jdbc.properties"/><settings>...</settings><!-- 掃描com.jr.pojo包下所有實體類,自動生成別名 --><typeAliases><package name="com.jr.pojo"/></typeAliases><!-- 其他配置... -->
</configuration>
特殊需求:若想自定義別名(不使用首字母小寫),可在實體類上添加@Alias
注解:
import org.apache.ibatis.type.Alias;@Alias("myDept") // 自定義別名“myDept”
public class Dept {// 實體類屬性、getter/setter...
}
使用時直接寫自定義別名:
<select id="selectDept" resultType="myDept">select * from dept
</select>
2.4?environments
標簽:多環境配置(開發 / 測試 / 生產)
????????實際項目中,開發、測試、生產環境的數據庫配置不同(如開發用本地庫,生產用服務器庫),environments
標簽支持配置多個環境,默認激活一個。
配置示例:
<configuration><properties resource="jdbc.properties"/><settings>...</settings><typeAliases>...</typeAliases><!-- default:默認激活的環境ID(此處為開發環境) --><environments default="development"><!-- 開發環境 --><environment id="development"><!-- 事務管理器:JDBC(手動控制事務) --><transactionManager type="JDBC"/><!-- 數據源:POOLED(連接池,開發/測試用) --><dataSource type="POOLED"><property name="driver" value="${dev.driver}"/><property name="url" value="${dev.url}"/><property name="username" value="${dev.username}"/><property name="password" value="${dev.password}"/></dataSource></environment><!-- 生產環境 --><environment id="production"><!-- 事務管理器:MANAGED(交給Spring容器管理) --><transactionManager type="MANAGED"/><!-- 數據源:POOLED(生產環境也用連接池,提升性能) --><dataSource type="POOLED"><property name="driver" value="${prod.driver}"/><property name="url" value="${prod.url}"/><property name="username" value="${prod.username}"/><property name="password" value="${prod.password}"/></dataSource></environment></environments><!-- 其他配置... -->
</configuration>
對應的jdbc.properties
需包含多環境參數:
# 開發環境參數
dev.driver=com.mysql.cj.jdbc.Driver
dev.url=jdbc:mysql://localhost:3306/dev_db?serverTimezone=GMT&useSSL=false
dev.username=root
dev.password=root# 生產環境參數
prod.driver=com.mysql.cj.jdbc.Driver
prod.url=jdbc:mysql://192.168.1.100:3306/prod_db?serverTimezone=GMT&useSSL=false
prod.username=prod_user
prod.password=prod_pwd
關鍵子標簽說明:
transactionManager
(事務管理器):
支持兩種類型:JDBC
(依賴數據源連接,手動調用session.commit()
提交事務)和MANAGED
(不管理事務,交給容器如 Spring 處理,MyBatis 只負責 SQL 執行)。dataSource
(數據源):
支持三種類型:POOLED
:連接池,創建連接池管理連接,避免頻繁創建 / 關閉,開發 / 測試 / 生產都推薦;UNPOOLED
:無連接池,每次執行 SQL 都新建連接,性能差,僅適用于小規模項目;JNDI
:從應用服務器(如 Tomcat)的 JNDI 數據源獲取連接,適用于 JavaEE 企業級項目。
切換環境:
默認使用default
指定的環境,若需切換(如測試時用生產環境配置),可在創建SqlSessionFactory
時指定環境 ID:
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 指定激活“production”環境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is, "production");
2.5?mappers
標簽:告訴 MyBatis “SQL 在哪里”
mappers
標簽用于配置 “Mapper 映射文件” 或 “Mapper 接口” 的位置 ——MyBatis 需要通過它找到我們寫的 SQL 語句,常用四種配置方式,企業開發推薦后兩種(Mapper 代理用)。
方式 1:加載類路徑下的 Mapper.xml(入門用)
通過resource
指定 Mapper.xml 的類路徑,適用于 “普通項目” 或 “非代理開發” 場景:
<mappers><mapper resource="com/jr/mapper/DeptMapper.xml"/><mapper resource="com/jr/mapper/EmpMapper.xml"/>
</mappers>
方式 2:加載本地文件系統的 Mapper.xml(了解)
通過url
指定本地文件的絕對路徑,適用于 Mapper.xml 不在類路徑下的場景(很少用):
<mappers><mapper url="file:///D:/mybatis-project/mappers/DeptMapper.xml"/>
</mappers>
方式 3:加載單個 Mapper 接口(Mapper 代理用)
通過class
指定 Mapper 接口的全限定類名,適用于 “Mapper 代理開發”(后續詳解),要求:Mapper 接口與 Mapper.xml 在同一包下,且文件名相同:
<mappers><mapper class="com.jr.mapper.DeptMapper"/><mapper class="com.jr.mapper.EmpMapper"/>
</mappers>
方式 4:掃描包下所有 Mapper 接口(推薦,企業常用)
通過package
掃描整個包下的所有 Mapper 接口,自動關聯對應的 Mapper.xml,要求與方式 3 一致(接口與 XML 同包同名),簡化大量配置:
<mappers><!-- 掃描com.jr.mapper包下所有Mapper接口 --><package name="com.jr.mapper"/>
</mappers>
三、Mapper 代理開發:企業級 Dao 層開發規范
????????在第一篇的環境搭建中,我們通過SqlSession.selectList("namespace+id")
調用 SQL,這種方式屬于 “原始 Dao 開發”。但在企業項目中,更推薦Mapper 代理開發—— 無需編寫 Dao 接口的實現類,MyBatis 會自動生成代理對象,大幅減少重復代碼。
3.1 為什么要放棄 “原始 Dao 開發”?
原始 Dao 開發需要手動編寫 Dao 接口的實現類(如DeptDaoImpl
),存在三個明顯缺點:
- 模板代碼冗余:實現類中大量重復代碼(如創建
SqlSession
、調用方法、關閉SqlSession
),開發者淪為 “代碼搬運工”; - SQL ID 硬編碼:調用
SqlSession
方法時,需寫死 SQL 的 “namespace+id”(如session.selectList("com.jr.mapper.DeptMapper.selectDept")
),寫錯不會在編譯期報錯,只能在運行時發現; - 類型不安全:
SqlSession
的方法參數與返回值大量使用泛型(如selectList()
返回List<Object>
),若參數類型或返回值類型錯誤,編譯期無法察覺。
而 Mapper 代理開發能完美解決這些問題 —— 只需寫 “Mapper 接口” 和 “Mapper.xml”,MyBatis 自動生成實現類代理對象,既簡潔又安全。
3.2 Mapper 代理開發的 4 個核心規范
要讓 MyBatis 自動生成代理對象,必須遵守以下 4 個規范(缺一不可),否則框架無法關聯接口與 SQL:
- 接口與 XML 同包同名:Mapper 接口(如
DeptMapper.java
)與 Mapper.xml(如DeptMapper.xml
)必須在同一包下,且文件名完全相同; - XML 的 namespace 與接口全路徑一致:Mapper.xml 的
namespace
屬性必須等于 Mapper 接口的全限定類名(如com.jr.mapper.DeptMapper
); - 接口方法名與 XML 的 SQL ID 一致:Mapper 接口中的方法名(如
selectDept()
)必須等于 Mapper.xml 中 SQL 標簽的id
(如<select id="selectDept">
); - 接口方法參數 / 返回值與 XML 匹配:
- 接口方法的參數類型 ≡ XML 中 SQL 的
parameterType
; - 接口方法的返回值類型 ≡ XML 中 SQL 的
resultType
/resultMap
(若返回列表,返回值類型為List<實體類>
,XML 中resultType
為單個實體類)。
- 接口方法的參數類型 ≡ XML 中 SQL 的
3.3 Mapper 代理開發實戰步驟
以 “查詢部門列表” 為例,完整演示 Mapper 代理開發的流程(基于 Maven 項目):
步驟 1:創建 Mapper 接口(DeptMapper.java)
在src/main/java/com/jr/mapper
下創建接口,定義查詢方法,無需寫實現類:
package com.jr.mapper;import com.jr.pojo.Dept;
import java.util.List;// 規范1:接口名與后續XML文件名相同(DeptMapper)
public interface DeptMapper {// 規范3:方法名與XML中SQL的id一致(selectDept)// 規范4:返回值類型為List<Dept>,對應XML中resultType="dept"(單個實體類)List<Dept> selectDept();// 新增:根據部門編號查詢單個部門(演示參數匹配)// 規范4:參數類型為int,對應XML中parameterType="int";返回值為Dept,對應resultType="dept"Dept selectDeptByNo(int deptno);
}
步驟 2:創建對應的 Mapper.xml(DeptMapper.xml)
在src/main/resources/com/jr/mapper
下創建 XML 文件(與接口同包同名),配置 SQL 并遵守規范:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 規范2:namespace等于Mapper接口全路徑(com.jr.mapper.DeptMapper) -->
<mapper namespace="com.jr.mapper.DeptMapper"><!-- 規范3:id等于接口方法名(selectDept) --><!-- 規范4:resultType="dept"(單個實體類),對應接口返回值List<Dept> --><select id="selectDept" resultType="dept">select * from dept</select><!-- 規范3:id等于接口方法名(selectDeptByNo) --><!-- 規范4:parameterType="int"(接口方法參數類型),resultType="dept"(返回值類型) --><select id="selectDeptByNo" parameterType="int" resultType="dept">select * from dept where deptno = #{deptno}</select>
</mapper>
步驟 3:配置SqlMapConfig.xml
的mappers
標簽
使用 “掃描包” 方式加載 Mapper 接口(企業推薦):
<configuration><properties resource="jdbc.properties"/><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><package name="com.jr.pojo"/> <!-- 掃描實體類,生成別名 --></typeAliases><environments default="development"><!-- 數據源配置... --></environments><!-- 規范:掃描Mapper接口所在包,自動關聯XML --><mappers><package name="com.jr.mapper"/></mappers>
</configuration>
步驟 4:編寫測試類,通過代理對象調用方法
通過SqlSession.getMapper(接口.class)
獲取 MyBatis 自動生成的代理對象,直接調用接口方法:
import com.jr.mapper.DeptMapper;
import com.jr.pojo.Dept;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;public class DeptMapperTest {private SqlSessionFactory factory;// 測試前初始化SqlSessionFactory(只執行一次)@Beforepublic void setUp() throws Exception {InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");factory = new SqlSessionFactoryBuilder().build(is);}// 測試查詢所有部門@Testpublic void testSelectDept() {SqlSession session = null;try {session = factory.openSession();// 獲取Mapper代理對象(MyBatis自動生成,無需手動new實現類)DeptMapper deptMapper = session.getMapper(DeptMapper.class);// 直接調用接口方法,底層自動執行SQLList<Dept> depts = deptMapper.selectDept();for (Dept dept : depts) {System.out.println(dept);}} finally {// 確保關閉會話if (session != null) {session.close();}}}// 測試根據部門編號查詢@Testpublic void testSelectDeptByNo() {SqlSession session = null;try {session = factory.openSession();DeptMapper deptMapper = session.getMapper(DeptMapper.class);// 傳入參數,調用方法Dept dept = deptMapper.selectDeptByNo(10);System.out.println(dept); // 輸出:Dept{deptno=10, dname='ACCOUNTING', loc='NEW YORK'}} finally {if (session != null) {session.close();}}}
}
代理開發的優勢總結:
- 無模板代碼:無需寫 Dao 實現類,MyBatis 自動生成代理對象;
- SQL ID 無硬編碼:通過接口方法名關聯 SQL,編譯期可檢查錯誤;
- 類型安全:接口方法的參數與返回值類型明確,編譯期可發現類型錯誤;
- 符合面向接口編程:符合企業級開發規范,便于團隊協作與后期維護。
四、總結與下一步預告
本篇博客我們深入 MyBatis 的核心:
- 理解了 MyBatis 的三層架構與核心類,知道 SQL 是如何從 “調用” 到 “執行” 的;
- 掌握了全局配置文件
SqlMapConfig.xml
的 5 個核心標簽,能應對企業級項目的配置需求; - 學會了 Mapper 代理開發規范,擺脫了原始 Dao 開發的冗余與不安全,實現了 “接口 + XML” 的簡潔開發。
第三篇預告:MyBatis 的 “高級特性”—— 動態 SQL(靈活處理多條件查詢)、關聯查詢(一對一 / 一對多)、查詢緩存(一級 / 二級緩存優化性能),這些是解決復雜業務場景的關鍵,也是面試高頻考點。跟著系列博客一步步深入,你會發現 MyBatis 的強大與靈活,真正做到 “知其然,更知其所以然”。