当前位置: 首页 > article >正文

SpringBoot 整合 MyBatis 完整实战

SpringBoot MyBatis 可以说是国内后端开发最经典、最常用的组合了。本篇文章就来介绍一下SpringBoot如何整合MyBatis实现数据表的增删改查。一、引言SpringBoot 整合 MyBatis 是国内 Java 后端最主流的持久层方案• 灵活可控SQL 可优化、可维护• 适合复杂查询、多表关联、统计报表• 配合 XML 或注解开发效率极高• 分页、事务、缓存生态成熟这篇文章会带你完整实现1. 依赖与配置2. 数据库建表3. 实体类、Mapper接口、XML映射4. 单表增删改查5. 多条件动态查询6. 分页查询PageHelper7. Service 事务控制8. Controller 接口统一返回9. 真实开发规范 高频坑点解决二、引入完整依赖pom.xml包含MyBatis启动器、MySQL驱动、分页插件、Lombok、连接池!-- SpringBoot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis SpringBoot Starter -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.2/version /dependency !-- MySQL 驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- 分页插件 -- dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version1.4.7/version /dependency !-- Lombok 简化实体 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency三、application.yml 完整配置server: port:8080 spring: # 数据源配置 datasource: url:jdbc:mysql://localhost:3306/testdb?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiallowMultiQueriestrue username:root password:123456 driver-class-name:com.mysql.cj.jdbc.Driver # MyBatis 配置 mybatis: # XML 文件路径 mapper-locations:classpath:mapper/*.xml # 实体类别名 type-aliases-package:com.demo.entity configuration: # 下划线自动转驼峰必须开 map-underscore-to-camel-case:true # 打印SQL开发环境打开 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl四、建表 SQLuser 表CREATE TABLE user ( id bigintNOT NULL AUTO_INCREMENT COMMENT 主键ID, username varchar(50) NOT NULL COMMENT 用户名, password varchar(100) DEFAULTNULL COMMENT 密码, age intDEFAULTNULL COMMENT 年龄, email varchar(50) DEFAULTNULL COMMENT 邮箱, create_time datetime DEFAULTCURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP COMMENT 更新时间, deleted tinyint DEFAULT0 COMMENT 逻辑删除 0未删 1已删, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;五、实体类Entitypackage com.demo.entity; import lombok.Data; import java.time.LocalDateTime; Data publicclassUser { private Long id; private String username; private String password; private Integer age; private String email; private LocalDateTime createTime; private LocalDateTime updateTime; private Integer deleted; }六、Mapper 接口数据访问层包含CRUD 多条件查询 分页package com.demo.mapper; import com.demo.entity.User; import org.apache.ibatis.annotations.Param; import java.util.List; publicinterfaceUserMapper { // 新增 intinsert(User user); // 根据ID删除 intdeleteById(Long id); // 根据ID修改 intupdateById(User user); // 根据ID查询 User selectById(Long id); // 查询全部 ListUser selectAll(); // 多条件动态查询 ListUser selectByCondition(Param(username) String username, Param(age) Integer age); }启动类添加 Mapper 扫描SpringBootApplication MapperScan(com.demo.mapper) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }七、MyBatis XML 映射文件resources/mapper/UserMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.demo.mapper.UserMapper !-- 新增 -- insert idinsert insert into user(username,password,age,email) values(#{username},#{password},#{age},#{email}) /insert !-- 删除 -- delete iddeleteById delete from user where id#{id} /delete !-- 修改 -- update idupdateById update user set username#{username},age#{age},email#{email} where id#{id} /update !-- 根据ID查询 -- select idselectById resultTypeUser select * from user where id#{id} and deleted0 /select !-- 查询全部 -- select idselectAll resultTypeUser select * from user where deleted0 /select !-- 多条件动态查询 -- select idselectByCondition resultTypeUser select * from user where deleted0 if testusername ! null and username ! and username like concat(%,#{username},%) /if if testage ! null and age #{age} /if /where /select /mapper八、Service 层业务逻辑 事务8.1 UserService 接口package com.demo.service; import com.demo.entity.User; import com.github.pagehelper.PageInfo; import java.util.List; publicinterfaceUserService { // 新增 booleanadd(User user); // 删除 booleandelete(Long id); // 修改 booleanupdate(User user); // 根据ID查询 User getById(Long id); // 查询全部 ListUser list(); // 多条件查询 ListUser search(String username, Integer age); // 分页查询 PageInfoUser page(Integer pageNum, Integer pageSize); }8.2 UserServiceImpl 实现类package com.demo.service.impl; import com.demo.entity.User; import com.demo.mapper.UserMapper; import com.demo.service.UserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; Service publicclassUserServiceImplimplementsUserService { Resource private UserMapper userMapper; Override Transactional(rollbackFor Exception.class) publicbooleanadd(User user) { return userMapper.insert(user) 0; } Override Transactional(rollbackFor Exception.class) publicbooleandelete(Long id) { return userMapper.deleteById(id) 0; } Override Transactional(rollbackFor Exception.class) publicbooleanupdate(User user) { return userMapper.updateById(user) 0; } Override public User getById(Long id) { return userMapper.selectById(id); } Override public ListUser list() { return userMapper.selectAll(); } Override public ListUser search(String username, Integer age) { return userMapper.selectByCondition(username, age); } Override public PageInfoUser page(Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum, pageSize); ListUser list userMapper.selectAll(); returnnewPageInfo(list); } }九、Controller 层接口package com.demo.controller; import com.demo.common.Result; import com.demo.entity.User; import com.demo.service.UserService; import com.github.pagehelper.PageInfo; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; RestController RequestMapping(/user) publicclassUserController { Resource private UserService userService; // 新增 PostMapping(/add) public Result add(RequestBody User user) { userService.add(user); return Result.success(新增成功); } // 删除 DeleteMapping(/delete/{id}) public Result delete(PathVariable Long id) { userService.delete(id); return Result.success(删除成功); } // 修改 PutMapping(/update) public Result update(RequestBody User user) { userService.update(user); return Result.success(修改成功); } // 单个查询 GetMapping(/detail/{id}) public Result detail(PathVariable Long id) { return Result.success(userService.getById(id)); } // 列表 GetMapping(/list) public Result list() { return Result.success(userService.list()); } // 多条件搜索 GetMapping(/search) public Result search( RequestParam(required false) String username, RequestParam(required false) Integer age) { return Result.success(userService.search(username, age)); } // 分页 GetMapping(/page) public Result page( RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize) { PageInfoUser page userService.page(pageNum, pageSize); return Result.success(page); } }十、统一返回结果类package com.demo.common; import lombok.Data; Data publicclassResultT { privateint code; private String msg; private T data; publicstatic T ResultT success(T data) { ResultT r newResult(); r.setCode(200); r.setMsg(操作成功); r.setData(data); return r; } publicstatic T ResultT success(String msg) { ResultT r newResult(); r.setCode(200); r.setMsg(msg); return r; } }十一、重点功能1. 分页查询PageHelper• 必须在查询前一行使用• 自动拼接 LIMIT无需改 SQL• 返回 PageInfo 包含总条数、总页数、当前页、数据列表2. 动态 SQLif / where / foreach适合多条件搜索、后台管理系统查询。3. 事务控制Transactional任何异常自动回滚。4. 下划线自动转驼峰map-underscore-to-camel-case: truecreate_time→createTime十二、注意事项1.Mapper 注入失败启动类必须加MapperScan2.XML 绑定异常namespace 必须和 Mapper 全类名一致3.分页不生效PageHelper.startPage 必须紧跟查询4.SQL 语句报错XML 中不能直接写、需要转义5.字段映射不上开启驼峰转换6.参数多个时必须用 Param否则 MyBatis 识别不到

相关文章:

SpringBoot 整合 MyBatis 完整实战

SpringBoot MyBatis 可以说是国内后端开发最经典、最常用的组合了。本篇文章就来介绍一下SpringBoot如何整合MyBatis,实现数据表的增删改查。一、引言SpringBoot 整合 MyBatis 是国内 Java 后端最主流的持久层方案:• 灵活可控,SQL 可优化、…...

告别文档下载时代:基于Vue的Office在线预览解决方案全指南

告别文档下载时代:基于Vue的Office在线预览解决方案全指南 【免费下载链接】wps-view-vue wps在线编辑、预览前端vue项目,基于es6 项目地址: https://gitcode.com/gh_mirrors/wp/wps-view-vue 在数字化办公的今天,文档预览功能已成为企…...

GTE-Pro语义检索系统国际化支持:中英混合Query与多语言文档联合检索

GTE-Pro语义检索系统国际化支持:中英混合Query与多语言文档联合检索 1. 引言:当搜索不再受限于语言 想象一下,你在一家跨国公司的技术文档库里查找资料。你的脑海里蹦出一个问题:“How to configure the 负载均衡器 for high av…...

FGA智能自动化:重新定义Fate/Grand Order效率提升新范式

FGA智能自动化:重新定义Fate/Grand Order效率提升新范式 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA 在Fate/Grand Order的游戏世界中,90%的玩家每天都在重复着机械的刷本操作&…...

AI编程助手DeepSeek Coder:代码生成效率提升指南

AI编程助手DeepSeek Coder:代码生成效率提升指南 【免费下载链接】DeepSeek-Coder DeepSeek Coder: Let the Code Write Itself 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder 在软件开发领域,开发者每天面临着重复编码、多语…...

第21课:把 Qt 常用能力串成实战链路,打通文本、绘图、线程、网络与多媒体

本节路线图 为什么这节课看起来很散, → 先把程序的输入输出拿下: → 让界面真正活起来:`QP 兔兔建议 先顺着路线图跑一遍,再抄命令和代码,学习体验会轻松很多。 前两课我们已经把 Qt 的“界面底座”搭起来了,但真正做项目时,很多同学还是会卡在另一个问题上:界面会做了…...

多进程和多线程的特点和区别

小编觉得,多进程和多线程的差异主要体现在以下三个方面: 1. 资源隔离 多线程属于同一进程,共享进程的堆内存和全局变量,因此线程间可以直接访问彼此共享的数据。但需要注意的是,每个线程也拥有自己私有的栈空间&…...

Phi-3-mini-4k-instruct-gguf保姆级教程:开箱即用的GGUF文本生成指南

Phi-3-mini-4k-instruct-gguf保姆级教程:开箱即用的GGUF文本生成指南 1. 认识Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本。这个模型特别适合处理问答、文本改写、摘要整理和简短创作等任务。它最大的…...

别再手动记数据了!用MATLAB脚本自动读取串口,5分钟搞定数据采集

别再手动记数据了!用MATLAB脚本自动读取串口,5分钟搞定数据采集 还在用串口助手手动记录数据?每次实验都要盯着屏幕抄写数值,不仅效率低下,还容易出错。想象一下:当你正在进行长达数小时的温度监测实验&…...

C++ 用户态协议栈:基于 DPDK 的 C++ 网络库开发与内核绕过技术分析

各位技术同仁,下午好!今天,我们将深入探讨一个在高性能网络领域至关重要的话题:C 用户态协议栈的开发,特别是如何基于 DPDK 构建一个高性能网络库,以及其背后的内核绕过技术。在现代数据中心和网络基础设施…...

Python数据分析项目实战(044)——Pandas数据导出常用方法

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl to_csv() 作用:将DataFrame数据导出为CSV(逗号分隔值)格式文件,是最常用的数据导出格式之一。 import pandas as pddata = {姓名: [张三, 李四<...

DeOldify性能基准测试:不同GPU配置下的处理速度对比

DeOldify性能基准测试&#xff1a;不同GPU配置下的处理速度对比 最近在折腾老照片修复&#xff0c;用上了DeOldify这个工具。效果确实惊艳&#xff0c;能把黑白照片变得色彩鲜活。但有个问题一直困扰我&#xff1a;处理速度。一张照片等几分钟还能接受&#xff0c;要是批量处理…...

Qwen3-0.6B-FP8数据库智能查询:用自然语言生成SQL语句

Qwen3-0.6B-FP8数据库智能查询&#xff1a;用自然语言生成SQL语句 你有没有过这样的经历&#xff1f;面对一个数据库&#xff0c;明明知道数据就在里面&#xff0c;却因为不懂SQL而束手无策。想查“上个月哪个产品卖得最好”&#xff0c;或者“找出最近三个月复购率最高的客户…...

从零搭建像素剧本工作站:Pixel Script Temple镜像免配置快速上手指南

从零搭建像素剧本工作站&#xff1a;Pixel Script Temple镜像免配置快速上手指南 1. 认识像素剧本圣殿 Pixel Script Temple是一款专为剧本创作者设计的AI辅助工具&#xff0c;它基于强大的Qwen2.5-14B-Instruct模型深度优化&#xff0c;特别适合需要频繁创作剧本、小说或叙事…...

小白也能懂:雪女-斗罗大陆-造相Z-Turbo文生图模型使用详解

小白也能懂&#xff1a;雪女-斗罗大陆-造相Z-Turbo文生图模型使用详解 1. 模型介绍 1.1 什么是雪女-斗罗大陆-造相Z-Turbo 雪女-斗罗大陆-造相Z-Turbo是一款专门用于生成《斗罗大陆》风格图片的AI模型&#xff0c;特别擅长创作与"雪女"角色相关的精美图像。这个模…...

文墨共鸣使用避坑指南:避免这3个误区让分析更准确

文墨共鸣使用避坑指南&#xff1a;避免这3个误区让分析更准确 1. 引言&#xff1a;从“会用”到“用好”的关键一步 你已经成功部署了文墨共鸣&#xff0c;体验了它那充满诗意的水墨界面&#xff0c;也尝试过输入几段文字来感受AI对语义的“雅鉴”。但你是否遇到过这样的困惑…...

【实战指南】ComfyUI-Florence2模型加载问题疑难解决:从异常排查到稳定运行的实践指南

【实战指南】ComfyUI-Florence2模型加载问题疑难解决&#xff1a;从异常排查到稳定运行的实践指南 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 在使用ComfyUI-Florence2视觉…...

如何通过Diablo Edit2高效定制暗黑破坏神II角色?全攻略指南

如何通过Diablo Edit2高效定制暗黑破坏神II角色&#xff1f;全攻略指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾因暗黑破坏神II中属性点分配错误而重开新角色&#xff1f;是否为刷…...

SEO关键词推广与视频内容创作有什么关系

SEO关键词推广与视频内容创作&#xff1a;一场紧密交织的战斗 在当今的数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;和视频内容创作已经成为每个企业和个人在网络世界中取得成功的重要途径。SEO关键词推广与视频内容创作究竟有什么关系呢&#xff1f;本文将…...

5分钟上手MouseClick:让重复点击自动化的3个核心技巧

5分钟上手MouseClick&#xff1a;让重复点击自动化的3个核心技巧 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;操…...

暗黑2终极增强:PlugY插件如何彻底改变你的单机游戏体验

暗黑2终极增强&#xff1a;PlugY插件如何彻底改变你的单机游戏体验 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神2单机模式的种种限制而烦恼吗&am…...

RAPTOR编程实战:从算法设计到图形化交互

1. RAPTOR入门&#xff1a;为什么它是最适合初学者的算法工具 第一次接触编程的人往往会被各种语法规则和复杂环境劝退。我教过不少零基础学生&#xff0c;发现他们最头疼的不是算法逻辑本身&#xff0c;而是记不住C的分号或者Python的缩进规则。这时候RAPTOR的优势就显现出来…...

从数学原理到代码实现:手把手推导Transformer时间复杂度公式(附PyTorch示例)

从数学原理到代码实现&#xff1a;手把手推导Transformer时间复杂度公式&#xff08;附PyTorch示例&#xff09; 在自然语言处理领域&#xff0c;Transformer架构已经成为事实上的标准模型。但当我们处理长文本序列时&#xff0c;经常会遇到计算资源急剧增加的问题。这背后的核…...

QT老版本下载被拒?手把手教你用迅雷搞定5.12.12和4.8.7离线安装包

QT老版本下载难题破解&#xff1a;从地址拼接到离线安装全指南 遇到QT老版本下载被拒的提示&#xff1f;别急着放弃。对于需要维护遗留系统或确保项目兼容性的开发者来说&#xff0c;获取特定版本的QT框架往往成为一道必须跨越的门槛。本文将带你深入理解QT官方下载机制&#…...

基于vue的断舍离管理系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着物质生活的丰富&#xff0c;物品管理成为人们生活中的一个重要问题。断舍离管理系统的设计与实现旨在帮助用户更好地管理个人物品&#xff0c;通过合理的分类、捐赠和回收机制&#xff0c;实现物品的有效清理和资源的合理利用。本文基于Vue框架设计并实现了…...

精密五金结构件配套

一、我们能为机器人行业提供什么&#xff1f;专注机器人非核心精密五金结构件配套&#xff0c;面向&#xff1a;工业机器人&#xff5c;协作机器人&#xff5c;人形机器人&#xff5c;AGV/AMR&#xff5c;末端执行器&#xff5c;减速器 / 伺服 / 模组&#xff5c;自动化集成工作…...

【IEEE TNNLS 2025】赋予大模型“跨院行医”的能力:基于全局与局部提示的医学图像泛化框架 (GLP) 解析

在医学图像分割的临床落地中&#xff0c;一个长期存在的痛点是**“领域偏移 (Domain Shift)”**。一个在A医院&#xff08;源域&#xff09;表现完美的深度学习模型&#xff0c;当部署到使用不同成像设备、不同扫描参数的B医院&#xff08;未知目标域&#xff09;时&#xff0c…...

[RAG在LangChain中的实现-07]利用重排序选择相关性最高的检索内容构建上下文

重排序&#xff08;Re-ranking&#xff09;是一种关键的RAG优化技术。它通过在“初始检索”与“最终生成”之间&#xff0c;通过对初步检索出的文档进行二次评估&#xff0c;筛选出与用户查询语义最相关的结果&#xff0c;从而提高生成内容的准确性。在典型的检索流程中&#x…...

如何验证Qwen3-4B部署效果?MMLU基准测试实战指南

如何验证Qwen3-4B部署效果&#xff1f;MMLU基准测试实战指南 1. 为什么需要验证模型效果&#xff1f; 当你成功部署了Qwen3-4B模型后&#xff0c;最关心的问题肯定是&#xff1a;这个模型到底表现如何&#xff1f;能不能满足我的需求&#xff1f;这时候就需要一个客观的评估方…...

别再用subprocess了!Mojo原生FFI直连Python C API的5种安全模式,含CPython 3.11+PyPy兼容性矩阵表

第一章&#xff1a;Mojo 与 Python 混合编程案例 生产环境部署Mojo 作为新兴的系统级编程语言&#xff0c;原生兼容 Python 生态&#xff0c;支持在关键性能路径中无缝调用 Mojo 编译模块&#xff0c;同时复用 Python 的成熟工具链与部署基础设施。在生产环境中&#xff0c;典型…...