在 Spring Boot 中使用 MyBatis 的 XML 文件編寫 SQL 語句詳解

前言

在現代 Java Web 開發中,Spring BootMyBatis 是兩個非常流行的技術框架。它們的結合使得數據庫操作變得更加簡潔和高效。本文將詳細介紹如何在 Spring Boot 項目中使用 MyBatis 的 XML 文件來編寫 SQL 語句,包括配置、代碼結構、SQL 編寫技巧以及最佳實踐等內容。


一、什么是 MyBatis?

MyBatis 是一個基于 Java 的持久層框架,它允許開發者通過 XML 或注解方式編寫 SQL,并與 Java 對象進行映射(ORM)。相比 Hibernate 等全自動 ORM 框架,MyBatis 更加靈活,適用于需要對 SQL 進行精細控制的場景。


二、Spring Boot + MyBatis 的基本架構

典型的 Spring Boot + MyBatis 項目結構如下:

src
└── main├── java│   └── com.example.demo│       ├── DemoApplication.java│       ├── controller│       ├── service│       ├── mapper│       └── model└── resources├── application.properties└── mapper└── UserMapper.xml

其中 mapper 包下的接口與 resources/mapper 下的 XML 文件是一一對應的。


?? 三、搭建環境

1. 添加依賴(Maven)

<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!-- MySQL 驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
</dependencies>

2. 配置數據庫連接(application.properties)

spring.datasource.url=jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/**/*.xml
mybatis.type-aliases-package=com.example.demo.model

四、編寫 Mapper 接口和 XML 文件

1. 創建實體類(Model)

package com.example.demo.model;public class User {private Long id;private String name;private String email;// Getter and Setter
}

2. 創建 Mapper 接口

package com.example.demo.mapper;import com.example.demo.model.User;
import java.util.List;public interface UserMapper {List<User> getAllUsers();User getUserById(Long id);void insertUser(User user);void updateUser(User user);void deleteUserById(Long id);
}

3. 創建 XML 映射文件(resources/mapper/UserMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper"><!-- 查詢所有用戶 --><select id="getAllUsers" resultType="User">SELECT * FROM users</select><!-- 根據ID查詢用戶 --><select id="getUserById" parameterType="long" resultType="User">SELECT * FROM users WHERE id = #{id}</select><!-- 插入用戶 --><insert id="insertUser">INSERT INTO users (name, email)VALUES (#{name}, #{email})</insert><!-- 更新用戶 --><update id="updateUser">UPDATE usersSET name = #{name}, email = #{email}WHERE id = #{id}</update><!-- 刪除用戶 --><delete id="deleteUserById">DELETE FROM users WHERE id = #{id}</delete></mapper>

五、動態 SQL 使用詳解

MyBatis 提供了強大的動態 SQL 功能,常見標簽有 <if><choose><when><set><where><foreach> 等。

示例:根據條件查詢用戶

Mapper 接口:
List<User> searchUsers(@Param("name") String name, @Param("email") String email);
XML 文件:
<select id="searchUsers" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="email != null and email != ''">AND email LIKE CONCAT('%', #{email}, '%')</if></where>
</select>

示例:批量插入用戶

<insert id="batchInsert">INSERT INTO users (name, email)VALUES<foreach collection="list" item="user" separator=",">(#{user.name}, #{user.email})</foreach>
</insert>

六、測試 MyBatis SQL

可以創建一個簡單的 Service 層調用 Mapper 并打印結果。

Service 示例:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void printAllUsers() {List<User> users = userMapper.getAllUsers();users.forEach(System.out::println);}
}

Controller 示例:

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic void getUsers() {userService.printAllUsers();}
}

七、MyBatis XML 常見標簽總結

標簽用途
<select>查詢操作
<insert>插入操作
<update>更新操作
<delete>刪除操作
<where>自動處理 WHERE 子句,避免多余的 AND/OR
<if>條件判斷
<choose>/<when>/<otherwise>多條件選擇
<set>自動處理更新字段中的逗號問題
<foreach>循環處理集合數據(如 IN 子句、批量插入)

八、最佳實踐建議

  1. 命名規范統一:XML 文件名與 Mapper 接口名保持一致。
  2. SQL 與業務邏輯分離:將 SQL 放在 XML 中,便于維護和審計。
  3. 使用 <where><set> 避免語法錯誤
  4. 合理使用 <resultMap> 映射復雜對象關系
  5. 開啟 MyBatis 日志輸出,方便調試:
    logging:level:com.example.demo.mapper: debug
    

九、擴展功能推薦

  • PageHelper 分頁插件:輕松實現分頁查詢。
  • MyBatis Generator:自動生成 Model、Mapper 和 XML 文件。
  • MyBatis Plus:增強型 MyBatis 工具包,簡化 CRUD 操作。

十、結語

在 Spring Boot 中使用 MyBatis 的 XML 方式編寫 SQL,不僅保留了 SQL 的靈活性,還利用了框架提供的強大映射能力。通過本篇博客,你已經掌握了從項目搭建到 SQL 編寫的完整流程,以及動態 SQL 的高級用法。希望你在實際項目中能夠熟練運用這些知識,寫出更優雅、高效的數據庫操作代碼!


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

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

相關文章

字段級權限控制場景中,RBAC與ABAC的性能差異

RBAC(基于角色訪問控制)與ABAC(基于屬性訪問控制)的性能差異主要體現在??計算復雜度、策略靈活性、擴展性??和??資源消耗??等方面。以下是具體對比分析: ??一、性能對比維度?? ??維度????RBAC????ABAC????計算復雜度??低(預計算角色權限映射…

Reddit Karma是什么?Post Karma和Comment Karma的提升指南

在Reddit這一用戶活躍度高的社區里&#xff0c;想要獲得更好的曝光&#xff0c;我們就需要提升我們的Karma值&#xff0c;什么是Reddit Karma&#xff1f;怎么樣才能提升以獲得更大的影響力&#xff1f;本文將為你提高一套切實可行的提升方案。一、什么是Reddit Karma&#xff…

基于Canal實現MySQL數據庫數據同步

一、基礎概念與原理 1. Canal是什么&#xff1f; 阿里巴巴開源的MySQL binlog增量訂閱與消費組件&#xff0c;通過偽裝為MySQL Slave監聽Master的binlog變更&#xff0c;實現實時數據同步。 Canal 官方網站&#xff1a;https://github.com/alibaba/canal Canal Demo&#x…

算法第23天|貪心算法:基礎理論、分發餅干、擺動序列、最大子序和

今日總結&#xff1a; 擺動序列的三種特殊情況需要著重思考&#xff0c;感覺是沒有思考清楚 基礎理論 1、貪心的本質&#xff1a; 貪心的本質是選擇每一階段的局部最優&#xff0c;從而達到全局最優。 例如&#xff1a;一堆鈔票&#xff0c;只能拿走10張&#xff0c;如何拿走最…

Q-chunking——帶有動作分塊的強化學習:基于人類演示,進行一定的連貫探索(且可做到無偏的n步價值回溯)

前言 我在之前的文章中提到過多次&#xff0c;長沙具身團隊是我司建設的第二支具身團隊&#xff0c;通過5月份的全力招聘&#xff0c;為了沖刺6月底和7月初來長沙辦公室考察的第一批客戶&#xff0c;過去一個多月來&#xff0c;長沙分部(一開始就5人&#xff0c;另外5人 實習…

NW956NW961美光固態閃存NW964NW968

美光固態閃存深度解析&#xff1a;NW956、NW961、NW964與NW968的全方位評測一、產品概述與市場定位在當今數據爆炸的時代&#xff0c;固態硬盤&#xff08;SSD&#xff09;作為存儲領域的佼佼者&#xff0c;其性能與穩定性成為了用戶關注的焦點。美光&#xff08;Micron&#x…

C++修煉:IO流

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

語音識別的速度革命:從 Whisper 到 Whisper-CTranslate2,我經歷了什么?

Whisper-CTranslate2&#xff1a;語音識別的速度革命 大家好&#xff0c;一個沉迷于 AI 語音技術的 “音頻獵人”。最近在處理大量播客轉錄項目時&#xff0c;我被傳統語音識別工具折磨得苦不堪言 ——RTX 3090 跑一個小時的音頻要整整 20 分鐘&#xff0c;服務器內存分分鐘爆滿…

JVM 內存模型詳解:GC 是如何拯救內存世界的?

JVM 內存模型詳解&#xff1a;GC 是如何拯救內存世界的&#xff1f; 引言 Java 虛擬機&#xff08;JVM&#xff09;是 Java 程序運行的基礎&#xff0c;其核心特性之一就是自動內存管理。與 C/C 不同&#xff0c;Java 開發者無需手動分配和釋放內存&#xff0c;而是由 JVM 自動…

分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么選?

在黑馬點評項目實戰中&#xff0c;關于全局唯一ID生成的實現方案選擇中&#xff0c;我看到有人提到了雪花算法&#xff0c;本文就來簡單了解一下雪花算法與Redis的incr方案的不同。在分布式系統開發中&#xff0c;“全局唯一ID”是繞不開的核心問題。無論是分庫分表的數據庫設計…

(新手友好)MySQL學習筆記(完):事務和鎖

事務和鎖事務transaction&#xff0c;一組原子性的SQL查詢&#xff0c;或者說是一個獨立的工作單元。如果能夠成功執行這組查詢的全部語句&#xff0c;就會執行這組查詢&#xff1b;如果其中任何一條語句無法成功執行&#xff0c;那么這組查詢的所有語句都不會執行。也就是說&a…

【CMake】使用 CMake 將單模塊 C 項目構建為庫并鏈接主程序

目錄1. 項目結構設計&#x1f4e6; 結構說明2. 項目文件內容2.1 頂層 CMakeLists.txt2.2 模塊 src/color/CMakeLists.txt ?【推薦寫法】?是否需要寫 project()&#xff1f;2.3 模塊頭文件 include/color.h2.4 模塊實現文件 src/color/color.c2.5 主程序 src/main.c3. 構建與運…

從零開始的云計算生活——番外4,使用 Keepalived 實現 MySQL 高可用

目錄 前言 一、架構原理? ?Keepalived 作用? ?MySQL 主從復制? 二、環境準備? 服務器要求?&#xff1a; 安裝基礎軟件? 三、配置 MySQL 主從復制 四、配置 Keepalived 主節點配置?&#xff08;/etc/keepalived/keepalived.conf&#xff09; 從節點配置 五、…

list類的常用接口實現及迭代器

目錄 1. list類的介紹 2.list類的常用接口 2.1 list類的常用構造 2.2 list類對象的容量操作 2.3 list迭代器 2.4 list類的常用操作 3.list的模擬實現 1. list類的介紹 list代表的是雙向鏈表&#xff0c;常見的有創建&#xff0c;增&#xff0c;刪&#xff0c;改幾個接口…

vscode Cline接入火山引擎的Deepseek R1

創建火山引擎Deepseek R1的API 在火山引擎管理控制臺中創建Deepseek R1推理接入點&#xff08;大模型&#xff09;&#xff0c;創建成功后會看到下圖效果。在操作中選擇API調用&#xff0c;在頁面中選擇OpenAI SDK&#xff0c;按照步驟找到baseUrl地址和API_KEY&#xff0c;后續…

新手向:自動化圖片格式轉換工具

大家好&#xff01;今天我要分享一個非常實用的Python小工具——圖片格式批量轉換器。如果你經常需要處理大量不同格式的圖片文件&#xff0c;或者需要統一圖片格式以便于管理&#xff0c;那么這個工具將會成為你的得力助手&#xff01;一、為什么需要圖片格式轉換&#xff1f;…

CUDA中的內存管理、鎖頁內存、UVA統一虛擬地址、零拷貝、統一內存

文章目錄0 前言1 swap內存跟鎖頁內存2 UVA(Unified Virtual Addressing)統一虛擬地址3 先看最普通的cuda內存分配、釋放、傳輸4 申請鎖頁內存4.1 cudaHostAllocDefault4.2 cudaHostAllocPortable4.3 cudaHostAllocWriteCombined4.3 cudaHostAllocMapped4.4 幾種鎖頁內存總結4.5…

微服務環境下的灰度發布與金絲雀發布實戰經驗分享

微服務環境下的灰度發布與金絲雀發布實戰經驗分享 在大規模微服務架構中&#xff0c;如何平滑安全地上線新功能是每個后端團隊的痛點。本文將結合生產環境中的真實案例&#xff0c;分享灰度發布&#xff08;Gray Release&#xff09;與金絲雀發布&#xff08;Canary Release&am…

MEF 在 WPF 中的簡單應用

MEF核心筆記MEF 的開發模式主要適用于插件化的業務場景中&#xff0c;C/S 和 B/S 中都有相應的使用場景&#xff0c;其中包括但不限于 ASP.NET MVC 、ASP WebForms、WPF、UWP 等開發框架。當然&#xff0c;DotNet Core 也是支持的。 以下是搜索到一些比較好的博文供參考&#…

Gitlab跑CICD的時候,maven鏡像和pom.xml使用的maven版本沖突導致沒辦法build成功的解決方法

是這樣的&#xff01;最近遇到一個非常棘手的難題&#xff0c;我搞了大概2周時間才把他弄出來&#xff0c;因為自己搭了個私服的maven倉庫&#xff0c;他不像maven官方倉庫一樣&#xff0c;可以跟nginx一樣轉的&#xff0c;所以遇到好幾個難點&#xff01;第一點&#xff1a;就…