高效 MyBatis SQL 写法一

高效 MyBatis SQL 写法一

前言

MyBatis 作为一款优秀的持久层框架,极大地简化了数据库操作。

然而,在实际开发中,XML 配置的编写仍然可能显得繁琐。

本文将分享一些 MyBatis 动态 SQL 的优质写法,帮助开发者提升效率并减少错误。

forEach 标签的使用

forEach 标签常用于循环遍历集合,生成动态 SQL

其核心属性包括:

  • item:集合中元素的别名。
  • index:集合中元素的索引。
  • collection:集合对象,必须指定。
  • open:循环开始时的符号,如 (
  • separator:元素间的分隔符,如 ,
  • close:循环结束时的符号,如 )

示例:

public List<Entity> queryById(List<String> userIds);

对应的 XML 配置:

<select id="queryById" resultMap="BaseResultMap">
    SELECT * FROM entity
    WHERE id IN
    <foreach collection="userIds" item="userId" index="index" open="(" separator="," close=")">
        #{userId}
    </foreach>
</select>

注意collection 属性的值取决于传入参数的类型。

如果传入的是 List,则值为 list;如果是数组,则为 array;如果是多个参数,则需封装为 Map

模糊查询与 concat 函数

模糊查询时,可以使用 concat 函数动态拼接 SQL 语句。

示例:

<select id="queryByName" resultMap="BaseResultMap" parameterType="Entity">
    SELECT * FROM entity
    <where>
        <if test="name != null">
            name LIKE concat('%', #{name}, '%')
        </if>
    </where>
</select>

choose 标签的多条件判断

choose 标签类似于 Java 中的 switch 语句,用于多条件判断。

示例:

<select id="getUserList_choose" resultMap="resultMap_user" parameterType="User">
    SELECT * FROM User u
    <where>
        <choose>
            <when test="username != null">
                u.username LIKE CONCAT('%', #{username}, '%')
            </when>
            <when test="sex != null">
                AND u.sex = #{sex}
            </when>
            <otherwise>
                AND u.status = 'ACTIVE'
            </otherwise>
        </choose>
    </where>
</select>

selectKey 标签的主键生成

在插入数据时,selectKey 标签可用于生成主键。

示例:

<insert id="createStudentAutoKey" parameterType="StudentEntity" keyProperty="studentId">
    <selectKey keyProperty="studentId" resultType="String" order="BEFORE">
        SELECT nextval('student')
    </selectKey>
    INSERT INTO STUDENT_TBL (student_id, student_name, student_sex, student_birthday)
    VALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday})
</insert>

if 标签的动态条件

if 标签用于动态生成 SQL 条件。

示例:

<select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="StudentEntity">
    SELECT * FROM STUDENT_TBL ST
    <where>
        <if test="studentName != null">
            ST.STUDENT_NAME LIKE CONCAT('%', #{studentName}, '%')
        </if>
        <if test="studentSex != null">
            AND ST.STUDENT_SEX = #{studentSex}
        </if>
    </where>
</select>

总结

通过合理使用 MyBatis 的动态 SQL 标签,开发者可以显著提升代码的可读性和维护性,同时减少错误的发生。

本文介绍的几种常见用法,涵盖了从条件判断到批量操作的多种场景,希望能为你的开发工作带来帮助。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】

目录 概述【适合0基础看的简要描述】&#xff1a; 上述加粗下划线的内容提取版&#xff1a; 从上述概述中提取的核心知识点&#xff0c;需背诵&#xff1a; 整数【包含整数&#xff0c;负整数和0】的原码反码补码相互转换的过程图示&#xff1a; 过程详细刨析&#xff1a;…

如何安装PHP依赖库 更新2025.2.3

要在PHP项目中安装依赖&#xff0c;首先需要确保你的系统已经安装了Composer。Composer是PHP的依赖管理工具&#xff0c;它允许你声明项目所需的库&#xff0c;并管理它们。以下是如何安装Composer和在PHP项目中安装依赖的步骤&#xff1a; 一. 安装Composer 对于Windows用户…

【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

硬件电路基础

目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向&#xff1a; 正极->负极,正电荷定向移动方向为电流方向&#xff0c;与电子定向移动方向相反。 2.电荷&#xff08;这里表示负电荷&#xff09;运动方向&#xff1a; 与电流方向相反 1.4 测电压的时候 2. 地线…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

【数据结构】树哈希

目录 一、树的同构1. 定义2. 具体理解(1) 结点对应(2) 孩子相同(3) 递归性质 3. 示例 二、树哈希1.定义2.哈希过程&#xff08;1&#xff09;叶节点哈希&#xff08;2&#xff09;非叶节点哈希&#xff08;3&#xff09;组合哈希值 3.性质&#xff08;1&#xff09; 唯一性 \re…

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…

Mysql:数据库

Mysql 一、数据库概念&#xff1f;二、MySQL架构三、SQL语句分类四、数据库操作4.1 数据库创建4.2 数据库字符集和校验规则4.3 数据库修改4.4 数据库删除4.4 数据库备份和恢复其他 五、表操作5.1 创建表5.2 修改表5.3 删除表 六、表的增删改查6.1 Create(创建):数据新增1&#…

ChatGPT怎么回事?

纯属发现&#xff0c;调侃一下~ 这段时间deepseek不是特别火吗&#xff0c;尤其是它的推理功能&#xff0c;突发奇想&#xff0c;想用deepseek回答一些问题&#xff0c;回答一个问题之后就回复服务器繁忙&#xff08;估计还在被攻击吧~_~&#xff09; 然后就转向了GPT&#xf…

Vue 中如何嵌入可浮动的第三方网页窗口(附Demo)

目录 前言1. 思路Demo2. 实战Demo 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. 思路Demo 以下Demo提供思路参考&#xff0c;需要结合实际自身应用代码 下述URL的链接使用百度替代&#xff01; 方式 1…

【Linux】23.进程间通信(2)

文章目录 3. 进程间通信3.1 进程间通信介绍3.1.1 进程间通信目的3.1.2 进程间通信发展 3.2 什么是进程间通信3.3 管道3.4 匿名管道pipe()3.4.1 站在文件描述符角度-深度理解管道3.4.2 站在内核角度-管道本质3.4.3 用fork来共享管道原理3.4.5 管道相关知识3.4.6 代码一&#xff…

AI大模型开发原理篇-8:Transformer模型

近几年人工智能之所以能迅猛发展&#xff0c;主要是靠2个核心思想&#xff1a;注意力机制Attention Mechanism 和 Transformer模型。本次来浅谈下Transformer模型。 重要性 Transformer模型在自然语言处理领域具有极其重要的地位&#xff0c;为NLP带来了革命性的突破‌。可以…

html2canvas绘制页面并生成图像 下载

1. 简介 html2canvas是一个开源的JavaScript库&#xff0c;它允许开发者在用户的浏览器中直接将HTML元素渲染为画布&#xff08;Canvas&#xff09;&#xff0c;并生成图像。以下是对html2canvas的详细介绍&#xff1a; 2. 主要功能 html2canvas的主要功能是将网页中的HTML元…

基于RK3588/RK3576+MCU STM32+AI的储能电站电池簇管理系统设计与实现

伴随近年来新型储能技术的高质量规模化发展&#xff0c;储能电站作为新能源领域的重要载体&#xff0c; 旨在配合逐步迈进智能电网时代&#xff0c;满足电力系统能源结构与分布的创新升级&#xff0c;给予相应规模 电池管理系统的设计与实现以新的挑战。同时&#xff0c;电子系…

机器学习-线性回归(参数估计之结构风险最小化)

前面我们已经了解过关于机器学习中的结构风险最小化准则&#xff0c;包括L1 正则化&#xff08;Lasso&#xff09;、L2 正则化&#xff08;Ridge&#xff09;、Elastic Net&#xff0c;现在我们结合线性回归的场景&#xff0c;来了解一下线性回归的结构风险最小化&#xff0c;通…

【数据分析】豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)

豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…

备考蓝桥杯8——EEPROM读写

目录 看手册时间 关于IIC 附录 IIC代码 看手册时间 我们主要是搞编程&#xff0c;所以&#xff0c;我们一般会非常关心我们如何对EEPROM进行编程。特别的&#xff0c;EEPROM要做读写&#xff0c;首先是看它的IIC设备地址。 有趣的是——我们的EEPROM的IIC地址是根据地址进行…

深入浅出:旋转变位编码(RoPE)在现代大语言模型中的应用

在现代大语言模型&#xff08;LLMs&#xff09;中&#xff0c;位置编码是一个至关重要的组件。无论是 Meta 的 LLaMA 还是 Google 的 PaLM&#xff0c;这些模型都依赖于位置编码来捕捉序列中元素的顺序信息。而旋转变位编码&#xff08;RoPE&#xff09; 作为一种创新的位置编码…

“message“: “类型注释只能在 TypeScript 文件中使用

VScode中使用CtrlShiftP打开搜素框&#xff0c;输入Preferences: Open User Settings或Preferences: Open Workspace Settings。 找到settings.json文件 "typescript.validate.enable": false

VSCode中使用EmmyLua插件对Unity的tolua断点调试

一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示&#xff1a; 三.启动调试模式&#xff0c;并选择附加的进程