MyBatis高效查詢:簡化JDBC開發實戰

Mybatis

MyBatis 是一款優秀持久層(DAO)框架,用于簡化 JDBC 開發 ,原是 Apache 開源項目 iBatis,經歷遷移改名,2010 年從 Apache 遷到 Google Code 并改名,2013 年 11 月遷至 GitHub,官網為 https://mybatis.org/mybatis-3/zh_CN/index.html ,在分層架構(controller 控制層、service 業務層、dao 持久層 )中,可通過注解(如 @Select )等方式操作數據庫,像示例中 UserMapper 接口用 @Select("select * from user") 實現查詢全部用戶功能 。

MyBatis 查詢所有用戶數據

一、核心流程概述

利用 MyBatis 結合 SpringBoot 實現查詢所有用戶數據,通過簡潔配置與注解方式,快速搭建數據庫交互功能,核心涉及工程創建、環境配置、代碼編寫三個環節 。

二、步驟拆解與代碼說明

(一)準備工作
  1. 工程創建與依賴引入
    創建 SpringBoot 工程時,在依賴選擇界面勾選 MyBatis FrameworkMySQL Driver 等(如演示截圖中 New Module 配置 ),讓項目具備 MyBatis 操作數據庫的基礎環境。
  2. 數據庫與實體類準備
    • 搭建數據庫表 user,包含 idusernamepasswordnameage 等字段(對應示例數據 )。
    • 編寫實體類 User,映射數據庫表字段:
public class User { private Integer id; // IDprivate String username; // 用戶名private String password; // 密碼private String name; // 姓名 private Integer age; // 年齡// 省略Getter、Setter、構造方法等 
}
  1. MyBatis 配置(數據庫連接)
    application.properties 中配置數據庫連接信息,讓 MyBatis 能訪問數據庫:
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
(二)編寫 MyBatis 程序(持久層接口)

定義持久層接口 UserMapper,用 @Mapper 注解讓 SpringBoot 自動創建代理對象并納入 IOC 容器,通過 @Select 注解編寫 SQL 語句:

package com.itxiaoli.mapper;import com.itxiaoli.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper 
public interface UserMapper {/*** 查詢所有用戶信息* @return 包含所有用戶數據的 List<User>*/@Select("select * from user")public List<User> findAll();
}
  • @Mapper:關鍵注解,觸發 MyBatis 動態代理機制,運行時生成接口實現類,方便注入使用。
  • @Select:指定要執行的 SQL 語句,這里 “select * from user” 實現查詢 user 表全部數據,返回 List<User> 結果 。

三、關鍵要點總結

  • 依賴與配置:通過 SpringBoot 初始化工程并選對依賴,配合 application.properties 配置數據庫,為 MyBatis 運行鋪路。
  • 注解驅動@Mapper 托管接口實現類,@Select 簡化 SQL 編寫,無需額外 XML 映射文件(簡單場景下 ),快速實現數據庫查詢。
  • 分層規范:持久層接口命名遵循 XxxMapper 規范,契合 MyBatis 開發習慣,清晰劃分數據訪問層級,讓代碼結構更規整 。

這套流程能高效實現 “查詢所有用戶數據” 需求,是 MyBatis 基礎且典型的應用場景,后續可拓展復雜查詢、增刪改操作,或結合 XML 配置優化 SQL 管理 。

四、JDBC VS Mybatis

編程方式與代碼復雜度
  • JDBC:代碼較為繁瑣。以查詢用戶數據為例,需要加載數據庫驅動(Class.forName("com.mysql.cj.jdbc.Driver") ),建立數據庫連接(DriverManager.getConnection(url, "root", "1234") ),創建并執行 SQL 語句(PreparedStatement ps = connection.prepareStatement("select * from user") ),手動處理結果集(遍歷 ResultSet 并將數據封裝到自定義對象 ),最后釋放資源(resultSet.close()ps.close()connection.close() ) 。過程中代碼量大,容易出錯,尤其是處理復雜查詢和結果集映射時,代碼會更加冗長。
  • MyBatis:通過簡潔的注解或 XML 配置來定義 SQL 語句。例如使用 @Mapper 注解標識持久層接口,@Select 注解編寫 SQL 查詢語句 ,MyBatis 會自動處理 SQL 執行和結果映射,大大簡化了數據訪問層的代碼編寫,提高了開發效率,代碼結構也更加清晰。
數據庫連接與資源管理
  • JDBC:在 JDBC 中,每次執行數據庫操作都需要手動建立和關閉數據庫連接。頻繁的連接創建與關閉會消耗大量資源,影響性能,而且如果資源關閉操作出現遺漏,可能導致數據庫連接泄漏等問題。
  • MyBatis:通常與數據庫連接池(如 HikariCP ,在 Spring Boot 項目中默認集成 )結合使用。通過在配置文件(如application.properties )中配置數據庫連接信息,連接池負責管理連接的創建、分配和回收,減少了連接創建的開銷,提高了系統的性能和穩定性。
可維護性與可擴展性
  • JDBC:SQL 語句通常以硬編碼的方式嵌入到 Java 代碼中,當 SQL 需要修改時,需要在 Java 代碼中查找并修改對應的 SQL 片段,尤其是在大型項目中,修改和維護成本較高。此外,對于不同數據庫的兼容性支持,需要開發者手動處理 SQL 語法差異,擴展性較差。
  • MyBatis:SQL 語句與 Java 代碼分離(使用注解時,SQL 也相對獨立;使用 XML 配置時更明顯 ),便于集中管理和維護 SQL。當需要修改 SQL 時,只需在對應的注解或 XML 文件中進行修改即可。同時,MyBatis 提供了良好的數據庫兼容性,通過配置不同的數據庫方言,可以方便地切換不同的數據庫,擴展性更強。
數據映射
  • JDBC:從 ResultSet 中獲取數據并封裝到 Java 對象中,需要開發者手動編寫代碼進行數據類型轉換和賦值,操作繁瑣且容易出錯。
  • MyBatis:具備強大的自動映射功能,能夠根據數據庫表結構和 Java 實體類的屬性自動進行映射,將查詢結果直接封裝到對應的實體類對象中,減少了手動映射的工作量,提高了開發效率和代碼的準確性。

總的來說,MyBatis 相比 JDBC 在開發效率、代碼維護、資源管理等方面具有明顯優勢,更適合在企業級開發中使用,尤其是在復雜的業務場景下 。不過,了解 JDBC 有助于理解數據庫操作的底層原理,而且在一些輕量級或對性能要求極致且業務簡單的場景中,JDBC 也有其用武之地。

數據庫連接池

一、核心概念

數據庫連接池是管理數據庫連接(Connection)的容器,負責分配、回收連接,讓應用復用已有連接,而非每次新建,避免連接泄漏。

二、核心優勢

  1. 資源復用:重復利用連接,減少創建 / 銷毀連接的資源開銷(如網絡握手、數據庫認證)。
  2. 提升響應速度:直接從池內拿現成連接,無需等待新建,系統響應更快。
  3. 避免連接泄漏:自動釋放空閑過久的連接,防止因未關閉連接導致的資源耗盡問題。

三、技術規范與實現

  • 標準接口DataSource(Java 官方定義),第三方通過實現此接口提供連接池,核心方法 getConnection() 獲取數據庫連接。
  • 常見產品:
    • C3P0:經典老牌連接池,配置靈活但性能略遜。
    • DBCP:Apache 旗下,穩定但功能相對基礎。
    • Druid(阿里開源):功能強大(支持監控、防 SQL 注入等),性能優秀,是 Java 生態常用選擇。
    • Hikari:Spring Boot 默認連接池,輕量、高性能,優化極致,主流項目首選。

四、使用示例(以 Druid 為例,Spring Boot 場景)

  1. 引入依賴

    <dependency>  <groupId>com.alibaba</groupId>  <artifactId>druid-spring-boot-starter</artifactId>  <version>1.2.19</version>  
    </dependency>  
    
  2. 配置連接池

    指定連接池類型、數據庫地址、賬號密碼等:

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource  
    spring.datasource.url=jdbc:mysql://localhost:3306/web  
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  
    spring.datasource.username=root  
    spring.datasource.password=1234  
    

五、小結

數據庫連接池通過 “復用連接 + 管理生命周期”,解決了直連數據庫的性能與資源問題。記住核心點:

  • 角色:連接的 “容器管家”,分配、回收連接。
  • 價值:省資源、提速度、防泄漏。
  • 實現:基于 DataSource 接口,主流產品各有側重(Hikari 輕量默認、Druid 功能豐富)。

簡單說,連接池就是讓數據庫連接 “按需復用、自動管理” 的工具,是 Java 開發中優化數據庫交互的基礎手段 。

Mybatis對數據庫表增刪改查

一、查詢操作

(一)、查詢所有信息
  1. 實現方式:在UserMapper接口中,通過@Select注解定義查詢 SQL 語句,如@Select("select * from user") ,該注解讓 MyBatis 自動執行對應的查詢邏輯,將查詢結果映射為User實體類的集合返回 。
@Select("select * from user")
public List<User> findAll();
  1. 測試驗證:在測試類MybaitsQuickstartApplicationTests里,注入UserMapper后,調用findAll方法執行查詢,通過遍歷結果集userList.forEach(user -> System.out.println(user)); ,驗證查詢功能是否正常,檢查能否正確獲取數據庫中user表的全部數據 。
@Test
public void testFindAll(){List<User> userList = userMapper.findAll();userList.forEach(user -> System.out.println(user));
}
  1. 關鍵優勢:利用 MyBatis 注解方式,無需額外編寫 XML 映射文件,簡化了簡單查詢場景的配置,讓查詢邏輯與接口定義緊密結合,方便維護,同時 MyBatis 自動完成結果集到實體類的映射,提升開發效率 。
(二)、根據用戶名和密碼查詢用戶信息
	 /*** 根據username和password查詢用戶信息*/@Select("SELECT * FROM user WHERE username=#{username} AND password=#{password}")public User findByUsernameAndPassword(@Param("username") String username,@Param("password") String password);

[!CAUTION]

@Param 是 MyBatis 中多參數傳遞時的常用注解,通過顯式命名參數,實現 SQL 語句與方法參數的精準綁定,提升代碼可讀性和維護性,是日常開發中推薦的參數傳遞方式。

 /*** 測試根據用戶名和密碼查詢用戶信息*/@Testpublic void testFindByUsernameAndPassword() {User user = userMapper.findByUsernameAndPassword("小王", "123456");System.out.println(user);}

[!NOTE]

基于官方骨架創建的springboot項目中,接口編譯時會保留方法形參名,@Param注解可以省略 (#{形參名})。

在這里插入圖片描述

二、刪除操作

  1. 實現方式:在UserMapper接口中,使用@Delete注解編寫刪除 SQL,@Delete("DELETE FROM user WHERE id = #{id}") ,其中#{id}是 MyBatis 的占位符,會生成預編譯 SQL,避免 SQL 注入風險,方法返回Integer類型,用于接收刪除操作影響的行數 。
@Delete("DELETE FROM user WHERE id = #{id}")
public Integer deleteById(Integer id);
  1. 測試驗證:測試類中注入UserMapper,調用deleteById方法并傳入要刪除的用戶id(如5 ),通過輸出返回的影響行數System.out.println("受影響的記錄數據" + i); ,判斷刪除操作是否執行成功,驗證刪除邏輯的正確性 。
@Test
public void testDeleteById(){Integer i= userMapper.deleteById(5);System.out.println("受影響的記錄數據" + i);
}
  1. 注意要點:DML 操作(增刪改)的返回值代表執行后影響的行數,這是判斷操作是否生效的重要依據;編寫刪除 SQL 時,合理使用#{}占位符保障安全,若因特殊需求(如動態表名)需用${} ,要做好參數校驗防止 SQL 注入 。

三、#{} VS ${}

符號說明場景優缺點
#{…}占位符。執行時,會將#{…}替換為?,生成預編譯SQL參數值傳遞安全、性能高 (推薦)
${…}拼接符。直接將參數拼接在SQL語句中,**存在SQL注入問題 **表名、字段名動態設置時使用不安全、性能低

在這里插入圖片描述

四、增加操作

  /*** 添加用戶信息* @param user* @return*/@Insert("INSERT INTO user (username, password, name,age) VALUES (#{username}, #{password}, #{name}, #{age})")public void insert(User user);
 /*** 測試添加*/@Testpublic void testInsert(){User user=new User(null,"小高","123456","小高",18);userMapper.insert(user);}

五、修改操作

  /*** 更新用戶信息*/@Update("UPDATE user SET username=#{username},password=#{password},name=#{name},age=#{age} WHERE id=#{id}")public void update(User user);
    /*** 測試更新*/@Testpublic void testUpdate(){User user=new User(4,"小王","123456","小王",108);userMapper.update(user);}

XML映射配置

官方說明:https://mybatis.net.cn/getting-started.html

一、XML 映射配置核心規則

在 MyBatis 里,除注解配置 SQL,還能通過 XML 配置文件寫 SQL,需遵循以下規則:

(一)文件命名與位置(同包同名)

XML 映射文件名稱要和 Mapper 接口名稱一致,且放在相同包下(/ 建目錄,而非 . ,比如 Mapper 接口是 com.it.mapper.UserMapper ,XML 文件就放 src/main/resources/com/it/mapper/UserMapper.xml ,保證 “同包同名” )。

(二)namespace 屬性

XML 映射文件的 namespace 屬性,和 Mapper 接口的全限定名一致。像 Mapper 接口是 com.it.mapper.UserMapper ,XML 里就寫 <mapper namespace="com.it.mapper.UserMapper"> ,這樣 MyBatis 才能關聯接口和 XML 里的 SQL 。

(三)SQL 語句匹配

XML 里 SQL 語句的 id ,要和 Mapper 接口中的方法名一致,返回類型也得匹配。比如接口有 List<User> findAll(); 方法,XML 中就寫 <select id="findAll" resultType="com.itheima.pojo.User"> ,確保調用接口方法時,能找到對應 SQL 執行。

二、注解與 XML 開發選擇

(一)注解開發場景

MyBatis 注解適合簡單增刪改查(CRUD )。像單表的簡單查詢、插入,用 @Select @Insert 等注解,直接在 Mapper 接口寫 SQL ,簡潔高效,少了 XML 文件配置的繁瑣。

(二)XML 開發場景

若要實現復雜 SQL 功能(比如多表關聯查詢、動態 SQL 拼接 ),推薦用 XML 配置。XML 能更清晰組織復雜 SQL ,方便維護,還支持動態標簽(<if> <foreach> 等 ),應對多變業務需求。

三、實際應用要點

  • 目錄創建:建 XML 存放目錄,牢記用 / 分隔包名(如 com/it/mapper ),別用 . ,否則編譯后文件位置不對,MyBatis 找不到映射文件。
  • 嚴格匹配規則:開發時,仔細核對 XML 文件名、namespace 、SQL 的 id 與 Mapper 接口,稍有不匹配,就會報 “找不到 SQL 語句” 等錯誤。
  • 合理選開發方式:簡單功能優先用注解,減少配置;復雜場景選 XML ,讓 SQL 管理更靈活,結合二者優勢,提升開發效率與代碼可維護性。

通過掌握這些,就能正確用 XML 配置 MyBatis 映射,根據需求選注解或 XML 開發,保障 MyBatis 持久層操作穩定、高效 。

四 手動指定XML文件目錄

#指定XML映射配置文件的位置
mybatis.mapper-locations=classpath:文件名/*.xml

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

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

相關文章

系統信息及進程管理命令

系統信息及進程管理 一、系統信息查看 常用命令&#xff1a;uname、hostnam、hostnamectl、uptime、df、du、free、lscpu 1、uname (1)、命令簡介 uname 是一個在 Unix 和類 Unix 系統&#xff08;如 Linux、macOS&#xff09;中常用的命令行工具&#xff0c;用于顯示系統信息。…

【Z字形變換】

代碼思路分析&#xff1a;Z 字形變換 1. 邊界情況處理 if (r 1 || r > n) return s;r 1&#xff1a;只有一行&#xff0c;直接返回原字符串&#xff08;無需變換&#xff09;。r > n&#xff1a;行數大于等于字符串長度&#xff0c;每行只有一個字符&#xff0c;直接返…

VBA中類的解讀及應用第二十五講:把源數據賦給類利用類完成查找

《VBA中類的解讀及應用》教程【10165646】是我推出的第五套教程&#xff0c;目前已經是第一版修訂了。這套教程定位于最高級&#xff0c;是學完初級&#xff0c;中級后的教程。類&#xff0c;是非常抽象的&#xff0c;更具研究的價值。隨著我們學習、應用VBA的深入&#xff0c;…

Vue3核心語法進階(Hook)

Vue3 自定義 Hook&#xff1a;讓你的代碼像樂高一樣“可復用”&#xff01;大家好&#xff0c;我是你們的前端小伙伴&#xff01;上一篇我們聊了 Vue3 的生命周期&#xff0c;今天咱們繼續深入 Vue3 的核心利器——自定義 Hook&#xff08;Custom Hook&#xff09;。如果你已經…

工控領域協議之Modbus

Modbus 是一種通信協議&#xff0c;用于工業自動化領域中的設備之間的通信。它是一種串行通信協議&#xff0c;廣泛應用于連接不同設備、傳感器和執行器的工業控制系統。 Modbus 在工業控制系統、自動化設備、能源管理系統等領域得到廣泛應用。 Modbus 協議的基本特點&#xff…

大件垃圾識別 mAP↑28%:陌訊多模態融合算法實戰解析

一、行業痛點&#xff1a;大件垃圾識別的現實困境在城市環衛智能化轉型過程中&#xff0c;大件垃圾&#xff08;如廢舊家具、電器等&#xff09;的自動化識別與分揀成為關鍵環節。據住建部《城市環境衛生發展報告》顯示&#xff0c;傳統人工分揀模式下大件垃圾識別準確率不足 6…

vk框架或者普通函數封裝的一些函數可以拿取使用【會持續更新】

1.身份證校驗【通用】/*** function isIDCard* description 判斷是否為有效的身份證號碼。* param {string} idCard - 待驗證的身份證號碼。* returns {boolean} 返回驗證結果。*/ pubFun.isIDCard function (idCard) {// 身份證號碼為15位或者18位&#xff0c;15位時全為數字…

如何給Word和WPS文檔添加密碼或取消密碼

要保護Word和WPS文檔&#xff0c;可以為它們加密&#xff0c;加密有兩類&#xff1a;打開密碼和修改密碼。密碼設置有兩個入口&#xff0c;一個是在另存為&#xff0c;一個是在文件菜單。Word和WPS文字的路徑略有不同&#xff0c;微軟Office和WPS的其他套件也是如此操作。一、W…

uni-app項目gitignore文件示例

uni-app 忽略以下文件和目錄 DS_Store 忽略 UniApp 編譯生成的小程序相關目錄 unpackage/ uni_modules/ 忽略編輯器自動生成的文件 idea/ vscode/ 忽略日志文件 logs/ 忽略臨時文件 temp/ 忽略構建工具自動生成的文件 build/ 忽略 npm 安裝的包文件 package-lock.json yarn.loc…

LeetCode 135:分糖果

LeetCode 135&#xff1a;分糖果問題本質與核心挑戰 給定孩子的評分數組&#xff0c;需滿足 “每個孩子至少1顆糖果&#xff0c;相鄰評分高的孩子糖果更多”&#xff0c;求最少糖果總數。核心挑戰&#xff1a; 相鄰約束是雙向的&#xff08;左→右和右→左都需滿足&#xff09;…

【QT】安裝與配置

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;QT 文章目錄1. QT簡介與準備工作1.1 什么是QT1.2 QT的版本選擇1.3 系統要求檢查2. QT安裝方式詳解2.1 官方在線安裝器2.2 離線安裝包2.3 包管理器安裝3. Windows平臺安裝配置3.1 Windows安裝步驟3.2 環境變量配置3.3 Visual Stu…

Java從入門到精通 - 算法、正則、異常

算法、正則、異常 此筆記參考黑馬教程&#xff0c;僅學習使用&#xff0c;如有侵權&#xff0c;聯系必刪 文章目錄算法、正則、異常1. 常見算法1.1 簡單認識算法1.1.1 什么是算法&#xff1f;1.1.2 為什么要學習算法&#xff1f;1.2 排序算法1.2.1 冒泡排序1.2.1.1 實現冒泡排…

題單【排序】

P1271 【深基9.例1】選舉學生會 P1271 【深基9.例1】選舉學生會 - 洛谷 【方法一】快速排序 使用sort()&#xff0c;注意數組的范圍&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std;int a[2000000],n,m;int main() {cin>>n>&g…

【機器學習】(算法優化二)提升算法之:AdaBoost與隨機梯度

文章目錄一、 AdaBoost&#xff1a;自適應提升算法1、AdaBoost數學原理詳解1.1、 目標函數1.2、 樣本權重更新的邏輯1.3、 模型權重計算的含義1.4、 AdaBoost的核心思想2、為什么AdaBoost如此有效&#xff1f;二、 隨機梯度提升算法&#xff1a;梯度優化下更精細的優化1、隨機梯…

力扣 hot100 Day65

75. 顏色分類 給定一個包含紅色、白色和藍色、共 n 個元素的數組 nums &#xff0c;原地 對它們進行排序&#xff0c;使得相同顏色的元素相鄰&#xff0c;并按照紅色、白色、藍色順序排列。 我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 必須在不使用庫內置的 sort 函…

12.Linux 磁盤管理

Linux : 磁盤管理 一、磁盤設備命名規則磁盤類型設備命名模式示例特點SATA/SCSI/SAS/dev/sdXsda&#xff08;第一塊硬盤&#xff09; sda1&#xff08;第一塊硬盤第一分區&#xff09;機械硬盤/通用接口NVMe/dev/nvmeXnYpZnvme0n1&#xff08;第一通道第一塊盤&#xff09; …

《Linux服務與安全管理》| DHCP服務器安裝和配置

《Linux服務與安全管理》| DHCP服務器安裝和配置 目錄 《Linux服務與安全管理》| DHCP服務器安裝和配置 一、點擊“編輯虛擬機設置”&#xff0c;配置三臺虛擬機為“僅主機”模式。 二、server01開機&#xff0c;root用戶登錄&#xff0c;輸入nmtui&#xff0c;進入圖形界面…

賽博威攜手Dify,助力AI在企業的場景化落地

人工智能正以前所未有的速度重塑商業世界。我們經歷了從理論探索到大語言模型&#xff08;LLM&#xff09;的爆發式增長&#xff0c;如今&#xff0c;一個以“AI Agent&#xff08;智能體&#xff09;”為核心的新階段已然來臨。AI Agent代表了人工智能應用的未來形態。它不再被…

嵌入式硬件中三極管推挽電路控制與實現

我們昨天講到了這個電路。 如果 A 電是 PWM 波,那么請問 B 點是不是 PWM 波呢?那么,當 PWM 為高時, B 點的電流是從哪里流過來的?

數據結構——查找(三、樹形查找)

一、二叉排序樹&#xff08;BST&#xff09;1、二叉排序樹的定義構造一棵二叉排序樹的目的并不是排序&#xff0c;而是提高查找、插入和刪除關鍵字的速度二叉排序樹&#xff08;也稱二叉搜索樹&#xff09;或者是一顆空樹&#xff0c;或者是具有以下性質的二叉樹1、若左子樹非空…