前言

在现代 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;就…