【第17章】MyBatis-Spring之注入映射器

文章目錄


前言

與其在數據訪問對象(DAO)中手工編寫使用 SqlSessionDaoSupport 或 SqlSessionTemplate 的代碼,還不如讓 Mybatis-Spring 為你創建一個線程安全的映射器,這樣你就可以直接注入到其它的 bean 中了。


一、注冊映射器

注冊映射器的方法根據你的配置方法,即經典的 XML 配置或新的 3.0 以上版本的 Java 配置(也就是常說的 @Configuration),而有所不同。

1. XML 配置

在你的 XML 中加入 MapperFactoryBean 以便將映射器注冊到 Spring 中。就像下面一樣:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

如果映射器接口 UserMapper 在相同的類路徑下有對應的 MyBatis XML 映射器配置文件,將會被 MapperFactoryBean 自動解析。不需要在 MyBatis 配置文件中顯式配置映射器,除非映射器配置文件與接口類不在同一個類路徑下。 參考 SqlSessionFactoryBean 的 configLocation 屬性以獲取更多信息。

注意 MapperFactoryBean 需要配置一個 SqlSessionFactory 或 SqlSessionTemplate。它們可以分別通過 sqlSessionFactory 和 sqlSessionTemplate 屬性來進行設置。 如果兩者都被設置,SqlSessionFactory 將被忽略。由于 SqlSessionTemplate 已經設置了一個 session 工廠,MapperFactoryBean 將使用那個工廠。

2. Java 配置

@Configuration
public class MyBatisConfig {@Beanpublic MapperFactoryBean<UserMapper> userMapper() throws Exception {MapperFactoryBean<UserMapper> factoryBean = new MapperFactoryBean<>(UserMapper.class);factoryBean.setSqlSessionFactory(sqlSessionFactory());return factoryBean;}
}

二、發現映射器

不需要一個個地注冊你的所有映射器。你可以讓 MyBatis-Spring 對類路徑進行掃描來發現它們。

有幾種辦法來發現映射器:

  • 使用 <mybatis:scan/> 元素
  • 使用 @MapperScan 注解
  • 在經典 Spring XML 配置文件中注冊一個 MapperScannerConfigurer
    <mybatis:scan/> 和 @MapperScan 都在 MyBatis-Spring 1.2.0 中被引入。@MapperScan 需要你使用 Spring 3.1+。

1. <mybatis:scan/>

<mybatis:scan/> 元素會發現映射器,它發現映射器的方法與 Spring 內建的 <context:component-scan/> 發現 bean 的方法非常類似。

注意引入mybatis的命名空間

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd"><mybatis:scan base-package="org.mybatis.spring.sample.mapper" /><!-- ... --></beans>

base-package 屬性允許你設置映射器接口文件的基礎包。通過使用逗號或分號分隔,你可以設置多個包。并且會在你所指定的包中遞歸搜索映射器。

2.@MapperScan ( 建議 ) \color{#00FF00}{(建議)} (建議)

當你正在使用 Spring 的基于 Java 的配置時(也就是 @Configuration),相比于使用 mybatis:scan/,你會更喜歡用 @MapperScan。

@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {// ...
}

這個注解具有與之前見過的 mybatis:scan/ 元素一樣的工作方式。它也可以通過 markerInterface 和 annotationClass 屬性設置標記接口或注解類。 通過配置 sqlSessionFactory 和 sqlSessionTemplate 屬性,你還能指定一個 SqlSessionFactory 或 SqlSessionTemplate。
NOTE 從 2.0.4 起,如果 basePackageClasses 或 basePackages 沒有定義, 掃描將基于聲明這個注解的類所在的包。

三、MapperScannerConfigurer

apperScannerConfigurer 是一個 BeanDefinitionRegistryPostProcessor,這樣就可以作為一個 bean,包含在經典的 XML 應用上下文中。為了配置 MapperScannerConfigurer,使用下面的 Spring 配置:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

如果你需要指定 sqlSessionFactory 或 sqlSessionTemplate,那你應該要指定的是 bean 名而不是 bean 的引用,因此要使用 value 屬性而不是通常的 ref 屬性:

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

提示 在 MyBatis-Spring 1.0.2 之前,sqlSessionFactoryBeansqlSessionTemplateBean屬性是唯一可用的屬性。 但由于 MapperScannerConfigurer 在啟動過程中比 PropertyPlaceholderConfigurer 運行得更早,經常會產生錯誤。基于這個原因,上述的屬性已被廢棄,現在建議使用 sqlSessionFactoryBeanNamesqlSessionTemplateBeanName 屬性。


總結

回到頂部

我是比較傾向于使用@MapperScan注解去掃描包的,用起來很方便。

學習到這里,你對mybatis的掌握能力已經達到星耀了,稍加練習;王者,指日可待!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15674.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫--數據庫基礎(一)

目錄 第一章 緒論 一.數據庫的基本概念 1. 數據庫的4個基本概念 2、數據庫系統的特點 二.數據庫和文件 三.數據模型 1.概念模型 2.邏輯模型(物理模型) 2.1關系模型 四.數據庫系統的三級模式結構&#xff1a; 五數據庫的二級映像功能與數據獨立性 第二章 關系數據庫…

WEBPACK開發|生產環境配置(抽離公共部分)

這是webpack4演示&#xff0c;webpack5有些插件不在推薦&#xff0c; 1. webpack.base.config.js文件的配置說明 const path require(path); const webpack require(webpack); const ExtractTextPlugin require(extract-text-webpack-plugin); // 該插件的主要是為了抽離c…

【LeetCode面試經典150題】100. 相同的樹

一、題目 100. 相同的樹 - 力扣&#xff08;LeetCode&#xff09; 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 二、思路 二叉樹的題&#…

C++的lambda函數、bind函數、類函數綁定參數,學習測試用例

在C中&#xff0c;Lambda函數、std::bind 和類函數綁定參數提供了靈活的方式來處理函數調用。 Lambda函數是一種匿名函數&#xff0c;可以捕獲外部變量并在函數體內使用。它們提供了簡潔而強大的方式來定義內聯函數。std::bind 用于創建一個新的函數對象&#xff0c;其中部分參…

2024電工杯數學建模B題高質量成品論文,包括代碼數據

2024電工杯數學建模B題高質量成品論文&#xff0c;包括代碼數據 完整內容見文末名片 摘要 大學時期是學生們知識學習和身體成長的重要階段&#xff0c;良好的飲食習慣對于促進生長發育和保證身體健康具有重要意義。針對當前大學生中存在的飲食結構不合理及不良飲食習慣的問題…

為了性能,放棄tft_eSPI,選擇arduino_gfx吧

本來對于tft_espi和arduino_gfx沒啥特別的感覺&#xff0c;都是tft屏幕驅動,arduino_gfx的好處就是除了支持tft外還支持一些oled屏幕。 誰知道在探尋我那個在單片機項目上顯示中文方案 https://github.com/StarCompute/tftziku 時候&#xff0c;尋求極致性能測了一些東西。 t…

23種設計模式之一————工廠模式詳細講解

工廠模式介紹 定義分類工廠模式核心角色&#xff1a;簡單工廠模式定義特點優點缺點應用場景代碼實現 工廠方法模式&#xff08;別名&#xff1a;虛擬構造&#xff09;定義特點優點缺點應用場景代碼實現 抽象工廠模式定義特點優點缺點應用場景代碼實現工廠模式小結 定義 工廠模…

算法之背包問題

可分的背包問題是可以用貪心法來解決&#xff0c;而0-1背包問題通常使用動態規劃方法來解決。 可分背包問題&#xff1a; 在可分背包問題中&#xff0c;物品可以被分割&#xff0c;您可以取走物品的一部分以適應背包的容量。這里的關鍵是物品的價值密度&#xff0c;即單…

最小產品價格差值

題目描述 給定某產品多少天的價格&#xff0c;記錄于prices中&#xff0c;請找出任意兩天之間的最小價格差&#xff08;即abs(prices[i] - prices[j])&#xff09;的最小值&#xff0c;i!j&#xff09;并計算最小介個差組合的個數 樣例1 輸入 [1,3,7,5,12] 輸出 3 樣例2…

VTK9.2.0+QT5.14.0繪制三維顯示背景

背景 上一篇繪制點云的博文中&#xff0c;使用的vtkCameraOrientationWidget來繪制的坐標軸&#xff0c;最近又學習到兩種新的坐標軸繪制形式。 vtkOrientationMarkerWidget vtkAxesActor 單獨使用vtkAxesActor能夠繪制出坐標軸&#xff0c;但是會隨著鼠標操作旋轉和平移時…

微服務中使用Maven BOM來管理你的版本依賴

摘要: 原創出處 sf.gg/a/1190000021198564 「飄渺Jam」歡迎轉載&#xff0c;保留摘要&#xff0c;謝謝&#xff01; 為什么要使用BOM? 如何定義BOM? 項目使用方法? BOM&#xff08;Bill of Materials&#xff09;是由Maven提供的功能,它通過定義一整套相互兼容的jar包版…

通過 NIO + 多線程 提升硬件設備與系統的數據傳輸性能

一、項目展示 下圖&#xff08;模擬的數據可視化大屏&#xff09;中數據是動態顯示的 二、項目簡介 描述&#xff1a;使用Client模擬了硬件設備&#xff0c;比如可燃氣體濃度檢測器。Client通過Socket與Server建立連接&#xff0c;Server保存數據到txt文件&#xff0c;并使用W…

結構體(位段)內存分配

結構體由多個數據類型的成員組成。那編譯器分配的內存是不是所有成員的字節數總和呢&#xff1f; 首先&#xff0c;stu的內存大小并不為29個字節&#xff0c;即證明結構體內存不是所有成員的字節數和。 ??其次&#xff0c;stu成員中sex的內存位置不在21&#xff0c;即可推測…

Swift 請求用戶授權以跟蹤其跨應用或網站的活動

步驟1:導入框架 首先,需要在Swift文件中導入AppTrackingTransparency框架。 import AppTrackingTransparency import AdSupport步驟2:請求跟蹤許可 在適當的地方請求用戶的跟蹤許可。通常,這個請求會在應用啟動時或者在用戶執行某些操作(例如,訪問應用中的廣告相關功能…

Linux服務器安裝docker,基于Linux(openEuler、CentOS8)

本實驗環境為openEuler系統(以server方式安裝)&#xff08;CentOS8基本一致&#xff0c;可參考本文) 目錄 知識點實驗 知識點 Docker 是一個開源的應用容器引擎。它允許開發者將應用及其所有依賴項打包到一個可移植的容器中&#xff0c;并發布到任何支持Docker的流行Linux或Wi…

基于python flask的web服務

基本例子 from flask import Flask app Flask(__name__) app.route(/)#檢查訪問的網址&#xff0c;根路徑走這里 def hello_world():return hello world#返回hello worldif __name__ __main__:# 綁定到指定的IP地址和端口app.run(host0.0.0.0, port1000, debugTrue)##綁定端…

設計一個完美的用戶角色權限表

設計一個完美的用戶角色權限表需要考慮系統的安全性、靈活性和可擴展性。以下是一個詳細的用戶角色權限管理表設計方案&#xff0c;包含多個表結構和字段描述。 目錄 1. 用戶表&#xff08;Users Table&#xff09;2. 角色表&#xff08;Roles Table&#xff09;3. 權限表&…

【數據結構與算法 | 基礎篇】環形數組模擬隊列

1. 前言 上文我們用環形單向鏈表實現了隊列.接下來我們用環形數組來模擬隊列.并實現了isFull()&#xff0c;isEmpty()等方法. 2. 環形數組模擬隊列 (1). Queue接口 : public interface Queue<E> {//向隊伍插入值, 插入成功返回true, 否則返回falseboolean offer(E v…

【Linux】TCP協議【上】{協議段屬性:源端口號/目的端口號/序號/確認序號/窗口大小/緊急指針/標記位}

文章目錄 1.引入2.協議段格式4位首部長度16位窗口大小32位序號思考三個問題【demo】標記位URG: 緊急指針是否有效提升某報文被處理優先級【0表示不設置1表示設置】ACK: 確認號是否有效PSH: 提示接收端應用程序立刻從TCP緩沖區把數據讀走RST: 對方要求重新建立連接; 我們把攜帶R…

windows 設置系統字體 (win11 win10)

由于微軟的字體是有版權的&#xff0c;所以我打算替換掉 1.下載替換工具 github的項目&#xff0c;看起來很多人對微軟默認字體帶版權深惡痛絕。 項目地址&#xff1a;nomeiryoUi地址 這里選取最新的版本即可 2.打開軟件 這里顯示標題欄不能改&#xff0c;確認&#xff0c;其…