【Java實用工具類】手擼SqlBuilder工具類,優雅拼接動態SQL,MyBatisPlus同款風格!

📌 正文:

有時候我們項目底層是 JdbcTemplate 查詢,沒法像 MyBatisPlus 一樣用 Wrapper 拼接條件,但我們又不想手擼字符串。那怎么辦?我今天就給你整了個 SqlBuilder 工具類,支持 eqnelikeingtltorderBylimit,像 MyBatisPlus 一樣鏈式調用,直接拼接最終 SQL!


📌 工具類源碼:

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;/*** SQL 動態拼接工具類* <p>* 支持常用條件操作:eq(等于)、ne(不等于)、like(模糊匹配)、in(集合匹配)、gt(大于)、lt(小于),* 以及排序 orderBy 和結果數量限制 limit。* 采用鏈式調用方式,方便優雅地拼接 WHERE、ORDER BY、LIMIT 子句。* <p>* 示例:* <pre>* String sql = new SqlBuilder("SELECT * FROM user")*     .eq("status", 1)*     .like("name", "張三")*     .orderBy("create_time", false)*     .limit(10)*     .build();* </pre>* * @author lhj* @date 2025/06/03*/
public class SqlBuilder {private final String baseSql;  // 基礎SQL語句,包含SELECT和FROM部分private final List<String> whereConditions = new ArrayList<>(); // 存放WHERE條件private String orderByClause = "";  // ORDER BY子句private String limitClause = "";    // LIMIT子句/*** 構造方法,傳入基礎SQL語句(通常包含SELECT和FROM)** @param baseSql 基礎SQL語句*/public SqlBuilder(String baseSql) {this.baseSql = baseSql;}/*** 拼接等于條件* 僅當value不為空時,添加"column = 'value'"條件** @param column 列名* @param value  比較值* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder eq(String column, Object value) {if (ObjectUtil.isNotEmpty(value)) {whereConditions.add(column + " = '" + value + "'");}return this;}/*** 拼接不等于條件* 僅當value不為空時,添加"column <> 'value'"條件** @param column 列名* @param value  比較值* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder ne(String column, Object value) {if (ObjectUtil.isNotEmpty(value)) {whereConditions.add(column + " <> '" + value + "'");}return this;}/*** 拼接模糊匹配條件* 僅當value不為空時,添加"column LIKE '%value%'"條件** @param column 列名* @param value  模糊匹配的值* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder like(String column, Object value) {if (ObjectUtil.isNotEmpty(value)) {whereConditions.add(column + " LIKE '%" + value + "%'");}return this;}/*** 拼接IN條件* 僅當values集合不為空時,添加"column IN ('value1','value2',...)"條件** @param column 列名* @param values 值集合* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder in(String column, List<?> values) {if (CollUtil.isNotEmpty(values)) {String inValues = values.stream().map(v -> "'" + v + "'").collect(Collectors.joining(","));whereConditions.add(column + " IN (" + inValues + ")");}return this;}/*** 拼接大于條件* 僅當value不為空時,添加"column > 'value'"條件** @param column 列名* @param value  比較值* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder gt(String column, Object value) {if (ObjectUtil.isNotEmpty(value)) {whereConditions.add(column + " > '" + value + "'");}return this;}/*** 拼接小于條件* 僅當value不為空時,添加"column < 'value'"條件** @param column 列名* @param value  比較值* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder lt(String column, Object value) {if (ObjectUtil.isNotEmpty(value)) {whereConditions.add(column + " < '" + value + "'");}return this;}/*** 拼接排序子句* 僅當column不為空時,添加"ORDER BY column ASC|DESC"** @param column 排序字段* @param asc    是否升序(true升序,false降序)* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder orderBy(String column, boolean asc) {if (ObjectUtil.isNotEmpty(column)) {orderByClause = " ORDER BY " + column + (asc ? " ASC" : " DESC");}return this;}/*** 拼接結果限制條數子句* 僅當size大于0時,添加"LIMIT size"** @param size 限制返回結果條數* @return 當前SqlBuilder對象,支持鏈式調用*/public SqlBuilder limit(int size) {if (size > 0) {limitClause = " LIMIT " + size;}return this;}/*** 構建最終完整SQL語句* 根據已拼接的條件、排序和限制,生成完整SQL字符串** @return 完整SQL字符串*/public String build() {StringBuilder finalSql = new StringBuilder(baseSql);if (!whereConditions.isEmpty()) {finalSql.append(" WHERE ").append(String.join(" AND ", whereConditions));}finalSql.append(orderByClause).append(limitClause);return finalSql.toString();}/*** 簡單示例演示SqlBuilder用法*/public static void main(String[] args) {String sql = new SqlBuilder("SELECT * FROM user").eq("status", 1).eq("score", "") // 空字符串不拼接.like("name", "").in("type", Arrays.asList(1)).gt("create_time", "2024-01-01").orderBy("create_time", false).limit(50).build();System.out.println(sql);}
}

📌 使用效果:

控制臺輸出👇

SELECT * FROM user WHERE status = '1' AND type IN ('1') AND create_time > '2024-01-01' ORDER BY create_time DESC LIMIT 50

📌 總結:

?? 支持鏈式調用
?? 條件判空自動過濾
?? 格式統一規范
?? 靈感來自 MyBatisPlus 的 Wrapper 寫法


📌 鐵子們,點贊、收藏、轉發,別白嫖!

有需要的直接拿走用,或者留言,我幫你繼續擴展功能版本,比如 betweenorgroupByhaving 版本 🚀


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

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

相關文章

WEB3——開發者怎么查看自己的合約日志記錄

在區塊鏈中查看合約的日志信息&#xff08;也叫事件 logs&#xff09;&#xff0c;主要有以下幾種方式&#xff0c;具體方法依賴于你使用的區塊鏈平臺&#xff08;如 Ethereum、BSC、Polygon 等&#xff09;和工具&#xff08;如 Etherscan、web3.js、ethers.js、Hardhat 等&am…

Maven-生命周期

目錄 1.項目對象模型 2.依賴管理模型 3.倉庫&#xff1a;用于存儲資源&#xff0c;管理各種jar包 4.本地倉庫路徑 1.項目對象模型 2.依賴管理模型 3.倉庫&#xff1a;用于存儲資源&#xff0c;管理各種jar包 4.本地倉庫路徑

redis數據過期策略

redis數據過期策略有兩種方案 1.惰性刪除 2.定期刪除 首先說惰性刪除&#xff0c;對于已經過期的數據&#xff0c;訪問這個key的時候判斷key是否過期&#xff0c;如果過期則刪除&#xff0c;這種方式對cpu友好&#xff0c;只有使用key的時候才會進行過期檢查&#xff0c;用不到…

P1040 [NOIP 2003 提高組] 加分二叉樹

目錄 題目算法標簽: 區間 d p dp dp, 動態規劃, d f s dfs dfs思路代碼 題目 P1040 [NOIP 2003 提高組] 加分二叉樹 算法標簽: 區間 d p dp dp, 動態規劃, d f s dfs dfs 思路 給出的是一顆子樹的中序遍歷, s c o r e l r r o o t score l \times r root scorelrro…

uni-app學習筆記十七-css和scss的使用

SCSS 和 CSS的異同點 我們可以使用css和scss來設置樣式。其中SCSS&#xff08;Sassy CSS&#xff09;是 CSS 預處理器 Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;的一種語法格式&#xff0c;而 CSS&#xff08;Cascading Style Sheets&#xff09;是標準…

Spring Boot中Excel處理完全指南:從基礎到高級實踐

Excel處理基礎知識 1.1 為什么需要在應用中處理Excel文件&#xff1f; 在企業應用開發中&#xff0c;Excel文件處理是一個非常常見的需求&#xff0c;主要用于以下場景&#xff1a; 數據導入&#xff1a;允許用戶通過Excel上傳批量數據到系統 數據導出&#xff1a;將系統數據…

Python編程基礎(四) | if語句

引言&#xff1a;很久沒有寫 Python 了&#xff0c;有一點生疏。這是學習《Python 編程&#xff1a;從入門到實踐&#xff08;第3版&#xff09;》的課后練習記錄&#xff0c;主要目的是快速回顧基礎知識。 練習1&#xff1a;條件測試 編寫一系列條件測試&#xff0c;將每個條…

使用pandas實現合并具有共同列的兩個EXCEL表

表1&#xff1a; 表2&#xff1a; 表1和表2&#xff0c;有共同的列“名稱”&#xff0c;而且&#xff0c;表1的內容&#xff08;行數&#xff09;<表2的行數。 目的&#xff0c;根據“名稱”列的對應內容&#xff0c;將表2列中的“所處行業”填寫到表1相應的位置。 實現代…

ERP學習-AP

業務需要。持續更新學習進度 借助網上零搭建平臺上手實操 這個是簡道云平臺頁面鏈接&#xff0c;登錄的化去手機號登錄 目前開始對應付模塊進行學習

Dify知識庫下載小程序

一、Dify配置 1.查看或創建知識庫的API 二、下載程序配置 1. 安裝依賴resquirements.txt ######requirements.txt##### flask2.3.3 psycopg2-binary2.9.9 requests2.31.0 python-dotenv1.0.0#####安裝依賴 pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.…

【PbstarAdmin】微前端架構下的高效后臺管理系統解決方案

如果你正在尋找一個高效、穩定、易于使用、易于擴展的管理后臺解決方案&#xff0c;PbstarAdmin 絕對值得一試。以下是它的在線演示和官方文檔地址&#xff0c;你可以先睹為快&#xff1a; 在線演示&#xff1a;http://pbstar-admin.pbstar.cn/官方文檔&#xff1a;http://pbs…

Java基礎之數組(附帶Comparator)

文章目錄 基礎概念可變參數組數組與ListComparator類1,基本概念2,使用Comparator的靜態方法&#xff08;Java 8&#xff09;3,常用Comparator方法4,例子 排序與查找數組復制其他 基礎概念 int[] anArray new int[10];只有創建對象時才會使用new關鍵字&#xff0c;所以數組是個…

Apache Doris 在數據倉庫中的作用與應用實踐

在當今數字化時代&#xff0c;企業數據呈爆炸式增長&#xff0c;數據倉庫作為企業數據管理和分析的核心基礎設施&#xff0c;其重要性不言而喻。而 Apache Doris&#xff0c;作為一款基于 MPP&#xff08;Massively Parallel Processing&#xff0c;大規模并行處理&#xff09;…

P1438 無聊的數列/P1253 扶蘇的問題

因為這兩天在寫線性代數的作業&#xff0c;沒怎么寫題…… P1438 無聊的數列 題目背景 無聊的 YYB 總喜歡搞出一些正常人無法搞出的東西。有一天&#xff0c;無聊的 YYB 想出了一道無聊的題&#xff1a;無聊的數列。。。 題目描述 維護一個數列 ai?&#xff0c;支持兩種操…

SpringBoot 自定義注解實現限流

SpringBoot 自定義注解實現限流 限流是為了防止服務器資源的過度消耗&#xff0c;通過一定的策略來控制訪問頻率&#xff0c;確保服務的高可用性和穩定性。其核心意義在于防止流量高峰時期接口過載&#xff0c;從而引起服務崩潰或響應延遲增加。本文將簡述如何通過AOP和自定義…

Unity——QFramework框架 內置工具

QFramework 除了提供了一套架構之外&#xff0c;QFramework 還提供了可以脫離架構使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 這些工具并不是有意提供&#xff0c;而是 QFramework 的架構在設計之初是通過這幾個工具組合使用而成的。 內置工具…

Vue3.5 企業級管理系統實戰(二十二):動態菜單

在前幾篇內容中已完成菜單、角色及菜單權限等相關開發&#xff0c;若要在左側菜單根據用戶角色動態展示菜單&#xff0c;需對 Sidebar 中的相關數據進行修改。鑒于其他相關方法及類型已在前文實現&#xff0c;本文不再重復闡述。 1 修改 Sidebar 組件 在 src/layout/componen…

014校園管理系統技術解析:構建智慧校園管理平臺

校園管理系統技術解析&#xff1a;構建智慧校園管理平臺 在教育信息化快速發展的當下&#xff0c;校園管理系統成為提升學校管理效率、優化校園服務的重要工具。該系統集成院校管理、投票管理等多個核心模塊&#xff0c;面向管理員、用戶和院內管理員三種角色&#xff0c;通過…

創新農業社會化服務 中和農信服務小農戶的探索實踐

在實現鄉村振興的道路上&#xff0c;如何讓現代農業發展成果惠及廣大小農戶&#xff0c;是一個重要課題。作為國內領先的綜合助農機構&#xff0c;中和農信多年來深耕農村市場&#xff0c;在服務小農戶方面進行了諸多創新探索&#xff0c;走出了一條具有示范意義的農業社會化服…

6.3 day 35

知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀推理的寫法&#xff1a;評估模式 可視化 理解深度學習網絡最重要的2點&#xff1a; 1.了解損失如何定…