高效 MyBatis SQL 写法一

news/2025/2/10 7:27:46/

高效 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 entityWHERE 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 标签,开发者可以显著提升代码的可读性和维护性,同时减少错误的发生。

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

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


http://www.ppmy.cn/news/1570796.html

相关文章

mongo命令执行js脚本的若干个示例

查询 示例1&#xff1a; echo "var versions db.version(); print(\"version is \" versions);" > 4.js mongo -u root -p pass --authenticationDatabase admin core 4.js示例2&#xff1a; echo "var versions db.version(); print(\"…

ISAAC Sim 1.1. Isaac Sim 4.2.0 环境配置

我使用的系统是ubuntu20.04&#xff0c;根据推荐使用Binary installation 1.下载和安装 1.1. Isaac Sim 参照Installation using Isaac Sim Binaries — Isaac Lab Documentation完成ISAAC SIM安装。 1.2. Isaac Lab “Isaac Lab 提供您需要的工具&#xff0c;以便您根据项…

浅谈Java和C#UDP通信

Java UDP高级用法示例 1. 多线程UDP服务器 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class MultiThreadedUDPReceiver …

Flutter List 的 every 如果回调函数抛出异常 应该如何处理

在使用 List 的 every 方法时&#xff0c;如果回调函数抛出异常&#xff0c;可以通过以下几种方式进行处理&#xff1a; 1. 在回调函数内部捕获异常 在回调函数内部使用 try-catch 语句捕获可能抛出的异常&#xff0c;并根据具体情况进行处理。这样可以避免异常直接导致 ever…

【QT】 Qt经典面试题

文章目录 1. Qt 基础1.1 Qt 的核心特性1.2 Qt 的信号与槽机制1.3 Qt 的元对象系统 2. Qt GUI 编程2.1 Qt 的窗口部件2.2 Qt 的布局管理器 3. Qt 多线程编程3.1 QThread3.2 QtConcurrent 4. Qt 网络编程4.1 QTcpSocket 和 QTcpServer4.2 QNetworkAccessManager 5. Qt 数据库编程…

使用Python开发PPT批量转图片(合并)

在日常工作中&#xff0c;我们经常需要将PowerPoint演示文稿转换为图片格式&#xff0c;特别是在需要快速预览或分享时。本文将详细介绍如何使用Python开发一个带有图形界面的PPT批量转图片工具&#xff0c;并深入探讨实现过程中遇到的问题及解决方案。 C:\pythoncode\new\conv…

Redis07 - Redis底层数据结构

Redis底层数据结构 文章目录 Redis底层数据结构一&#xff1a;对象机制详解二&#xff1a;SDS 简单动态字符串三&#xff1a;压缩列表zipList结构 四&#xff1a;跳表 一&#xff1a;对象机制详解 String类型 - 简单动态字符串SDSList类型 - 双向链表 & 压缩列表Set类型 - …

布丁扫描:手机扫描的纯净之选

在众多手机扫描软件中&#xff0c;布丁扫描凭借其纯粹的使用体验脱颖而出。它是一款功能强大且完全免费的手机端扫描工具&#xff0c;没有任何广告干扰&#xff0c;用户可以畅享纯净的使用过程。更值得一提的是&#xff0c;布丁扫描从未设置过充值入口&#xff0c;也不会在扫描…