MyBatis的補充用法

說明:之前介紹過MyBatis的用法,像 用注解和Mapper.xml操作數據庫、在Mapper.xml里寫動態SQL。最近在一次用MyBatis批量更新數據庫對象的場景中,意識到對MyBatis的一些標簽用法不太熟悉,所以去 MyBatis官網 看了一些文檔,基于此,本文介紹一些可能會用到的MyBatis用法。

$ 占位符

通常我們會使用#{}表示占位符,即該位置的值使用傳遞的參數,在運行SQL拼接時,會用 ?占位,在執行SQL的時候才會將我們的參數替換執行,不會有SQL注入的風險。如下:

(controller層)

    /*** 查詢用戶* @param id* @return*/@GetMapping("/getUser/{id}")public String getUser(@PathVariable("id") String id){return userMapper.getUser(id).toString();}

(mapper層)

    @Select("select * from user where id = #{id}")User getUser(String id);

控制臺打印的執行日志:

在這里插入圖片描述

換成 ${}再看下:

    @Select("select * from tb_user where id = ${id}")User getUser(String id);

查看控制臺可以看到,執行過程是直接將參數進行拼接的;

在這里插入圖片描述

這么說,那還需要這個干什么,直接用#{}不就行了。我在查看官網文檔時,文檔提到了一個用法,可以動態查詢數據庫表中的某列字段,如下:

    @Select("select ${field} from tb_user where id = #{id}")User getUser(String field, String id);

field表示User表中的任意字段,該接口的作用就是根據ID查詢User表中的任意字段值,該字段可用前端、或者Service層判斷后傳入;

(field傳username,表示根據ID查詢username)

在這里插入圖片描述

(field傳password,表示根據ID查詢password)

在這里插入圖片描述

另外,如果可以你還可以在 order by 后面方放一個 ${sortField}(根據某字段排序),讓結果集的排序可根據前端或者Service層來動態的控制,非常靈活。這也算是$ 占位符的一抹光輝。

使用上的注意事項,官網中有一段說明,如下:

在這里插入圖片描述

script 標簽

我們都知道,使用Mabatis框架操作數據庫有兩種方式,一種是在Mapper中的接口上寫注解,注解里寫SQL語句,就像上面那樣;一種是在對應的Mapper.xml中寫SQL,關聯到具體的Mapper接口,如下:

(namespace里寫Mapper的全限定類名,mapper標簽里面寫對應類里的接口,id為方法名,resultType為結果集封裝的對象的全限定類名)

<mapper namespace="com.hezy.mapper.UserMapper"><select id="getUser" resultType="com.hezy.pojo.User">select *from tb_userwhere id = #{id}</select>
</mapper>

關于這兩種方式該怎么選擇,官網中也有一段非常優雅的描述,如下:

在這里插入圖片描述

script標簽 的作用,就是把Mapper.xml中的動態SQL寫在注解里,如下,根據ID更新數據,在Mapper.xml我們是這么寫的。

    <update id="updateUserById">update tb_user<set><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if></set>where id = #{id}</update>

如果你不想寫在Mapper.xml里面(雖然不知道你為什么不想),就可以使用 script標簽 我們可以把它寫在注解里,如下:

    @Update("<script>" +"update tb_user " +"<set>" +"<if test='username != null'>username = #{username},</if>" +"<if test='password != null'>password = #{password}</if>" +"where id = #{id}" +"</set>" +"</script>")void updateUserById(User user);

雖然有點麻煩,我調試了一會兒,但效果是一樣

trim 標簽

在介紹trim標簽前,先介紹我們經常會用到的兩個標簽:<set>標簽 和 <where>標簽

<set>標簽 在更新數據時使用,如下:

    <update id="updateUserById">update tb_user<set><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if></set>where id = #{id}</update>

它的作用是可以在拼接SQL時,刪掉多于的逗號(,),比如上面這段動態SQL,當password值不為空時,拼接出來的SQL是下面這樣的:

update tb_user set username = 'zhangsan_fix', password = '123456_fix', where id = '1'

執行會報錯;

在這里插入圖片描述


<where>標簽 在復雜的條件查詢時使用,如下:

    <select id="queryUser" resultType="com.hezy.pojo.User">select * from tb_user<where><if test="id != null and id != ''">and id = #{id}</if><if test="username != null and username != ''">and username = #{username}</if><if test="password != null and password != ''">and password = #{password}</if></where></select>

它的作用是可以在拼接SQL時,刪掉多于的 and 或者 or,像上面的動態SQL,如果id不為空,就會在where 后面拼接一個莫名其妙的and,這樣的SQL同樣是執行不成功的。


trim 標簽的作用是,可以自定義選擇在哪個關鍵字附近添加或刪減什么字符。trim 標簽屬性如下:

  • prefix:前面拼接的內容;

  • suffix:后面拼接的內容;

  • prefixOverrides:去除的前綴內容;

  • suffixOverrides:去除的后綴內容

trim 標簽可以起到<set>標簽 和 <where>標簽相同的作用,如下:

(trim標簽里面的語句,前面加個 set,末尾多于的逗號去掉,等同于 <set>標簽

    <update id="updateUserById">update tb_user<trim prefix="set" suffixOverrides=","><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if></trim>where id = #{id}</update>

控制臺打印的日志信息

在這里插入圖片描述

(trim標簽里面的語句,前面加個 where,去掉前面多于的and 或者 or ,等同于 <where>標簽

    <select id="queryUser" resultType="com.hezy.pojo.User">select * from tb_user<trim prefix="where" prefixOverrides="and |or "><if test="id != null and id != ''">and id = #{id}</if><if test="username != null and username != ''">and username = #{username}</if><if test="password != null and password != ''">and password = #{password}</if></trim></select>

控制臺打印的日志信息

在這里插入圖片描述

官網中有說明,and |or 這里的空格是必要的,但我去掉之后執行時沒有問題的,或許是考慮在一些特殊的場景沒有空格是會有問題的。我想不到,有讀者想得到請告訴我(do ze)。

在這里插入圖片描述

總結

本文介紹了MyBatis一些補充用法

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

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

相關文章

php httpfs鏈接hdfs

一.代碼&#xff08;有bug&#xff09; GitHub - michaelbutler/php-WebHDFS: A PHP client for WebHDFS 二.調用代碼 1.代碼1.代碼 require_once(../webhdfs/src/org/apache/hadoop/WebHDFS.php);require_once(../webhdfs/src/org/apache/hadoop/tools/Curl.php); require_o…

什么是人才儲備?如何做人才儲備?

很多小伙伴都會有企業面試被拒的情況&#xff0c;然后HR會告訴你&#xff0c;雖然沒有錄用你&#xff0c;但是你進入了他們的人才儲備庫&#xff0c;那么這個儲備庫有什么作用和特點呢&#xff1f;我們如何應用人才測評系統完善人才儲備庫呢&#xff1f; 人才儲備一般有以下三…

Python打發無聊時光:12.用PyQt實現簡易的心電起搏器界面

第一步&#xff1a;裝PyQt庫 pip install PyQt5 第二步&#xff1a;復制代碼 import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout,QWidget, QLabel, QProgressBar, QSlider, QLineEdit, QHBoxLayout) from PyQt5.QtCore import …

軟件分層(數據結構/軟件邏輯上分層+舉例),相連節點的概念+如何相連,為什么是層狀結構(軟件分層,網絡協議分層+梳理協議順序),協議分層(打電話例子)

目錄 軟件分層 介紹 舉例 類的繼承 虛擬文件系統 線程接口封裝 虛擬地址空間 總結 為什么是層狀的 軟件分層 網絡協議 原因 梳理協議順序 相連節點 協議分層 引入 示例 實際上 邏輯上 制定出協議 軟件分層 介紹 通過將軟件系統劃分為不同的層次,每一層都有…

uniApp 調整小程序 單個/全部界面橫屏展示效果

我們打開uni項目 小程序端運行 默認是豎著的一個效果 我們打開項目的 pages.json 給需要橫屏的界面 的 style 屬性 加上 "mp-weixin": {"pageOrientation": "landscape" }界面就橫屏了 如果是要所有界面都橫屏的話 就直接在pages.json 的 gl…

Ps:海綿工具

海綿工具 Sponge Tool可用于調整圖像中特定區域的飽和度&#xff0c;常用于增加或減少顏色的飽和度。 快捷鍵&#xff1a;O 在特別的灰度圖像上&#xff0c;則可用于調整對比度&#xff0c;這可以開發出更多的創意技巧。 ◆ ◆ ◆ 常用操作方法與技巧 1、海綿工具主要用于調整…

源碼解析篇 | YOLOv8官方源碼項目目錄結構解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥談。YOLOv8是一種目標檢測算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的第8個版本。YOLOv8相比于之前的版本&#xff0c;在檢測精度和速度上都有所提升&#xff0c;它在各種場景下都表現出色…

Git源碼管理

參考視頻&#xff1a;16-git的日志以及版本管理_嗶哩嗶哩_bilibili 參考博客&#xff1a;Git && Docker 學習筆記-CSDN博客 目錄 簡介 個人操作初始化 初始化git目錄 查看生成的git目錄文件 配置git工作目錄的用戶信息 查看工作區的狀態&#xff0c;生成文件的…

【JS】生成N位隨機數

作用 用于郵箱驗證碼 碼 ramNum.js /*** 生成N位隨機數字* param {Number} l 默認&#xff1a;6&#xff0c;默認生成6位隨機數字* returns 返回N位隨機數字*/ const ramNum (l 6) > {let num for (let i 0; i < l; i) {const n Math.random()const str String(n…

C++面試干貨---帶你梳理常考的面試題(一)

顧得泉&#xff1a;個人主頁 個人專欄&#xff1a;《Linux操作系統》 《C從入門到精通》 《LeedCode刷題》 鍵盤敲爛&#xff0c;年薪百萬&#xff01; 1.C和C的區別 1.語法和特性&#xff1a;C是一種過程式編程語言&#xff0c;而C是一種面向對象編程語言。C在C的基礎上增加…

Java智慧云HIS醫院信息化系統源碼 更具靈活性、擴展性

目錄 什么是云HIS 趨勢與轉變 HIS上云后有哪些好處 解決方案 云HIS組成 1、門診掛號 2、住院管理 3、電子病歷 4、藥物管理 5、統計報表 6、綜合維護 7、運營運維 什么是云HIS 云HIS是一種基于云計算技術的醫院信息管理系統。云HIS可以幫助醫院管理各類醫院信息&a…

CIE-Alevel-Physics分類真題下載(更新中)

鏈接真題歸類年份https://www.savemyexams.com/https://gceguide.com/papershttps://pastpapers.papacambridge.com/https://rocketrevise.comhttps://www.exam-mate.com/markhint.inhttps://xtremepape.rs/threads/as-and-a-level-physics-topical-pastpapers-upto-2015-with-…

Java Linux基本命令面試題

Java Linux基本命令面試題 前言1、查看文件內容有哪些命令可以使用&#xff1f;2、終端是哪個文件夾下的哪個文件&#xff1f;黑洞文件是哪個文件夾下的哪個命令&#xff1f;3、用什么命令對一個文件的內容進行統計&#xff1f;(行號、單詞數、字節數)4、怎么使一個命令在后臺運…

每日OJ題_分治歸并②_力扣LCR 170. 交易逆序對的總數

目錄 力扣LCR 170. 交易逆序對的總數 解析代碼1 解析代碼2 力扣LCR 170. 交易逆序對的總數 LCR 170. 交易逆序對的總數 難度 困難 在股票交易中&#xff0c;如果前一天的股價高于后一天的股價&#xff0c;則可以認為存在一個「交易逆序對」。請設計一個程序&#xff0c;輸…

Linux系統中安裝redis+redis后臺啟動+常見相關配置

1、下載Redis Redis官網&#xff1a;https://redis.io/ 歷史版本&#xff1a; http://download.redis.io/releases 2、連接Linux&#xff08;或者VMwear&#xff09; 我們安裝的是linux版本的redis 打開xftp我們需要先將我們的Redis上傳到服務器上 解壓到這里 解壓的指令 …

創建型模式之建造者模式

一、概述 1、建造者模式&#xff1a;將一個復雜對象的構建和它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示 2、將客戶端與包含多個部件的復雜對象的創建過程分離&#xff0c;客戶端無須知道復雜對象的內部組成部分與裝配方式&#xff0c;只需要知道所需建造…

Spring MVC源碼中設計模式——適配器模式

適配器模式介紹 適配器模式&#xff08;Adapter Pattern&#xff09;是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬于結構型模式&#xff0c;它結合了兩個獨立接口的功能。 應用場景&#xff1a; 1、系統需要使用現有的類&#xff0c;而此類的接口不符合系統的需要…

[c++] 繼承和多態整理一

1 private 和 protected 繼承&#xff0c;子類指針不能賦值給父類指針 如下代碼&#xff0c;有一個基類 Base&#xff0c;Derived1&#xff0c;Derived2&#xff0c;Derived3 3 個子類繼承了基類 Base&#xff0c;分別是 private 繼承&#xff0c;protected 繼承&#xff0c;p…

基于springboot+vue的紡織品企業財務管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Socket網絡編程(五)——TCP數據發送與接收并行

目錄 主要實現需求TCP 服務端收發并行重構啟動main方法重構重構分離收發消息的操作重構接收消息的操作重構發送消息TCPServer調用發送消息的邏輯監聽客戶端鏈接邏輯重構Socket、流的退出與關閉 TCP 客戶端收發并行重構客戶端 main函數重構客戶端接收消息重構客戶端發送消息重構…