二、Mapper映射文件

来源:https://www.cnblogs.com/lee0527/archive/2019/11/21/11908846.html
-Advertisement-
Play Games

Mapper映射文件 mapper.xml映射文件主要是用來編寫SQL語句的,以及一些結果集的映射關係的編寫,還有就是緩存的一些配置等等。 在映射文件裡面可以配置以下標簽: | 元素名稱 | 描述 | 備註 | | | | | | select | 查詢語句,最常用、最複雜的元素之一 | 可以自定義 ...


Mapper映射文件

mapper.xml映射文件主要是用來編寫SQL語句的,以及一些結果集的映射關係的編寫,還有就是緩存的一些配置等等。

在映射文件裡面可以配置以下標簽:

元素名稱 描述 備註
select 查詢語句,最常用、最複雜的元素之一 可以自定義參數,返回結果集等
insert 插入語句 執行後返回一個整數,代表插入的條數
update 更新語句 執行後返回一個整數,代表更新的條數
delete 刪除語句 執行後返回一個整數,代表刪除的條數
parameterMap 定義參數映射關係 即將被刪除的元素,不建議大家使用
sql 允許定義一部分的SQL,然後在各個地方引用
resultMap 用來描述從資料庫結果集中來載入對象,它是它將提供映射規則最複雜、最強大的元素 它提供映射規則
cache 給定命名空間的緩存配置
cache-ref 其他命名空間緩存配置的引用

引入映射器

  • 可以在mybatis-config.xml中通過文件路徑引入

    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
  • 通過包名引入

    這樣會將mapper下的所有mapper類載入到上下文當中

    <mappers>
        <package name="com.zl.mapper"/>
    </mappers>
  • 用類註冊引入

    <mappers>
        <mapper class="com.zl.mapper.UserMapper"/>
    </mappers>

Select標簽

  • id
    它和 Mapper的命名空間組合起來是唯一的,提供給MyBatis調用。如果命名空間和id組合起來不唯一將拋出異常。
  • parameterType
    可以給出類的全命名,也可以給出類的別名,但使用別名必須是MyBatis內部定義或者自定義的。
  • resultType
    定義類的全路徑,在允許自動匹配的情況下,結果集將通過JavaBean的規範映射;也可以定義為int、 double等參數;也可以使用別名,但是要符合別名規範;不能和 resultMap同時使用。
  • resultMap
    外部 resultMap 的命名引用。
  • flushCache
    它的作用是在調用SQL後,是否要求清空之前查詢的本地緩存和二級緩存
  • useCache
    將其設置為 true,將會導致本條語句的結果被二級緩存,預設值:true。
  • timeout
    這個設置是在拋出異常之前,驅動程式等待資料庫返回請求結果的秒數。預設值為 unset(依賴驅動)。
  • fetchSize
    這是嘗試影響驅動程式每次批量返回的結果行數和這個設置值相等。預設值為 unset(依賴驅動)。
  • statementType
    STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,預設值:PREPARED。
  • resultSetType
    FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,預設值為 unset (依賴驅動)。
  • databaseId
    如果配置了 databaseIdProvider,MyBatis 會載入所有的不帶 databaseId 或匹配當前 databaseId 的語句;如果帶或者不帶的語句都有,則不帶的會被忽略。
  • resultOrdered
    這個設置僅針對嵌套結果 select 語句適用:如果為 true,就是假設包含了嵌套結果集或是分組了,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的情況。這就使得在獲取嵌套的結果集的時候不至於導致記憶體不夠用。預設值:false。
  • resultSets
    這個設置僅對多結果集的情況適用,它將列出語句執行後返回的結果集並每個結果集給一個名稱,名稱是逗號分隔的。

自動映射

自動映射可以在settings元素中配置autoMappingBehavior屬性值來設置其策略:

  • NONE,取消自動映射。
  • PARTIAL(預設值),只會自動映射,沒有定義嵌套結果集映射的結果集。
  • FULL,會自動映射任意複雜的結果集(無論是否嵌套),在性能上會下降。

Insert標簽

insert的很多配置元素是和select一樣的,就不再贅述,下麵列出select中沒有的屬性

  • keyProperty

    表示以哪個列作為屬性的主鍵,不能和keyColumn同時使用

  • keyColumn

    表示第幾列是主鍵,不能和keyProperty同時使用

  • useGeneratedKeys

    這會令MyBatis使用JDBC的getGeneratedKeys方法來取出由資料庫內部生成的主鍵,但是使用它就必須要給keyProperty或者 keyColumn賦值

主鍵回填

方式一

<insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
    insert into t_book (b_name,author) values (#{name},#{author});
</insert>

這種方式比較簡單,就是在插入節點上添加 useGeneratedKeys 屬性,同時設置接收回傳主鍵的屬性。配置完成後,我們執行一個插入操作,插入時傳入一個對象,插入完成後,這個對象的 id 就會被自動賦值,值就是剛剛插入成功的id。

推薦大家使用這種方式,原因很簡單,這種方式實現簡便省事。

方式二

第二種方式則是利用MySQL自帶的 last_insert_id() 函數查詢剛剛插入的id,示例代碼如下:

<insert id="insertBook">
    <selectKey keyProperty="id" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into t_book (b_name,author) values (#{name},#{author});
</insert>

這種方式是在 insert 節點中添加 selectKey 來實現主鍵回填,實際上這種方式的功能更加豐富,因為 selectKey 節點中的 SQL 我們既可以在插入之前執行,也可以在插入之後執行(通過設置節點的 Order 屬性為 AFTER 或者 BEFORE 可以實現),具體什麼時候執行,還是要看具體的需求,如果是做主鍵回填,我們當然需要在插入 SQL 執行之後執行 selectKey 節點中的 SQL。

註意第二種方式一樣也要通過設置 keyProperty 來指定將查詢到的數據綁定到哪個屬性上。

參數配置

我們可以傳入一個簡單的參數如基本類型和字元串;也可以傳入JavaBean;還可以指定特定的類型,以確定使用哪個 typeHandler處理它們。定義參藪屬性的時候,MyBatis不允許換行

  • {age, javaType=int, jdbcType=NUMERIC}

  • 指定typeHandler:#{age, javaType=int, jdbcType=NUMERIC, typeHandler=MyTypeHandler}
  • 數值型的參數設置其保存的精度:#{price, javaType=double, jdbcType=NUMERIC, numericScale=2}

resultMap結果映射集

resultMap裡面標簽如下圖所示:

png

  • constructor元素用於配置構造方法,一個POJO可能不存在無參數的構造方法,這個時候我們就可以使用 constructor進行配置。
  • id元素是表示哪個列是主鍵,允許多個主鍵構成聯合主鍵。
  • result是配置POJO到SQL列名的映射關係。

  • association代表一對一關係,比如每個班級都有一個班長

    具體見:Mybatis中association的用法

  • collection代表一對多關係,比如每個班級有多個學生

    具體見:Mybatis中collection的用法

  • discriminator鑒別器,它可以根據實際選擇採用哪個類作為實例,允許你根據特定的條件去關聯不同的結果集合

延遲載入

全局延遲載入

為了處理N+1的問題,My Batis引入了延遲載入的功能。延遲載入功能的意義在於,開始並不取出級聯數據,只有當使用它了才發送SQL去取回數據。MyBatis的配置中有兩個全局的參數lazyLoadingEnabled和aggressiveLazyLoading。

  • lazyLoadingEnabled的含義是是否開啟延遲載入功能;
  • aggressiveLazyLoading的含義是對任意延遲屬性的調用會使帶有延遲載入屬性的對象完整載入;反之,每種屬性將按需載入。

局部延遲載入

由於全局配置的靈活性較差,MyBatis提供了局部延遲載入的功能。我們可以在association和 collection元素上加入屬性值fetchType就可以了。

緩存

一級緩存

  • MyBatis對緩存提供支持,在沒有配置的預設的情況下,它只開啟一級緩存(一級緩存只是相對於同一個 SqlSession而言),所以在參數和SQL完全一樣的情況下,我們使用同一個 SqlSession對象調用同一個Mapper的方法,往往只執行一次SQL。
  • 使用SqlSession第一次查詢後,MyBatis會將其放在緩存中。以後再查詢的時候,如果沒有聲明需要刷新且緩存沒超時,SqlSession都只會取出當前緩存的數據,而不會再次發送SQL到資料庫。
  • 如果使用的是不同的SqlSession對象,因為不同的SqlSession都是相互隔離的,所以用相同的 Mapper、參數和方法,它還是會再次發送SQL到資料庫去執行。
  • 當我們關閉SqlSession對象後,緩存就會失效。

二級緩存

一級緩存在各個SqlSession間是相互隔離的。為了剋服這個問題,我們往往需要配置二級緩存,使得緩存在SqlsessionFactory層面上能夠提供給各個SqISession對象共用,二級緩存預設是不開啟的

  1. 二級緩存的時候要求返回的POJO必須是可序列化的,也就是要求實現Serializable介面。
  2. 配置的緩存的方法很簡單,只需要在Mapper.xml文件中加入<cache/>
  3. 映射語句文件中的所有insert、update和delete語句會刷新緩存

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述: 在Java中存在一些基本數據類型,這些基本數據類型變數,不能像其他對象一樣調用方法,屬性.... 一些情況下帶來一些問題,包裝類就是為瞭解決這個問題而出現 包裝類可以使得這些基礎數據類型,擁有對象的能力 包裝類與基礎類型的對應關係 特點: 包裝類都是final修飾無法繼承 數字類型的父類都是 ...
  • 進程管理控制 這裡實現的是一個自定義timer用於統計子進程運行的時間。使用方式主要是 例如要統計 的運行時間可以直接輸入 ,其後的 是指所要運行的程式的參數。如: 。如果要指定程式運行多少時間,如5秒鐘,可以輸入 。需要註意的是,該程式對輸入沒有做異常檢測,所以要確保程式輸入正確。 Linux 程 ...
  • 線程狀態概述: 當線程被創建並啟動以後,它既不是一啟動就進入了執行狀態,也不是一直處於執行狀態。線上程的生命周期中, 有幾種狀態呢?在API中 java.lang.Thread.State 這個枚舉中給出了六種線程狀態 Timed Waiting(計時等待) Timed Waiting在API中的描 ...
  • 連接上imap服務後,什麼都不操作,我測試大約5分鐘會被服務端斷掉,測試代碼如下 為了保持住這條連接,每隔10秒列取一下郵件夾列表,這樣就可以一直保持住連接了。開三個視窗,一個視窗不停的netstat查看tcp連接情況,一個視窗運行代碼,一個視窗打開tcpdump監聽埠查看數據請求 while t ...
  • 本文介紹,PHP運行在FastCGI模式時,FPM提供的方法:fastcgi_finish_request。在說這個方法之前,我們先瞭解PHP有哪些常用的運行模式? PHP運行模式CGI 通用網關介面 / Common Gateway InterfaceCGI已經是比較老的模式了,這幾年都很少用了。 ...
  • 反射 反射的基本介紹 17.3.1 基本介紹 1) 反射可以在運行時 動態獲取變數的各種信息, 比如變數的類型(type),類別(kind) 2) 如果是結構體變數,還可以獲取到結構體本身的信息(包括結構體的 欄位、 方法) 3) 通過反射,可以修改變數的值,可以調用關聯的方法。 4) 使用反射,需 ...
  • 技術:Java;JSP;Struts2 spring hibernate資料庫: mysqlweb伺服器:tomcat集成開發工具: MyEclipse2014基於SSH的嬰幼兒產品銷售系統主要實現基本的網路購物的功能。本系統結構如下:1,游客訪問 |--系統首頁,查看所有的商品信息和相關的菜單信息 ...
  • 安裝Homebrew 如果已經安裝可以忽略,沒有安裝的請查看小明之前寫好的文章 "mac安裝homebrew" 使用Homebrew安裝Redis (1) 安裝命令 (2) 查看軟體安裝及配置文件位置 Homebrew安裝的軟體會預設在 路徑下; redis的配置文件 存放在 路徑下。 (3) 啟動 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...