【第12章】MyBatis-Plus條件構造器(下)

文章目錄

  • 前言
  • 一、使用 TypeHandler
  • 二、使用提示
  • 三、Wrappers
  • 四、線程安全性
  • 五、使用 Wrapper 自定義 SQL
    • 1.注意事項
    • 2.示例
    • 3. 使用方法
  • 總結


前言

本章繼續上章條件構造器相關內容。


一、使用 TypeHandler

wrapper 中使用 typeHandler 需要特殊處理利用 formatSqlMaybeWithParam 方法

// 查詢
queryWrapper.apply("type={0,typeHandler="+ MyTypeHandler.class.getCanonicalName()+ "}", "待處理字符串");// 更新
updateWrapper.setSql("type={0,javaType=string,jdbcType=VARCHAR,typeHandler=xxx.xxx.MyTypeHandler}", "待處理字符串");

二、使用提示

通過使用 MyBatis-Plus 的 Wrapper 條件構造器,開發者可以更加高效地構建復雜的數據庫查詢條件,同時保持代碼的簡潔性和安全性。以下是一些注意事項與推薦做法:

  • 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和可維護性。
  • 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和Wrapper 支持鏈式調用,可以組合多個條件,如 andor 等邏輯操作符。
  • 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和在更新操作中使用 UpdateWrapper 或 LambdaUpdateWrapper 時,可以省略實體對象,直接在 Wrapper 中設置更新字段。
  • 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和注意 Wrapper 的線程安全性,通常在每次使用時創建新的 Wrapper 實例。
  • 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和在使用 MyBatis-Plus 的 Wrapper 時,應避免將前端動態參數直接拼接到 SQL 片段中,以防止 SQL 注入攻擊。MyBatis-Plus 提供了安全的參數綁定方式,如使用 eqapply 等方法,它們會自動處理參數綁定,避免 SQL 注入風險。

三、Wrappers

MyBatis-Plus 提供了 Wrappers 類,它是一個靜態工廠類,用于快速創建 QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper 的實例。使用 Wrappers 可以減少代碼量,提高開發效率。
示例:

// 創建 QueryWrapper
QueryWrapper<User> queryWrapper = Wrappers.query();
queryWrapper.eq("name", "張三");// 創建 LambdaQueryWrapper
LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(User::getName, "張三");// 創建 UpdateWrapper
UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.set("name", "李四");// 創建 LambdaUpdateWrapper
LambdaUpdateWrapper<User> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(User::getName, "李四");

注意事項

  • 在使用 QueryWrapper UpdateWrapper 查詢 設置 條件字段部分 一定要保證安全,避免 SQL 注入攻擊。
  • 任何 前端 傳入的 SQL片段 都要 嚴格過濾 更多查看 數據安全保護 預防安全漏洞

四、線程安全性

Wrapper 實例不是線程安全的,因此建議在每次使用時創建新的 Wrapper 實例。這樣可以避免多線程環境下的數據競爭和潛在的錯誤。

示例:

// 在每個方法或請求中創建新的 Wrapper 實例
public List<User> getUsersByName(String name) {QueryWrapper<User> queryWrapper = Wrappers.query();queryWrapper.eq("name", name);return userMapper.selectList(queryWrapper);
}

通過遵循這些最佳實踐,開發者可以更加安全、高效地使用 MyBatis-Plus 的 Wrapper 條件構造器,構建出既安全又易于維護的數據庫操作代碼。

五、使用 Wrapper 自定義 SQL

MyBatis-Plus 提供了強大的 Wrapper 條件構造器,允許開發者自定義 SQL 語句,以滿足更復雜的數據庫查詢需求。為了使用這一功能,請確保你的 mybatis-plus 版本不低于 3.0.7

1.注意事項

  • 版本要求:確保你的項目中使用的 mybatis-plus 版本至少為 3.0.7,以支持自定義 SQL 功能。
  • 參數命名:在自定義 SQL 時,傳遞 Wrapper 對象作為參數時,參數名必須為 ew,或者使用注解 @Param(Constants.WRAPPER) 明確指定參數為 Wrapper 對象。
  • 使用 ${ew.customSqlSegment}:在 SQL 語句中,使用 ${ew.customSqlSegment} 來引用 Wrapper 對象生成的 SQL 片段。
  • 不支持基于 entitywhere 語句:自定義 SQL 時,Wrapper 對象不會基于實體類自動生成 where 子句,你需要手動編寫完整的 SQL 語句。

2.示例

以下是一個使用 Wrapper 自定義 SQL 的示例:

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user ${ew.customSqlSegment}")List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}

在上述示例中,我們定義了一個 selectByCustomSql 方法,它使用了一個自定義的 SQL 語句,并通過 ${ew.customSqlSegment} 引入了 Wrapper 對象生成的 SQL 片段。

3. 使用方法

要使用自定義 SQL,只需調用上述方法并傳入一個 Wrapper 對象:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "張三");List<User> userList = userMapper.selectByCustomSql(queryWrapper);

在這個例子中,selectByCustomSql 方法將執行一個帶有 where 條件的查詢,該條件由傳入的 queryWrapper 對象生成。

通過這種方式,你可以靈活地結合 MyBatis-PlusWrapper 功能和自定義 SQL,以滿足各種復雜的數據庫操作需求。


總結

回到頂部

使用 TypeHandler大家可以放到后面了解,后面會有專門的一章去講字段類型處理器。

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

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

相關文章

scikit-learn教程

scikit-learn&#xff08;通常簡稱為sklearn&#xff09;是Python中最受歡迎的機器學習庫之一&#xff0c;它提供了各種監督和非監督學習算法的實現。下面是一個基本的教程&#xff0c;涵蓋如何使用sklearn進行數據預處理、模型訓練和評估。 1. 安裝和導入包 首先確保安裝了…

【漏洞復現】D-Link NAS 未授權RCE漏洞(CVE-2024-3273)

0x01 產品簡介 D-Link 網絡存儲 (NAS)是中國友訊&#xff08;D-link&#xff09;公司的一款統一服務路由器。 0x02 漏洞概述 D-Link NAS nas_sharing.cgi接口存在命令執行漏洞&#xff0c;該漏洞存在于“/cgi-bin/nas_sharing.cgi”腳本中&#xff0c;影響其 HTTP GET 請求處…

類和對象-友元-全局函數做友元

全局函數做友元 #include<iostream> using namespace std;class Building {//goodGay全局函數是Building好朋友&#xff0c;可以訪問Building的私有成員 friend void goodGay(Building *building); public:Building(){m_SittingRoom "客廳";m_BedRoom &qu…

MyBatis學習筆記-數據脫敏

如果項目需要對一些特殊、敏感的數據進行脫敏處理。根據實際的需求可以考慮在讀寫的過程中分別做脫敏操作。 一、寫過程參數脫敏 主要是使用mybatis框架提供的Interceptor實現。需要考慮不同類型的參數解析處理方式不同。 @Slf4j @AllArgsConstructor @Intercepts({@Signatu…

【vuejs】vue-router 之 addRoute 動態路由的應用總結

1. Vue Router 概述 Vue Router 是 Vue.js 官方的路由管理器&#xff0c;用于構建單頁面應用。它與 Vue.js 深度集成&#xff0c;讓開發者能夠輕松地構建具有復雜用戶界面的單頁面應用。Vue Router 允許你定義不同的路由&#xff0c;并通過 router-view 組件在應用中顯示匹配的…

【CSS】如何實現分欄布局

在CSS分欄布局中&#xff0c;設置寬度和樣式是一個基本且重要的步驟。這可以通過直接應用樣式到列元素&#xff08;通常是div元素&#xff09;上來實現。以下是一些常用的方法來設置分欄布局的寬度和樣式&#xff1a; 1. 使用百分比寬度 使用百分比寬度可以使列的大小相對于其…

MyBatis學習筆記-參數轉義處理

查詢參數中如果有傳入%的情況,數據會被全量返回。類似的可能還會有一些特殊符號的情況存在。這個時候可能需要在查詢數據的時候進行參數轉義處理。一般情況可能會考慮選擇下面的兩種方式處理。 一、基于Filter處理 主要通過實現Filter接口,自定義HttpServletRequestWrapper…

Stable Diffusion秋葉AnimateDiff與TemporalKit插件沖突解決

文章目錄 Stable Diffusion秋葉AnimateDiff與TemporalKit插件沖突解決描述錯誤描述&#xff1a;找不到模塊imageio.v3解決&#xff1a;參考地址 其他文章推薦&#xff1a;專欄 &#xff1a; 人工智能基礎知識點專欄&#xff1a;大語言模型LLM Stable Diffusion秋葉AnimateDiff與…

Java 漢諾塔問題 詳細分析

漢諾塔 漢諾塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又稱河內塔&#xff0c;是一個源于印度古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子&#xff0c;在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小…

vulnhub靶場ai-web 2.0

1 信息收集 1.1 主機發現 arp-scan -l 主機地址為192.168.1.4 1.2 服務端口掃描 nmap -sS -sV -A -T5 -p- 192.168.1.4 開放22&#xff0c;80端口 2 訪問服務 2.1 80端口訪問 http://192.168.1.4:80/ 先嘗試admin等其他常見用戶名登錄無果 然后點擊signup發現這是一個注…

prescan軟件中導入路徑文件txt/lpx

由于博主收到的是lpx格式的路徑文件&#xff0c;因此&#xff0c;第一步 1.記事本打開 ctrla 全選 ctrlc 復制 2.新建一個excel 鼠標定位到第一行第一列的格子 ctrlv 復制 3.數據欄“分列”功能 4. (0.1遞增的數列&#xff0c;緯度&#xff0c;經度&#xff0c;高程) 導入…

python——面向對象小練習士兵突擊與信息管理系統

士兵突擊 需求 1. 士兵 許三多 有一把 AK47 2. 士兵 可以 開火 3. 槍 能夠 發射 子彈 4. 槍 裝填 裝填子彈 —— 增加子彈數量 # 士兵突擊 # 需求 # 1. 士兵 許三多 有一把 AK47 # 2. 士兵 可以 開火 # 3. 槍 能夠 發射 子彈 # 4. 槍 裝填 裝填子彈 —— 增加子彈數量 cl…

JDBC操作流程

目錄 簡介 具體操作 1. 引入驅動包 1&#xff09;下載驅動包 2&#xff09;引入驅動包到項目中 2. 編寫代碼 1&#xff09;創建數據源 2&#xff09;建立連接 3&#xff09;構造 SQL 語句 4&#xff09;執行 SQL 語句 5&#xff09;釋放資源 總結 簡介 JDBC 就是使…

某網頁gpt的JS逆向

原網頁網址 (base64) 在線解碼 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果圖 調用代碼&#xff08;復制即用&#xff09; 把倒數第三行換成下面的base64解碼 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

C語言+ MSSQL技術開發的 PACS系統源碼:CT后處理技術之仿真內鏡CTVE

C語言 MSSQL技術開發的 PACS系統源碼&#xff1a;CT后處理技術之仿真內鏡CTVE 仿真內窺鏡VE VE是利用醫學影像作為原始數據&#xff0c;融合圖像處理、計算機圖形學、科學計算可視化、虛擬現實技術&#xff0c;模擬傳統光學內鏡的一種技術。 又叫做腔內重建技術&#xff0c;是…

試用筆記之-匯通來電顯示軟件

首先匯通來電顯示軟件下載 http://www.htsoft.com.cn/download/httelephone.rar

平衡樹專題Splay

寫在前面&#xff1a; 部分來自孫寶&#xff08;Steven24&#xff09;的博客&#xff0c;表示感謝。 認識 什么是Splay 就是BST的一種&#xff0c;整體效率是很高的&#xff0c;均攤的次數是O(logn)級別的。 基本操作就是把節點旋轉到BST的root&#xff0c;從而改善BST的平…

為適配kubelet:v0.4 安裝指定版本的docker

系統版本信息 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 0.4 版本的kubelet 報錯信息記錄 E0603 19:00:38.273720 44142 kubelet.go:734] Error syncing pod: API error (400): {"message": "starting container with non-empty reque…

免交互簡單操作

免交互 交互&#xff1a;我們發出指令控制程序的運行&#xff0c;程序在接收到指令后按照指令的效果作出對應的反應 免交互&#xff1a;間接的&#xff0c;通過第三方的方式把指令傳給程序&#xff0c;不用直接下達指令 Here Document免交互 這是命令行格式&#xff0c;也可…

不用找了!這個軟件自帶各行業話術,客服效率飛躍

有一款客服工具軟件&#xff0c;不但能吸附聊天窗口&#xff0c;實現圖文視頻話術的一鍵發送&#xff0c;還內置了多行業的優質客服話術模板&#xff0c;允許用戶直接下載使用&#xff0c;快速構建起適合自身企業的專業客服知識庫。 前言 在今天的快節奏商業環境中&#xff0c…