二、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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...