详细介绍:MyBatis动态sql

news/2025/10/20 12:45:29/文章来源:https://www.cnblogs.com/tlnshuju/p/19152384

详细介绍:MyBatis动态sql

2025-10-20 12:41  tlnshuju  阅读(0)  评论(0)    收藏  举报

一、动态Sql

通过MyBatis提供的各种标签方法实现动态拼接Sql。

这些标签类似于JSTL标签,可以写控制语句动态的拼接Sql

二、if标签、where标签

使用了 <where>标签自动处理 AND 前缀,<where>​只处理第一个 AND​(如果存在),后续的 AND不会受影响。

如:WHERE name LIKE '%zz%' AND age = 23 AND gender = '女'

<where>会去掉第一个 AND(AND name LIKE...→ name LIKE...),后续的 AND保留。

通过 <if>标签实现条件判断:
当 name不为空时,添加模糊查询条件
当 age不为空时,添加精确匹配条件
当 gender不为空时,添加精确匹配条件

例:


测试类
@Test
public void testselectByCondition() throws IOException {
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    Student stu = new Student();
    stu.setName("王");
    stu.setGender("女");
    List list = sqlSession.selectList("student.selectByCondition", stu);
    for (Student student : list) {
        System.out.println(student);
    }
}

三、set标签

在更新数据有些时候希望User里面只有属性值有数据的才去做更新操作,属性没有数据的时候不做任何操作还是原来的值。

update user set name=?,age=?,gender=? where id=?;

在根据条件拼接sql时候有一个问题,如果想统一处理,最后一个“,”处理起来麻烦。

<set>标签用于动态生成 SET子句,并​自动去除末尾多余的逗号(,)


    UPDATE student
        
            
                name=#{name},
            
            
                age=#{age},
            
            
                gender=#{gender},
            
        
    WHERE id=#{id}

测试类
@Test
public void testUpdateCondition() {
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    Student student = new Student();
    student.setId(1);
    student.setName("小李1");
    student.setAge(25);
    //student.setGender("女");
    int count = sqlSession.update("student.updateCondition", student);
    System.out.println(count);
    sqlSession.commit();
}

四、foreach标签

处理数组或者集合,MyBatis使用foreach标签解析。

做一个批量删除的操作,参数可以是集合或是数组的形式传递过来:int[] idArray = {1,2,3,4};、List idList;


    DELETE FROM student
    WHERE id IN
        
            #{id}
        

测试类
@Test
public void testDeleteAllByArray() {
    int[] array = {8,9,11};
    SqlSession sqlSession = MyBatisUtil.getSqlSession();;
    int count = sqlSession.delete("student.deleteAllByArray", array);
    System.out.println("count: " + count);
    sqlSession.commit();
    sqlSession.close();
}

collection="array"​​:表示参数是一个​​数组​​(如 int[]或 String[])。
​​open="("和 close=")"​​:生成 IN语句的括号 ( )。
​​separator=","​​:用逗号分隔多个 ID。
​​item="id"​​:遍历时的临时变量名,在 #{id}中使用。

collection="list"​:表示参数是一个 ​List​(如 List<Integer>或 List<String>)。

​​open="("和 close=")"​​:生成 IN语句的括号 ( )。
​​separator=","​​:用逗号分隔多个 ID。
​​item="id"​​:遍历时的临时变量名,在 #{id}中使用。


    DELETE FROM student
    WHERE id IN
           
               #{id}
           

测试类
@Test
public void testDeleteAllByList() {
    List list = new ArrayList<>();
    list.add(4);
    list.add(6);
    SqlSession sqlSession = MyBatisUtil.getSqlSession();;
    int count = sqlSession.delete("student.deleteAllByList", list);
    System.out.println("count: " + count);
    sqlSession.commit();
    sqlSession.close();
}

五、choose、when、otherwise

if----else if----else if ----else

 ​<choose>、<when>、<otherwise>​ 标签实现​多条件分支选择​,只会执行第一个满足条件的 <when>分支​​,后续条件即使成立也会被忽略。

例如:

如果用户填写了名字,这个搜索就按照名字来搜索,你即使填写了别的条件也不去拼接,

如果没有填写名字,填写了年龄,就按照年龄来搜索,

如果名字和年龄都没有填写,但是填写了性别就按照性别来查找

name、age、gender搜索时候只能按照其中一个来搜索,但是优先级name>age>gender

执行逻辑​​

1.​​按顺序检查 <when>条件​​
如果 name非空,生成 name LIKE '%值%',
​​忽略后续条件​​
如果 name为空但 age非空,生成 age=值,
​​忽略后续条件​​
如果 name和 age都为空但 gender非空,生成 gender=值。

​​2.所有条件都不满足​​:<otherwise>为空,最终 SQL 可能变成 WHERE后无内容(需注意语法错误)


@Test
public void testSelectByCondition1() {
    Student student = new Student();
    //student.setName("王");
    student.setAge(23);
    student.setGender("女");
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    List list = sqlSession.selectList("student.selectByCondition2", student);
    for (Student s : list) {
        System.out.println(s);
    }
}

六、trim

MyBatis 中的<trim>标签是一个特殊的动态 SQL 元素,它用于在动态生成 SQL 语句时自动添加或删除前后缀,以及在多个元素之间添加分隔符。这在构建包含多个可选部分的 SQL 语句时非常有用,例如在 INSERT、UPDATE 或 WHERE 子句中。

<trim prefix="" prefixOverrides="" suffix="" suffixOverrides="" ></trim>

<trim>标签提供了以下几个属性:

  • prefix:在生成的 SQL 中添加的前缀。
  • prefixOverrides:用于删除前缀中的特定字符。
  • suffix:在生成的 SQL 中添加的后缀。
  • suffixOverrides:用于删除后缀中的特定字符。与 prefixOverrides 类似,但用于删除尾随的字符。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计PySpark+Hadoop+Hive+LSTM模型美团大众点评分析+评分预测 美食推荐环境(源码+论文+PPT+讲解视频)

计算机毕业设计PySpark+Hadoop+Hive+LSTM模型美团大众点评分析+评分预测 美食推荐环境(源码+论文+PPT+讲解视频)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

对话智能体泛化研究在线挑战启动

某中心推出DialoGLUE对话AI挑战赛,旨在推动任务型对话系统泛化能力研究。该挑战提供标准化数据集和基准模型,涵盖意图识别、槽位填充等四大任务,支持全数据与少样本两种评估模式。某中心启动在线挑战赛推动对话智能…

2025.10.20

t1 Baekjoon 21527 给定 \(n\times n\) 矩阵 \(a\),对于 \((i,j)\) 求 \((1,1)\) 到 \((n,n)\) 最短路径上与 \(a_{i,j}\) 相同数的个数的最大值。 唐氏症题。 每种 \(a\) 单独提出来,\(f_{i,j}\) 为 \((i,j)\) 的答…

Unable to register MBean [SftpPool

org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [SftpPool [maxTotal=8, blockWhenExhausted=true, maxWaitMillis=-1, lifo=true, fairness=false, testOnCreate=false, …

利用Python写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。

def lens5():while True:msg = input(请选择你想输入的数字类型,输入对应序号即可>>>1.字符串 2.列表 3.元组:)if msg.isdecimal():if int(msg) == 1:s = input(请开始的你的字符串输入:)print(len(s) > 5…

请求

请求HTTP请求方法中GET和POST的主要区别。 (1)参数位置:GET 请求的参数附加在 URL 后面,POST 请求的参数包含在请求体中。 (2)长度限制:GET 请求受 URL 长度限制,POST 请求没有明确的长度限制。 (3)安全性:…

sp681网卡打驱动后的状态--默认是链路是down

[root@localhost home]# ll总用量 1240-rw-r--r-- 1 root root 119260 10月 20 12:21 NIC-Hi1822-KylinV10SP3-2403-hinic3-17.7.7.1-aarch64.rpm-rw-r--r-- 1 root root 952296 10月 20 12:21 NIC-Hi1822-KylinV10SP3…

麒麟和win10双系统出现时间差异的问题

麒麟和win10双系统出现时间差异的问题win10安装openkylin双系统,进麒麟系统后再进win10,时间会出现8小时的误差,最简单的解决办法是在麒麟系统执行如下命令就可以了sudo timedatectl set-local-rtc 1

dlc — Docker Log Cleaner(支持名称、ID前缀、交互序号清理,模糊匹配交互确认)

一键安装脚本:curl -L -o /usr/local/bin/dlc https://files-cdn.cnblogs.com/files/nihaorz/dlc.sh && chmod +x /usr/local/bin/dlc#!/bin/bash stty erase ^H 2>/dev/null # dlc — Docker Log Cleaner…

软件研发项目管理提效方案|流程驱动 数据赋能:打造上下游信息透明的研发项目管理新模式

在软件研发中,流程不清、协作割裂往往是效率的最大障碍。本文探讨了一种全新的产研管理模式:以流程为核心驱动跨部门协作,通过数字化平台打通产品、研发、测试与运维,实现从需求到交付的全流程可视化与高效协同。行…

第二周记

第二周 前言: 10.20 今天体测跑了一公里,拿下了三分三十的成绩,有时感觉自己当时走体育会不会比现在混得好() 学习笔记: 一些杂项 很久以前就想写一下这个快速平方根取倒数算法了,这个好像还很有历史“渊源”来…

【分享】一篇文章让你学通JFinal的各种参数解析方式

【分享】一篇文章让你学通JFinal的各种参数解析方式JFinal新版本已经支持直接解析contentType=application/json请求的rawdata数据了。 默认功能是关闭的。JFinal新版本已经支持直接解析contentType=application/json请…

2025年10月深度seek排名优化服务排行榜:十大服务商综合对比与选择指南

一、引言 在人工智能技术快速发展的今天,生成式引擎优化(GEO)已成为企业数字化转型的重要战略。特别是对于需要通过DeepSeek等AI平台提升品牌可见度的企业主、市场营销负责人和品牌管理者而言,选择专业的GEO优化服…

NetSuite-WMS瀚钰通仓库对接使用说明

PO收货每次供应商到货CSV上传生成一个自定义的HYT IR记录,点击按钮调用API发送给WMS,WMS入库。到货单的收货要一单一单对应好,否则会有问题。

2025年10月deepseek排名优化服务推荐排行榜:十家服务商综合评测与选择指南

一、引言 在人工智能技术快速发展的今天,deepseek排名优化已成为企业提升品牌曝光、获取精准流量的重要手段。对于创业者、市场营销负责人及企业管理者而言,选择专业的优化服务不仅能有效控制推广成本,更能保障营销…

案例分析:MySQL 并行复制竟然比单线程慢?

同一个 binlog,没想到多线程重放竟比单线程慢了四倍多!最近碰到一个 case,发现在特定场景下,并行复制竟然比单线程复制要慢。 现象 从某个时间点开始,从库的复制延迟持续增加,且没有下降的趋势。 数据库版本:8.…

克服keepalived的主备服务器都持有VIP——出现脑裂现象

克服keepalived的主备服务器都持有VIP——出现脑裂现象pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

Codeforces Round 1060 (Div. 2) A - C2

A - C2打的依托还能涨 Rating 也是神人了 A 直接依照题意做,求个前缀和后对每个 \(s _ i = 1\) 判断前面 \(k - 1\) 个数的和是否大于 \(0\),都是 \(0\) 就保护。 B 我们一定要让 \(a _ i(i \bmod 2 = 0)\) 越大越好…

2025年10月深度关键词排名优化服务推荐排行榜:十大服务商综合对比与评测分析

一、引言 在人工智能技术快速发展的背景下,深度关键词排名优化已成为企业提升在线可见性、获取精准流量、实现数字化转型的重要策略。对于创业者、市场营销负责人以及企业管理者而言,选择专业的优化服务不仅能有效控…

2025年10月DeepSeek关键词排名优化服务排行榜深度评测与对比分析

一、引言 在人工智能技术快速发展的今天,DeepSeek作为重要的AI搜索平台,其关键词排名优化已成为企业数字化转型的核心需求。对于需要进行品牌建设、获取精准流量的创业者、市场营销负责人及企业管理者而言,选择专业…