Java開發中復用公共SQL的方法

在一次Java后端開發的面試中,面試官問了我一個問題:“你在寫代碼時會復用公共SQL嗎?如果會的話,能詳細介紹一下你是如何實現的嗎?”這個問題讓我眼前一亮,因為在實際項目中,SQL復用確實是一個非常實用且能提升代碼質量的做法。下面是我當時的回答,也借此機會整理成一篇博客,和大家分享一下我的經驗。
我的回答:是的,我會復用公共SQL
我告訴面試官:“是的,我在開發中經常會復用公共SQL,尤其是在Java后端項目中。復用SQL不僅能減少代碼重復,還能提高可維護性和一致性。我通常會結合具體的業務場景和框架特性來實現,比如使用MyBatis這樣的ORM框架,或者通過自定義工具類來管理公共SQL片段。”
接著,面試官讓我詳細講講實現方式,我就從以下幾個方面展開了說明。
實現方式一:MyBatis的標簽
在Java后端開發中,我最常用的ORM框架是MyBatis。MyBatis提供了一個非常方便的特性——標簽,可以用來定義可復用的SQL片段。比如,在一個用戶管理的模塊中,經常需要查詢用戶的某些基礎字段,像id、username、email等。如果每次都手寫這些字段,既麻煩又容易出錯,我就用標簽把它們抽出來。
舉個例子,我的UserMapper.xml可能會這樣寫:
xml 體驗AI代碼助手 代碼解讀復制代碼

id, username, email, created_at, updated_at

SELECT FROM users WHERE status = #{status} SELECT FROM users WHERE id = #{id}

通過標簽,我可以在多個SQL語句中復用userBaseColumns這個片段。這樣,如果以后需要調整查詢字段(比如新增phone字段),只需要改動定義的地方,所有引用它的查詢都會自動更新,省時省力。
實現方式二:動態SQL與Java代碼封裝
有時候,SQL的復用不僅僅是字段列表,還可能是復雜的條件邏輯。比如,很多業務場景下會有分頁查詢的需求,LIMIT和OFFSET是固定的模式。我會結合MyBatis的動態SQL和Java代碼來實現復用。
比如,我會寫一個通用的分頁工具類:
java 體驗AI代碼助手 代碼解讀復制代碼public class PageHelper {
public static String appendPageSql(String sql, int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
return sql + " LIMIT " + pageSize + " OFFSET " + offset;
}
}

然后在Mapper接口中調用:
java 體驗AI代碼助手 代碼解讀復制代碼@SelectProvider(type = UserSqlProvider.class, method = “getUserListSql”)
List getUserList(int status, int pageNum, int pageSize);

class UserSqlProvider {
public String getUserListSql(int status, int pageNum, int pageSize) {
String sql = “SELECT id, username, email FROM users WHERE status = #{status}”;
return PageHelper.appendPageSql(sql, pageNum, pageSize);
}
}

這樣,任何需要分頁的查詢都可以復用PageHelper,只需要傳入頁碼和每頁大小即可。這種方式在Java層實現了SQL的動態拼接,既靈活又可控。
實現方式三:常量類管理SQL片段
如果項目中不完全依賴MyBatis,或者有些SQL是直接通過JDBC執行的,我會用Java的常量類來管理公共SQL片段。比如:
java 體驗AI代碼助手 代碼解讀復制代碼public class SqlConstants {
public static final String USER_BASE_COLUMNS = “id, username, email, created_at, updated_at”;
public static final String USER_TABLE = “users”;
public static final String SELECT_USER_BY_ID =
“SELECT " + USER_BASE_COLUMNS + " FROM " + USER_TABLE + " WHERE id = ?”;
}

然后在DAO層使用:
java 體驗AI代碼助手 代碼解讀復制代碼public User getUserById(Long id) {
String sql = SqlConstants.SELECT_USER_BY_ID;
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
}

這種方式的好處是簡單直觀,適合小型項目或者需要快速開發的場景。不過缺點是缺乏動態性,如果SQL邏輯復雜,維護起來會稍顯麻煩。
為什么復用SQL很重要?
我還跟面試官補充了一下為什么要這樣做。復用公共SQL有幾個明顯的好處:

減少重復代碼:避免在多個地方寫相同的SQL片段,符合DRY(Don’t Repeat Yourself)原則。
提高可維護性:改動一處,全局生效,降低出錯風險。
提升一致性:比如字段順序、命名規范都能統一,避免開發人員各自發揮。

總結
最后,我總結道:“在Java后端開發中,復用公共SQL是一個很實用的習慣。我會根據項目規模和需求選擇合適的方式,小項目可能用常量類就夠了,大項目則更傾向于MyBatis的標簽或者動態SQL結合工具類。關鍵是要讓代碼既高效又易于維護。”

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

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

相關文章

C#學習26天:內存優化的幾種方法

1.減少對象創建 使用場景: 在循環或密集計算中頻繁創建對象時。涉及大量短生命周期對象的場景,比如日志記錄或字符串拼接。游戲開發中,需要頻繁更新對象狀態時。 說明: 重用對象可以降低內存分配和垃圾回收的開銷。使用對象池…

【opencv】基礎知識到進階(更新中)

安裝:pip install opencv-python 入門案例 讀取圖片 本節我們將來學習,如何使用opencv顯示一張圖片出來,我們首先需要掌握一條圖片讀取的api cv.imread("圖片路徑","讀取的方式") # 圖片路徑: 需要在工程目錄中,或者一個文件的絕對路徑 # 讀取…

【Part 3 Unity VR眼鏡端播放器開發與優化】第二節|VR眼鏡端的開發適配與交互設計

文章目錄 《VR 360全景視頻開發》專欄Part 3|Unity VR眼鏡端播放器開發與優化第一節|基于Unity的360全景視頻播放實現方案第二節|VR眼鏡端的開發適配與交互設計一、Unity XR開發環境與設備適配1.1 啟用XR Plugin Management1.2 配置OpenXR與平…

SQL進階之旅 Day 16:特定數據庫引擎高級特性

【SQL進階之旅 Day 16】特定數據庫引擎高級特性 開篇 在“SQL進階之旅”系列的第16天,我們將探討特定數據庫引擎的高級特性。這些特性通常為某些特定場景設計,能夠顯著提升查詢性能或簡化復雜任務。本篇文章將覆蓋MySQL、PostgreSQL和Oracle的核心高級…

c++算法學習4——廣度搜索bfs

一、引言:探索迷宮的智能方法 在解決迷宮最短路徑問題時,廣度優先搜索(BFS)是一種高效而優雅的算法。與深度優先搜索(DFS)不同,BFS采用"由近及遠"的搜索策略,逐層探索所有…

4.RV1126-OPENCV 圖像輪廓識別

一.圖像識別API 1.圖像識別作用 它常用于視覺任務、目標檢測、圖像分割等等。在 OPENCV 中通常使用 Canny 函數、findContours 函數、drawContours 函數結合在一起去做輪廓的形檢測。 2.常用的API findContours 函數:用于尋找圖片的輪廓,并把所有的數…

Qt多線程訪問同一個數據庫源碼分享(基于Sqlite實現)

Qt多線程訪問同一個數據庫源碼分享(基于Sqlite實現) 一、實現難點線程安全問題死鎖風險連接管理問題數據一致性性能瓶頸跨線程信號槽最佳實踐建議 二、源碼分享三、測試1、新建一個多線程類2、開啟多線程插入數據 一、實現難點 多線程環境下多個線程同時…

雙空間知識蒸餾用于大語言模型

Dual-Space Knowledge Distillation for Large Language Models 發表:EMNLP 2024 機構:Beijing Key Lab of Traffic Data Analysis and Mining 連接:https://aclanthology.org/2024.emnlp-main.1010.pdf 代碼:GitHub - songmz…

貪心算法應用:多重背包啟發式問題詳解

貪心算法應用:多重背包啟發式問題詳解 多重背包問題是經典的組合優化問題,也是貪心算法的重要應用場景。本文將全面深入地探討Java中如何利用貪心算法解決多重背包問題。 多重背包問題定義 **多重背包問題(Multiple Knapsack Problem)**是背包問題的變…

ES6 Promise 狀態機

狀態機:抽象的計算模型,根據特定的條件或者信號切換不同的狀態 一、Promise 是什么? 簡單來說,Promise 就是一個“承諾對象”。在ES6 里,有些代碼執行起來需要點時間,比如加載文件、等待網絡請求或者設置…

【Docker管理工具】部署Docker可視化管理面板Dpanel

【Docker管理工具】部署Docker可視化管理面板Dpanel 一、Dpanel介紹1.1 DPanel 簡介1.2 主要特點 二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載Dpanel鏡像五、部署Dpanel…

最新研究揭示云端大語言模型防護機制的成效與缺陷

一項全面新研究揭露了主流云端大語言模型(LLM)平臺安全機制存在重大漏洞與不一致性,對當前人工智能安全基礎設施現狀敲響警鐘。該研究評估了三大領先生成式AI平臺的內容過濾和提示注入防御效果,揭示了安全措施在阻止有害內容生成與…

docker中,容器時間和宿機主機時間不一致問題

win11下的docker中有個mysql。今天發現插入數據的時間不正確。后來發現原來是docker容器中的時間不正確。于是嘗試了各種修改,什么run -e TZ"${tzutil /g}",TZ"Asia/Shanghai",還有初始化時帶--mysqld一類的,…

uniapp實現的簡約美觀的星級評分組件

采用 uniapp 實現的一款簡約美觀的星級評分模板,提供絲滑動畫效果,用戶可根據自身需求進行自定義修改、擴展,純CSS、HTML實現,支持web、H5、微信小程序(其他小程序請自行測試) 可到插件市場下載嘗試&#x…

go語言的鎖

本篇文章主要講鎖,主要會涉及go的sync.Mutex和sync.RWMutex。 一.鎖的概念和發展 1.1 鎖的概念 所謂的加鎖和解鎖其實就是指一個數據是否被占用了,通過Mutex內的一個狀態來表示。 例如,取 0 表示未加鎖,1 表示已加鎖&#xff…

Ubuntu 服務器軟件更新,以及常用軟件安裝 —— 一步一步配置 Ubuntu Server 的 NodeJS 服務器詳細實錄 3

前言 前面,我們已經 安裝好了 Ubuntu 服務器系統,并且 配置好了 ssh 免密登錄服務器 ,現在,我們要來進一步的設置服務器。 那么,本文,就是進行服務器的系統更新,以及常用軟件的安裝 調整 Ubu…

如何從零開始建設一個網站?

當你沒有建站的基礎和建站的知識,那么應該如何開展網站建設和網站管理。而今天的教程是不管你是為自己建站還是為他人建站都適合的。本教程會指導你如何進入建站,將建站的步驟給大家分解: 首先我們了解一下,建站需要那些步驟和流程…

網絡可靠性的定義與核心要素

網絡可靠性(Network Reliability)是指網絡系統在特定時間范圍內持續提供穩定、無中斷、符合預期性能的服務能力。其核心目標是確保數據能夠準確、完整、及時地傳輸,即使在部分故障或異常情況下仍能維持基本功能。 1. 網絡可靠性的核心指標 衡…

GpuGeek如何成為AI基礎設施市場的中堅力量

AI時代,算力基礎設施已成為支撐技術創新和產業升級的關鍵要素。作為國內專注服務算法工程師群體的智算平臺,GpuGeek通過持續創新的服務模式、精準的市場定位和系統化的生態建設,正快速成長為AI基礎設施領域的中堅力量。本文將深入分析GpuGeek…

【Qt】Bug:findChildren找不到控件

使用正確的父對象調用 findChildren:不要在布局對象上調用 findChildren,而應該在布局所在的窗口或控件上調用。