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

MyBatis进阶:动态SQL与MyBatis Generator插件使用

一.动态SQL动态 SQL 是Mybatis的强大特性之⼀能够完成不同条件下不同的 sql 拼接下面我只介绍比较常用的动态SQL标签 想要了解更多标签可以参考官方文档https://mybatis.net.cn/dynamic-sql.html1.1 if 标签if 标签 是 MyBatis 动态 SQL 最常用的标签作用是根据条件动态拼接 SQL 片段解决「不同条件下执行不同 SQL」的问题比如多条件查询、非空字段更新 / 插入等场景。语法if test条件表达式 需要拼接的 SQL 片段 /if接口定义Integer insertUserByCondition(UserInfo userInfo);Mapper.xml 实现insert idinsertUserByCondition INSERT INTO userinfo ( username, password, age, if testgender ! null gender, /if phone) VALUES ( #{username}, #{age}, if testgender ! null #{gender}, /if #{phone}) /insert使用注解实现不推荐把上面SQL(包括标签),使用script/script标签括起来就可以Insert(script INSERT INTO userinfo (username,password,age, if testgender!nullgender,/if phone) VALUES(#{username},#{age}, if testgender!null#{gender},/if #{phone}) /script) Integer insertUserByCondition(UserInfo userInfo);1.2 trim标签trim 是 MyBatis 中用于修剪 SQL 片段首尾多余字符的标签常配合if 使用解决「动态拼接 SQL 时首尾多出 AND/OR/ 逗号」的问题语法trim prefix前缀 suffix后缀 prefixOverrides要移除的前缀字符 suffixOverrides要移除的后缀字符 动态拼接的 SQL 片段 /trim属性作用示例值prefix给拼接后的 SQL 片段添加前缀比如(或WHEREprefixWHEREsuffix给拼接后的 SQL 片段添加后缀比如)或VALUESsuffix)prefixOverrides移除拼接后 SQL 片段开头的指定字符比如AND/ORprefixOverridesANDsuffixOverrides移除拼接后 SQL 片段结尾的指定字符比如,suffixOverrides,注意它会根据内部动态拼接的 SQL 片段自动决定是否添加前缀 / 后缀以及是否移除首尾多余的字符完全不需要我们手动判断调整 Mapper.xml 的插入语句为insert idinsertUserByCondition INSERT INTO userinfo trim prefix( suffix) suffixOverrides, if testusername !null username, /if if testpassword !null password, /if if testage ! null age, /if if testgender ! null gender, /if if testphone ! null phone, /if /trim VALUES trim prefix( suffix) suffixOverrides, if testusername !null #{username}, /if if testpassword !null #{password}, /if if testage ! null #{age}, /if if testgender ! null #{gender}, /if if testphone ! null #{phone} /if /trim /insert1.3 where标签where 是 MyBatis 为WHERE 子句量身定制 的标签本质是 trim 的「简化版」专门解决「动态查询时 WHERE 子句的拼接问题」比手动写trim 更简洁、语义更清晰。核心语法where if test条件1AND/OR 条件1的SQL片段/if if test条件2AND/OR 条件2的SQL片段/if !-- 更多if条件 -- /where核心作用自动为条件块添加WHERE关键字仅当内部有有效条件时自动剔除条件块开头多余的AND或OR关键字。注意where 标签是 trim perfixwhere perfixOverrides AND | OR 的简化写法规则完全一致。接口定义:ListUserInfo queryByCondition();Mapper.xml 实现select idqueryByCondition resultTypecom.example.demo.model.UserInfo select id, username, age, gender, phone, delete_flag, create_time, update_time from userinfo where if testage ! null and age #{age} /if if testgender ! null and gender #{gender} /if if testdeleteFlag ! null and delete_flag #{deleteFlag} /if /where /select1.4 set 标签set是 MyBatis 提供的动态 SQL 核心标签专用于UPDATE语句的 SET子句动态拼接是trim标签针对更新场景的语法糖简化封装其核心定义可拆解为核心语法update id方法名 parameterType参数类型如实体类全限定名 UPDATE 表名 set !-- 动态更新字段每个字段后可加逗号set 自动处理 -- if test字段名 ! null [and 字段名 ! ] 数据库字段名 #{参数名}, /if !-- 可添加多个 if 标签对应多个更新字段 -- /set WHERE 主键字段 #{主键参数} !-- 必须加防止全表更新 -- /update功能定位解决手动拼接UPDATE语句的SET子句时因字段条件动态变化导致的「末尾多余逗号」「无有效字段时生成空 SET 子句」等 SQL 语法错误问题核心规则仅当内部包含有效更新字段非空的if条件块时才会在拼接结果前添加SET关键字自动剔除拼接结果末尾多余的英文逗号,无有效更新字段时不生成任何SET相关内容避免UPDATE table WHERE ...这类语法错误。注意set 标签也可以使用 trim prefixset suffixOverrides, 代替这两个的功能完全一致接口定义Integer updateUserByCondition(UserInfo userInfo);Mapper.xml 实现update idupdateUserByCondition update userinfo set if testusername ! null username #{username}, /if if testage ! null age #{age}, /if if testdeleteFlag ! null delete_flag #{deleteFlag}, /if /set where id #{id} /update1.5 foreach标签foreach标签是MyBatis框架中最常用的动态 SQL 标签之一核心作用是遍历集合List/Set/ 数组 / Map并根据集合元素动态拼接 SQL 语句比如批量插入、IN 条件查询等。foreach标签的核心属性如下前 4 个是最常用的属性名作用collection绑定方法参数中的集合如ListSetMap或数组对象item遍历时的每一个对象给每一个对象取的别名separator元素之间的分隔符open语句块开头的字符串close语句块结尾得字符串接口定义void deleteByIds(ListInteger ids);Mapper.xml 实现delete iddeleteByIds delete from userinfo where id in foreach collectionids itemid separator, open( close) #{id} /foreach /delete1.6 include 标签include 标签是 MyBatis 中用于复用 SQL 片段的核心标签能有效解决 SQL 代码冗余问题比如多个 SQL 语句共用相同的字段列表、WHERE 条件等提升代码的可维护性。简单来说,include就像编程里的 “复制粘贴”但更优雅 —— 你可以把重复的 SQL 片段定义在sql 标签里然后在需要的地方用include引用它。核心语法1. 定义可复用的sql片段使用 sql 标签sql idallColumn id, username, age, gender, phone, delete_flag, create_time, update_time /sql2. 引用sql片段 使用include 标签select idqueryAllUser resultMapBaseMap select include refidallColumn/include from userinfo /select select idqueryById resultTypecom.example.demo.model.UserInfo select include refidallColumn/include from userinfo where id #{id} /select总结使用流程先通过sql idxxx定义片段再通过include refid xxx引用二. MyBatis GeneratorMyBatis Generator是⼀个为MyBatis框架设计的代码成成⼯具, 它可以根据数据库表结构自动生成相应 的Java 实体类 , Mapper接口 以及SQL映射文件,简化数据访问层的编码工作,使得开发者可以更专注于 业务逻辑的实现. 接下来我们看下,如何使用 MyBatisGenerator来生成代码.2.1 引入插件plugin groupIdorg.mybatis.generator/groupId artifactIdmybatis-generator-maven-plugin/artifactId version1.3.6/version executions execution idGenerate MyBatis Artifacts/id phasedeploy/phase goals goalgenerate/goal /goals /execution /executions configuration !--generator配置⽂件所在位置 -- configurationFilesrc/main/resources/mybatisGenerator/generatorConfig.xml/con figurationFile !-- 允许覆盖⽣成的⽂件, mapxml不会覆盖, 采⽤追加的⽅式-- overwritetrue/overwrite verbosetrue/verbose !--将当前pom的依赖项添加到⽣成器的类路径中-- includeCompileDependenciestrue/includeCompileDependencies /configuration dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /plugin上面的有些内容属于模板实际需要按情况进行修改比如configurationFile中的路径要和你创建的文件的路径保持一致2.2 添加generatorConfig.xml并修改⽂件路径和上述配置保持⼀致:完善文件内容?xml version1.0 encodingUTF-8? !DOCTYPE generatorConfiguration PUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd !-- 配置⽣成器 -- generatorConfiguration !-- ⼀个数据库⼀个context -- context idMysqlTables targetRuntimeMyBatis3Simple !--禁⽤⾃动⽣成的注释-- commentGenerator property namesuppressDate valuetrue/ property namesuppressAllComments valuetrue / /commentGenerator !--数据库连接信息-- jdbcConnection driverClasscom.mysql.jdbc.Driver connectionURLjdbc:mysql://127.0.0.1:3306/java_blog_spring? serverTimezoneAsia/Shanghaiamp;nullCatalogMeansCurrenttrue userIdroot passwordroot /jdbcConnection !-- ⽣成实体类, 配置路径 -- javaModelGenerator targetPackagecom.example.demo.model targetProjectsrc/main/java property nameenableSubPackages valuefalse/ property nametrimStrings valuetrue/ /javaModelGenerator !-- ⽣成mapxml⽂件 -- sqlMapGenerator targetPackagemapper targetProjectsrc/main/resources property nameenableSubPackages valuefalse / /sqlMapGenerator !-- ⽣成mapxml对应client也就是接⼝mapper -- javaClientGenerator targetPackagecom.example.demo.mapper targetProjectsrc/main/java typeXMLMAPPER property nameenableSubPackages valuefalse / /javaClientGenerator !-- table可以有多个,tableName表⽰要匹配的数据库表 -- table tableNameuser domainObjectNameUserInfo enableSelectByExampletrue enableDeleteByExampletrue enableDeleteByPrimaryKeytrue enableCountByExampletrue enableUpdateByExampletrue2.3 生成文件双击运行即可根据 generatorConfig.xml 中的具体配置 生成一个表 的Java实体类mapper接口mapper接口对应的XML文件

相关文章:

MyBatis进阶:动态SQL与MyBatis Generator插件使用

一.动态SQL 动态 SQL 是Mybatis的强大特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接 下面我只介绍比较常用的动态SQL标签 &#xff0c;想要了解更多标签可以参考官方文档&#xff1a;https://mybatis.net.cn/dynamic-sql.html 1.1 <if> 标签 if 标签 是 M…...

Qwen3.5-9B从零开始:3步完成Gradio Web UI本地部署

Qwen3.5-9B从零开始&#xff1a;3步完成Gradio Web UI本地部署 1. 前言&#xff1a;为什么选择Qwen3.5-9B Qwen3.5-9B是当前最先进的多模态大语言模型之一&#xff0c;它在多个关键领域实现了突破性进展。与上一代产品相比&#xff0c;Qwen3.5-9B带来了三大核心优势&#xff…...

使用阿里云轻量应用服务器OpenClaw丝滑接入飞书打造智能群聊总结助手

在企业日常沟通中&#xff0c;飞书群聊已经成为团队协作的重要工具。然而&#xff0c;随着群聊信息的不断积累&#xff0c;如何快速提取关键信息、生成会议纪要或群聊总结成为了一个挑战。传统的人工整理方式不仅耗时耗力&#xff0c;还容易遗漏重要信息。 基于此&#xff0c;…...

造相-Z-Image-Turbo亚洲美女LoRA应用:快速生成高质量东方人物肖像

造相-Z-Image-Turbo亚洲美女LoRA应用&#xff1a;快速生成高质量东方人物肖像 1. 项目概述与核心价值 1.1 什么是Z-Image-Turbo Z-Image-Turbo是通义实验室推出的高性能文生图模型&#xff0c;基于扩散模型架构优化而来。相比传统模型&#xff0c;它具有三大核心优势&#x…...

深度解析HtmlToWord:基于Office Interop的HTML转Word技术实现

深度解析HtmlToWord&#xff1a;基于Office Interop的HTML转Word技术实现 【免费下载链接】HtmlToWord Convert html to word using Microsoft.Office.Interop.Word 项目地址: https://gitcode.com/gh_mirrors/ht/HtmlToWord 在Web应用开发中&#xff0c;将HTML内容转换…...

GLM-TTS新手避坑指南:参考音频选择和参数设置技巧

GLM-TTS新手避坑指南&#xff1a;参考音频选择和参数设置技巧 1. 前言&#xff1a;为什么需要这份指南 语音合成技术已经变得越来越普及&#xff0c;但很多新手在使用GLM-TTS这类高级语音克隆工具时&#xff0c;常常会遇到各种"坑"——生成的语音不像、效果不自然、…...

麦橘超然Flux快速上手:无需深度学习基础,轻松玩转AI图像生成

麦橘超然Flux快速上手&#xff1a;无需深度学习基础&#xff0c;轻松玩转AI图像生成 1. 从“想画就画”到“点一下就行”&#xff0c;这才是AI绘画该有的样子 你是不是也刷到过那些让人惊叹的AI画作&#xff1f;赛博朋克的城市夜景、充满细节的奇幻角色、或是意境深远的水墨山…...

Qwen3-32B开源模型部署:镜像中预装git-lfs,支持大模型权重增量更新机制

Qwen3-32B开源模型部署&#xff1a;镜像中预装git-lfs&#xff0c;支持大模型权重增量更新机制 1. 镜像概述与核心优势 Qwen3-32B-Chat 私有部署镜像是专为RTX 4090D 24GB显存显卡深度优化的解决方案&#xff0c;基于CUDA 12.4和驱动550.90.07构建。这个开箱即用的镜像内置了…...

Maya FX Nparticle(笔记1)

【填充对象】点开右侧小方框&#xff0c;调整参数&#xff0c;点击应用。&#xff08;大纲视图中出现nparticle1选项psphere1模型nucleus解算器节点&#xff09;【获取nparticle示例】【创建选项】&#xff08;点球云厚云水&#xff09;默认我们创建的粒子什么形态【nparticle工…...

个人博客自动化:OpenClaw+Qwen3-32B从草稿到发布的完整流程

个人博客自动化&#xff1a;OpenClawQwen3-32B从草稿到发布的完整流程 1. 为什么需要自动化写作工作流 作为一个技术博主&#xff0c;我经常面临这样的困境&#xff1a;灵感来临时能快速产出内容&#xff0c;但后续的排版、配图、发布等琐碎流程却消耗了大量时间。直到发现Op…...

后端:00-教程目录

实战教程目录 - 后端 教程简介 本教程基于已实现的智慧农业管理系统编写,采用渐进式教学风格,每章代码可独立运行。 技术栈:Spring Boot 3.2.3 + MyBatis-Plus + JWT + 阿里百炼 AI 学习路线 环境准备 → 项目初始化 → 公共模块 → 用户认证 → 多租户 → AI识别 → 灌…...

Qwen3-Reranker-4B安全部署指南:权限控制与数据保护

Qwen3-Reranker-4B安全部署指南&#xff1a;权限控制与数据保护 最近在部署Qwen3-Reranker-4B时&#xff0c;我发现很多教程都只关注“怎么跑起来”&#xff0c;却很少提到“怎么安全地跑起来”。这其实是个挺大的隐患——想想看&#xff0c;一个能处理敏感文本的模型&#xf…...

leetcode 1447. Simplified Fractions 最简分数

Problem: 1447. Simplified Fractions 最简分数 分子分母的最大公约数等于1的分数&#xff0c;才是最简真分数&#xff0c;而可以约分的分数一定可以化成最简分数&#xff0c;所以只需要保存最大公约数等于1的分数&#xff0c;!1的分数不需要保存 Code class Solution { publ…...

FlowNet vs UNet:医学图像配准模型选型实战指南(附ROI分割技巧)

FlowNet与UNet在医学图像配准中的深度对比与实战优化 医学影像处理领域正经历着从传统算法到深度学习方法的范式转变。在这个转型过程中&#xff0c;FlowNet和UNet作为两种主流的网络架构&#xff0c;在图像配准任务中展现出不同的特性与优势。本文将深入剖析这两种架构在医学图…...

机械臂控制

目录 空间运动 机械臂运动学和D-H参数 DH参数 运动学逆解 刚体运动 Exponential Coordinate for Rotation Exponential Coordinate for Rigid Motion 速度运动学 广义坐标和广义速度 (Generalized Coordinates and Speeds) 雅各比矩阵 (Jacobian) 位置position雅可比…...

Halcon实战:5分钟搞定工业零件中的圆孔检测(附完整代码)

工业视觉实战&#xff1a;Halcon高效圆孔检测全流程解析 在自动化产线上&#xff0c;一颗螺丝孔的定位偏差可能导致整条生产线停摆。传统人工检测不仅效率低下&#xff0c;且难以应对金属反光、油污附着等工业场景特有的干扰因素。本文将分享如何利用Halcon的hough_circle算法&…...

Qwen3.5-9B多模态服务治理:API网关集成+调用审计+用量统计方案

Qwen3.5-9B多模态服务治理&#xff1a;API网关集成调用审计用量统计方案 1. 项目背景与模型特性 Qwen3.5-9B作为新一代多模态大模型&#xff0c;在服务治理场景中展现出独特优势。该模型基于unsolth框架开发&#xff0c;默认通过7860端口提供Gradio Web UI服务&#xff0c;支…...

快速上手Qwen3-1.7B:Docker部署+LangChain调用,打造你的AI助手

快速上手Qwen3-1.7B&#xff1a;Docker部署LangChain调用&#xff0c;打造你的AI助手 1. 为什么选择Qwen3-1.7B Qwen3-1.7B是阿里巴巴开源的通义千问系列中的一款轻量级大语言模型&#xff0c;特别适合个人开发者和中小企业快速搭建AI应用。相比动辄几十GB的巨型模型&#xf…...

3大效率突破:FontTools 4.57.0如何重构字体开发流程

3大效率突破&#xff1a;FontTools 4.57.0如何重构字体开发流程 【免费下载链接】fonttools A library to manipulate font files from Python. 项目地址: https://gitcode.com/gh_mirrors/fo/fonttools 价值定位&#xff1a;字体开发者的效率倍增器 在字体开发领域&am…...

5个Windows Terminal高效使用技巧:从安装到个性化配置

5个Windows Terminal高效使用技巧&#xff1a;从安装到个性化配置 【免费下载链接】terminal The new Windows Terminal and the original Windows console host, all in the same place! 项目地址: https://gitcode.com/GitHub_Trending/term/terminal Windows Termina…...

论文 AIGC 痕迹藏不住?PaperXie 降重 + 降 AIGC 双 buff,让你的毕业论文顺利通关

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippthttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 当毕业论文撞上知网、维普的 AIGC 检测&#xff0c;不少同学都陷入了新的焦虑&#xff1a;重复率好不容易降下来&#…...

Fish Speech 1.5开源模型价值:免费商用、可私有化部署、无调用限制

Fish Speech 1.5开源模型价值&#xff1a;免费商用、可私有化部署、无调用限制 1. 为什么Fish Speech 1.5值得关注 如果你正在寻找一个既强大又免费的文本转语音解决方案&#xff0c;Fish Speech 1.5绝对值得你深入了解。这个由Fish Audio开源的新一代TTS模型&#xff0c;在技…...

从土星到太阳系:两个Three.js项目的调试手记

缘起最近用Three.js写了两个小项目&#xff1a;一个是土星粒子环&#xff0c;一个是完整的太阳系。本来只是自己玩&#xff0c;没想到调试过程还挺有意思&#xff0c;记录一下遇到的一些问题和解法。项目一&#xff1a;开普勒土星粒子环第一个想法很简单&#xff1a;做一个土星…...

5步掌握QtScrcpy按键映射:从零到精通的完整配置指南

5步掌握QtScrcpy按键映射&#xff1a;从零到精通的完整配置指南 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...

Unity Addressables 本地资源组热更新问题分析与解决方案:Prevent Updates 的正确使用

Unity Addressables 本地资源组热更新问题分析与解决方案&#xff1a;Prevent Updates 的正确使用 问题描述 在使用 Addressables 进行资源管理时&#xff0c;同时配置了本地资源组和远程资源组。首次打包运行正常。当两个资源组均有改动&#xff0c;并对远程资源组执行 Update…...

树莓派三、控制四轮小车运动(ing)

1.硬件配置树莓派3b、两个L298N、双层车架、四个麦轮、四个TT马达2.接线2.1 L298N和马达这部分除了同一侧的轮子接同一个电机驱动外&#xff0c;其余接的比较随意&#xff0c;因为是四驱&#xff0c;到时候调代码能够统一转动方向。2.2 L298N和电源两个L298N和树莓派都要共地&a…...

告别‘夜盲症’:手把手教你用MFNet和热成像数据提升自动驾驶夜间语义分割精度

夜间自动驾驶的视觉革命&#xff1a;基于MFNet与热成像的语义分割实战指南 当一辆自动驾驶汽车在暴雨夜驶过无路灯的乡间公路时&#xff0c;传统摄像头捕捉到的画面几乎是一片模糊的灰色噪点。这正是2017年MFNet论文揭示的核心问题&#xff1a;单一可见光谱传感器在低照度环境下…...

电源PFC入门:TI单相三相维也纳VIENNA整流器无桥原理图及PCB资料与PFC设计案例汇编

电源PFC入门 TI单相三相维也纳VIENNA整流器无桥 原理图PCB资料 一个PFC设计案例&#xff0c;大量的PFC相关的资料。 注意&#xff1a;设计案例无核心小板。电源设计里PFC总像个磨人的小妖精&#xff0c;尤其是做工业级大功率设备的时候。最近折腾TI的维也纳整流器方案发现&…...

Swin2SR案例实录:一张512px图片的完整增强旅程

Swin2SR案例实录&#xff1a;一张512px图片的完整增强旅程 1. 引言&#xff1a;当模糊小图遇见AI显微镜 你有没有遇到过这种情况&#xff1f;在网上找到一张特别喜欢的图片&#xff0c;想用来做壁纸或者打印出来&#xff0c;结果发现它只有512像素宽&#xff0c;放大一看全是…...

BLE跨平台抽象层设计:低功耗蓝牙中间件工程实践

1. BLE模块技术解析&#xff1a;跨平台低功耗蓝牙抽象层设计与工程实践1.1 模块定位与工程价值BLE&#xff08;Bluetooth Low Energy&#xff09;模块并非具体硬件驱动&#xff0c;而是一个跨平台、分层抽象的软件中间件&#xff0c;其核心目标是屏蔽底层蓝牙协议栈实现差异&am…...