對Mapper.xml文件進行深入的學習

1.? 前言

既上次在Mapper.xml文件出現bug之后,痛改前非,決定吃透Mapper.xml映射文件。

讓我們通過具體的代碼段來進一步理解 MyBatis 的 Mapper XML 文件中的每個組成部分。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.goblin.BIbackend.mapper.BillsMapper"><resultMap id="BaseResultMap" type="com.goblin.BIbackend.model.entity.Bills"><id property="id" column="id" jdbcType="BIGINT"/><result property="userId" column="user_id" jdbcType="BIGINT"/><result property="amount" column="Amount" jdbcType="FLOAT"/><result property="billDate" column="bill_date" jdbcType="DATE"/><result property="dueDate" column="due_date" jdbcType="DATE"/><result property="isPaid" column="is_paid" jdbcType="BIGINT"/></resultMap><sql id="Base_Column_List">id,user_id,Amount,bill_date,due_date,is_paid</sql><select id="list" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills<where><if test="userId != null">user_id = #{userId}</if><if test="amount != null">and Amount = #{amount}</if><if test="billDate != null">and bill_date = #{billDate}</if><if test="dueDate != null">and due_date = #{dueDate}</if><if test="isPaid != null">and is_paid = #{isPaid}</if></where></select><select id="mySelectById" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills where id = #{id}</select><insert id="myInsert" parameterType="com.goblin.BIbackend.model.entity.Bills">insert into bills (user_id,Amount,bill_date,due_date,is_paid)values (#{userId},#{amount},#{billDate},#{dueDate},#{isPaid})</insert><delete id="myDeleteById" >delete from bills where id = #{id}</delete><select id="mySelectAll" resultMap="BaseResultMap">select * from bills</select><update id="myUpdate" parameterType="com.goblin.BIbackend.model.entity.Bills">update bills where id = #{id}</update></mapper>

2.? 各部分

2.1? <mapper>根元素

<mapper namespace="com.goblin.BIbackend.mapper.BillsMapper"><!-- 其他配置 -->
</mapper>

這個根元素定義了 XML 文件的命名空間,通常對應 Java 中的 Mapper 接口的完全限定名。這有助于區分不同的 Mapper 文件,防止 SQL 語句沖突。

2.2??<resultMap>?和字段映射

<resultMap id="BaseResultMap" type="com.goblin.BIbackend.model.entity.Bills"><id property="id" column="id" jdbcType="BIGINT"/><result property="userId" column="user_id" jdbcType="BIGINT"/><result property="amount" column="Amount" jdbcType="FLOAT"/><result property="billDate" column="bill_date" jdbcType="DATE"/><result property="dueDate" column="due_date" jdbcType="DATE"/><result property="isPaid" column="is_paid" jdbcType="BIGINT"/>
</resultMap>

這里定義了一個名為 BaseResultMap 的結果映射它將數據庫查詢結果映射到 com.goblin.BIbackend.model.entity.Bills 類的實例。

具體映射關系如下:

1. id屬性對應數據庫表的id列,數據類型為BIGINT。
2. userId屬性對應數據庫表的user_id列,數據類型為BIGINT。
3. amount屬性對應數據庫表的Amount列,數據類型為FLOAT。
4. billDate屬性對應數據庫表的bill_date列,數據類型為DATE。
5. dueDate屬性對應數據庫表的due_date列,數據類型為DATE。
6. isPaid屬性對應數據庫表的is_paid列,數據類型為BIGINT。

前面是實體類里面定義的名稱,后面是數據庫里面對應的字段名。?

2.3??<sql>?片段

<sql id="Base_Column_List">id, user_id, Amount, bill_date, due_date, is_paid
</sql>
  • id: 為 SQL 片段定義一個標識符,可以在?<select>?或其他元素中通過?<include>?引用。
  • 內容: 列出了查詢操作中需要的列名。這是為了避免在多個?<select>?元素中重復相同的列名列表。

2.4? 增刪改查SQL語句

<select id="list" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills<where><if test="userId != null">user_id = #{userId}</if><if test="amount != null">and Amount = #{amount}</if><if test="billDate != null">and bill_date = #{billDate}</if><if test="dueDate != null">and due_date = #{dueDate}</if><if test="isPaid != null">and is_paid = #{isPaid}</if></where></select><select id="mySelectById" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills where id = #{id}</select><insert id="myInsert" parameterType="com.goblin.BIbackend.model.entity.Bills">insert into bills (user_id,Amount,bill_date,due_date,is_paid)values (#{userId},#{amount},#{billDate},#{dueDate},#{isPaid})</insert><delete id="myDeleteById" >delete from bills where id = #{id}</delete><update id="myUpdate" parameterType="com.goblin.BIbackend.model.entity.Bills">update bills where id = #{id}</update>

parameterTyperesultType?在 SQL 映射文件中用于指定參數和結果的 Java 類型,但它們的作用和使用場景不同。?一定不能寫錯,否則測試接口的時候就錯亂了。

2.4.1??resultType

  • 作用resultType?用于指定 MyBatis 查詢操作返回的結果類型。這個屬性告訴 MyBatis 應該如何將查詢結果集的每一行映射到 Java 對象。
  • 使用場景:通常用在?<select>?元素中,用于定義查詢結果應該如何映射到 Java 類的實例。
  • 示例:
<select id="selectBlog" resultType="Blog">select * from Blog
</select>

在這個例子中,resultType?指定了查詢結果應該映射到?Blog?類的實例。

2.4.2??parameterType

  • 作用parameterType?用于指定 MyBatis 操作(如?<insert><update><delete>?或帶有參數的?<select>)中傳入的參數類型。這個屬性告訴 MyBatis 期待的參數對象的類型,MyBatis 會根據這個類型來自動映射方法參數和 SQL 語句中的占位符。
  • 使用場景:通常用在需要傳入參數執行數據庫操作的元素中,例如插入、更新或刪除操作。
  • 示例
<select id="selectById" parameterType="java.util.Map" resultType="com.example.Blog">select * from blog where id = #{id}
</select>

在這個例子中,parameterType?指定了方法的參數類型為?java.util.Map,這意味著你可以傳遞一個 Map 對象作為查詢參數。

2.4.3? 兩者區別總結?

  • 方向parameterType?定義了進入操作的參數類型,而?resultType?定義了從數據庫查詢返回的結果類型。
  • 使用位置parameterType?通常用在需要參數的 SQL 操作中,resultType?則用在查詢操作中。
  • 映射方式parameterType?映射的是方法的參數到 SQL 語句的占位符,resultType?映射的是查詢結果集到 Java 對象的屬性。

?2.4.5??占位符#{id}

在 SQL 映射文件中編寫 SQL 語句時,可以使用 #{} 來引用 Java 方法的參數。

<select id="selectBlog" resultType="Blog">SELECT * FROM blog WHERE id = #{id}
</select>

在這個例子中,#{id} 就是一個占位符,它將被 MyBatis 替換為方法參數 id 的值。

參數替換

MyBatis 會根據方法的參數列表自動替換 #{} 中的內容。如果方法的參數是一個簡單類型或 POJO(Plain Old Java Object),MyBatis 會根據參數的名稱來替換占位符。

預處理語句

使用 #{} 占位符的 SQL 語句會被 MyBatis 轉換為預處理語句(PreparedStatement),這樣可以提高性能并防止 SQL 注入攻擊。

類型處理

MyBatis 會根據參數的實際類型來設置 SQL 語句中的參數。例如,如果參數是 java.sql.Date 類型,MyBatis 會使用適當的 JDBC 方法來設置日期參數。

占位符總結

#{} 占位符是 MyBatis 中實現參數化查詢的關鍵機制,它允許開發者將 Java 方法的參數值安全、靈活地傳遞給 SQL 語句。通過使用 #{},MyBatis 可以自動處理參數的類型轉換和預處理語句的生成,從而提高數據庫操作的效率和安全性。

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

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

相關文章

python 爬取當當網圖書榜

首先查看當當網好評書單頁面&#xff0c;找到翻頁的URL參數 直接用requests請求頁面 resp requests.get(url) 找到想要的信息&#xff0c;使用正則表達式把這些信息提取出來 patternre.compile(list_num.*?(\d).<.*?<img src"(.*?)".*?title"(.*?…

Eel入門還有一些案例

Eel入門還有一些案例 Eel 是一個 Python 庫&#xff0c;它允許 Python 程序通過簡單的 API 與網頁進行交互。它使用 WebSocket 協議來實現 Python 后端和 JavaScript 前端之間的實時通信。下面是關于 Eel 的用法、通信原理和使用場景的一篇博客文章。 Eel的基本原理 Eel的基本原…

針對vue3的render函數添加自定義指令

話不多說 直接上代碼 主要是給h函數設置自定義指令控制 import /styles/reset.css import /styles/global.scss import uno.cssimport { createApp } from vue import App from ./App.vue import { setupRouter } from ./router import { setupStore } from ./store import …

Android studio之編譯提示Could not find :umeng-asms-v1.2.1

1 、問題 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

FGF14:腦部疾病新潛力靶標

成纖維細胞生長因子14&#xff08;FGF14&#xff09;是FGF11亞家族成員&#xff0c;在神經元的所有基本特性&#xff08;內在放電、興奮性和抑制性神經元的突觸傳遞和可塑性&#xff09;中發揮作用。 &#xff08;數據來源AlphaFold&#xff09; FGF14由247個氨基酸組成&#x…

實戰篇(九):解鎖3D魔方的秘密:用Processing編程實現交互式魔方

解鎖3D魔方的秘密:用Processing編程實現交互式魔方 使用 Processing 創建一個 3D 魔方效果展示1. 安裝 Processing2. 項目結構3. 代碼實現4. 代碼解釋4.1. 初始化魔方4.2. 繪制魔方4.3. 處理鼠標事件4.4. 檢查點擊的面4.5. 旋轉面和最終確定旋轉5. 運行和測試6. 細節解釋6.1. …

【資源調度】2-如何解決資源調度問題?

導讀&#xff1a;本期是全網最全【資源調度】系列推文的第2期(共50期左右)。上期我們在《何為調度&#xff1f;》中&#xff0c;對調度的定義與作用、計劃與調度的關系、調度問題的拆解做了詳細介紹。從本期開始&#xff0c;我們選擇【客服調度】場景作為【資源調度】問題的具象…

51單片機(STC8H8K64U/STC8051U34K64)_RA8889_8080參考代碼(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889開發板 硬件跳線變更為并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141無關 8080接口電路連接圖&#xff1a; 實物連接圖&#xff1a; RA8889開發板外接MCU連接器之引腳定義&…

IMS架構中的注冊與會話流程:RTPEngine集成及消息路由詳解

目錄 S-CSCF 調用 RTPengine 整體路由 注意 IMS 注冊流程 和 IMS 會話流程 的區別 IMS注冊流程 IMS會話流程(如INVITE請求) 這種設計的原因 P-CSCF 調用 RTPengine S-CSCF 調用 RTPengine 整體路由 UA a生成SDP offer&#xff0c;發送SIP INVITE請求(包含SDP offer)&…

核密度估計KDE和概率密度函數PDF(深入淺出)

目錄 1. 和密度估計&#xff08;KDE&#xff09;核密度估計的基本原理核密度估計的公式核密度估計的應用Python中的KDE實現示例代碼 結果解釋解釋結果 總結 2. 概率密度函數&#xff08;PDF&#xff09;概率密度函數&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用圖畫…

RDNet實戰:使用RDNet實現圖像分類任務(二)

文章目錄 訓練部分導入項目使用的庫設置隨機因子設置全局參數圖像預處理與增強讀取數據設置Loss設置模型設置優化器和學習率調整策略設置混合精度&#xff0c;DP多卡&#xff0c;EMA定義訓練和驗證函數訓練函數驗證函數調用訓練和驗證方法 運行以及結果查看測試完整的代碼 在上…

ubuntu顯卡驅動重啟后失效的解決辦法

寫在前方&#xff1a;ubuntu系統&#xff0c;顯卡重啟后驅動失效&#xff0c;顯卡不可用。網上沖浪之后得以有效解決&#xff0c;以下是解決方案 查看顯卡nvidia-smi&#xff1b;驅動失效消息&#xff1a; (base) rootnode:~# nvidia-smi NVIDIA-SMI has failed because it c…

AI大模型走進汽車車機,智駕將是未來

車機里的AI大模型在汽車行業中的應用越來越廣泛&#xff0c;主要體現在智能座艙和自動駕駛系統的深度融合上。通過將AI大模型應用于車機系統&#xff0c;可以實現更高智能化的人車交互體驗。AI大模型作為人工智能發展的核心引擎&#xff0c;正在成為汽車智能化發展的關鍵之一。…

基于顏色模型和邊緣檢測的火焰識別FPGA實現,包含testbench和matlab驗證程序

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 將FPGA仿真結果導入到matlab顯示結果&#xff1a; 測試樣本1 測試樣本2 測試樣本3 2.算法運行軟件版本 vivado2019.2 …

MySQL配置數據庫的連接命令

MySQL配置數據庫連接命令 在MySQL中&#xff0c;配置數據庫連接的命令涉及創建用戶、授予權限、配置主從復制等多個方面。以下是常用的命令及其用途&#xff1a; 創建用戶 創建一個新的數據庫用戶并為其設置密碼&#xff1a; CREATE USER usernamehost IDENTIFIED BY passwo…

mysql中的存儲過程

存儲過程的作用:有助于提高應用程序的性能。存儲過程可以不必發送多個冗長的SQL語句 廢話不說多&#xff0c;直接實操 ##實現num的相加 delimiter $$ CREATE PROCEDURE test1 () begindeclare num int default 0; -- 聲明變量,賦默認值為0select num20;end $$ delimiter ; …

計算機網絡高頻面試題

從輸入URL到展現頁面的全過程&#xff1a; 用戶在瀏覽器中輸入URL。瀏覽器解析URL&#xff0c;確定協議、主機名和路徑。瀏覽器查找本地DNS緩存&#xff0c;如果沒有找到&#xff0c;向DNS服務器發起查詢請求。DNS服務器解析主機名&#xff0c;返回IP地址。瀏覽器使用IP地址建立…

Kafka配置SASL認證

Kafka加密 Kafka認證方式 在本博客中我們使用SASL/PLAIN的方式來進行Kafka加密 環境準備 Kafka集群環境 請參考之前的Kafka集群搭建 kafka-broker1kafka-broker2 集群配置SASL/PLAIN認證 用戶校驗 修改server.properties 讓其支持Kafka的認證(每一個broker節點都需要修改這…

jail內部ubuntu apt升級失敗問題解決

在FreeBSD jail 里安裝啟動Ubuntu jammy系統&#xff0c;每次裝好執行jexec ubjammy sh進入Ubuntu系統后&#xff0c;執行apt update報錯。 這個問題困惑了好久&#xff0c;突然有一天仔細去看報錯信息&#xff0c;查看了(man 5 apt.conf) &#xff0c;才搞定問題。簡單來說就是…

MySQL 數據庫(基礎)- 函數

MySQL 數據庫&#xff08;基礎&#xff09;- 函數 介紹 函數 是指一段可以被另一段程序調用的程序或代碼。也意味著&#xff0c;這一段程序或代碼在 MySQL 中已經給我們提供了&#xff0c;我們需要做的就是在合適的業務場景調用對應的函數&#xff0c;完成對應的業務需求即可…