MyBatis的动态SQL

MyBatis 中动态 SQL 标签 在 MyBatis 中,动态 SQL 是构建灵活且高效的 SQL 语句的重要工具。通过使用动态 SQL 标签,开发者可以根据不同的条件动态生成 SQL 语句的各个部分,从而避免手动拼接字符串带来的复杂性和潜在的错误。 阅读详情

MyBatis的动态SQL

1-if标签
1-在查询的时候-标签1
  1. 常用于update或者insert中选择性更新或者插入某个字段的值

  2. 案例:高级查询:只输入用户名,进行模糊查询,只输入邮箱,进行全匹配查询。两者都输入,进行匹配查询

  3. <select id="selectByUserWhere" resultType="sysUser">
           select *
           from sys_user
           <where>
               <if test="userName !=null and userName != ''">
                   and user_name like concat('%',#{userName},'%')
               </if>
               <if test="userEmail != null and userEmail != '' ">
                   and user_email = #{userEmail}
            </if>
           </where>
    
  4. 判断条件 property != null 或者 property ==null 适合任何类型的字段,用于判断属性值是否为空。 判断条件 property !=‘’ 或者property == ‘’ 只适合String类型的字段

  5. 注意1=1 这个条件:考虑如果两个条件都不满足,则sql语句是不对的

2-在update中的if
  1. 选择性更新某个字段,通过if实现动态列更新

  2. 选择性更新命名规范:方法名会以Selective作为后缀

  3. update sys_user
    set
    <if test="userName != null and userName != '' ">
    user_name = #{userName},
    </if>
    <if test="userPassword != null and userPassword !='' ">
    	user_password = #{userPassword},
    </if>
    id = #{id}
    where id = #{id}
    
  4. ==注意点:==第一点是每个if元素里面的SQL语句后面的逗号,第二点就是where关键字前面的id=#{id}

  5. 关于第二点:当全部的查询条件都是null或者空,如果有id=#{id}则为:update sys_user set id =#{id} where id = #{id},没有的话,sql语句则不完整。如果条件只有一个成立,没有id=#{id},sql语句也是不完整的

3-insert中使用if
  1. 目标:插入数据库中插入某一字段时,若用户输入为空,则使用数据库中的,否则使用用户输入的数据

  2. insert into sys_user(
    	user_name, user_password,
    	<if text= " userEmail !=null and userEmail != '' ">
    		user_email
    	</if>
    )values(
    	#{userName},#{userPassword},
    	<if test="userEmail != null and userEmail != '' ">
    		#{userEmail}
    	</if>
    )
    

在inser中使用时要注意,若在列的部分增加if条件,则values的部分也要增加相同的if条件,必须保证上下可以相互对应。

4-choose用法

if标签提供了基本的条件判断,但是无法实现if…else,的逻辑,要想实现这样的逻辑,就是用到choose 。。。when。。。otherwise标签

  1. 需求:当id有属性值的时候,优先使用id,当id无的时候判断用户名是否有值,都没有的时候sql无结果

  2. select id,userName,userPassword,userEmail,userInfo
    from sys_user
    where 1=1
    <choose>
    	<when test =" id !=null">
        	and id = #{id}
        </when>1
        <when test="userName != null and userName != ' '">
        	and user_name = #{userName}
        </when>
        <otherwise>
        	and 1=2
        </otherwise>
    </choose>
    
  3. 当且仅当 when全部为false 的时候,执行 otherwise 标签内的语句,所以 在使用 choose标签的时候,要思路清晰,否则会出现意料之外的事情

  4. 在以上查询中,如果没有otherwise 这个限制条件,所有的用户都会被查询出来,因为我们在对应的接口方法中使用了sysuser作为返回值,所以当实际查询结果是多个时就会报错

5-where 标签对比 标签1

where 和 set和 trim 这三个标签解决了类似的问题,并且where和set都属于 trim的一种具体用法。

  1. where标签的作用:如果该标签包含的元素中有返回值,就插入一个where ;如果where后面的字符串是以AND和OR开头的,就将他们剔除

  2. select id,userName,userPassword,userEmail
    from sys_user
    <where>
    	<if test=" userName != null and userName != ''">
        	and user_name like concat('%',#{userName},'%')
        </if>
        <if test=" userEmail != null and userEmail != ''">
        	and user_email = #{userEmail}
        </if>
    </where>
    
  3. where 标签和if标签同时使用的情况下,可以让sql更加的简洁,不会有where 1=1 这样的条件

6-set 用法对比2
  1. set标签的作用:如果给标签包含的元素中有返回值,就插入一个set,如果set后面字符串是以逗号结尾的,就将这个逗号去掉

  2. update sys_user
    <set>
    	<if test = "userName != null and userName != '' ">
        	user_name = #{userName},
        </if>
        <if test="userPassword != null and userPassword != ''  ">
        	user_password = #{userPassword},
        </if>
        where id = #{id}
    </set>
    
  3. 注意:在set标签用法中,sql后面的逗号没有问题了,但是如果set元素中没有内容,照样会出现sql错误,所以为了避免错误产生,类似id=#{id} 这样必然存在的赋值依然有保留的必要

7-trim用法
  1. where和set标签的功能都可以用trim标签实现,并且在底层就是通过TrimSqlNode实现的

  2. trim实现where标签和set标签的功能

  3. <trim prefix="where" prefixOverrides="and |or ">
    	....
    </trim>
    -- 这里的and 和or 后面的空格不能省去,避免匹配到andes orders等单词
    <trim prefix = "set" suffixOverrides = ",">
    	....
    </trim>
    
    
    
  4. trim 属性值

    1. prefix:当trim元素内包含内容时,会给内容增加prefix指定的前缀
    2. prefixOverrides:当trim元素内包含内容时,会把内容中匹配的前缀字符去掉
    3. suffix:当trim元素内包含内容的时候,会给内容增加suffix指定的后缀
    4. suffixOverrides: 当trim元素内包含内容时,会把内容中匹配的后缀字符串去掉
8-foreach实现in集合
  1. 需求:如何根据用户id集合查询出所有符合条件的用户

  2. select id, userPassword, userEmail
    from sys_user
    where id in 
    <foreach collection = "list" open="(" close=")" separator ="," item="id" index="i">
    	#{id}
    </foreach>
    
  3. 注意:当有多个参数的时候,要在dao接口的方法参数前加上@param注解给每个参数指定一个名字,否则的话,在sql中使用参数就会不方便,特别在foreach中

9-foreach实现批量插入
      <insert id="insertList">
        insert into sys_user(userName,userPassword,userEmail)
        values
        <foreach collection="list" item="user" separator=",">
            ( #{userName},#{userPassword},#{userEmail} )
        </foreach>
    </insert>
  1. 注意:通过item指定了循环变量名之后,在引用值的时候使用是“属性.属性” 的方式,如 user.userName
10-foreach实现动态update
  1. 参数类型是map时,foreach如何实现动态update

  2. 当参数时map类型的时候,foreach标签的index属性值对应的不是索引值,而是map中的key

    <update id="updateByMap">
        update sys_user set
        <foreach collection="_parameter" item="val" index="key" separator=",">
            ${key} = #{key}
        </foreach>
        where id= #{id}
    </update>
  1. 注意:这里的key作为列名,对应的值作为该列的值,通过foreach将需要更新的字段拼接在sql语句中

批量操作

批量增加

 <insert id="insertBatch"  parameterType="list">
    insert into zx_client
    (
        ,phone,real_name,age,sex,id_no,id_addr
    ) values 
    <foreach collection="list"  item="item" open="(" separator="," close=")">
    (
        ,#{phone},#{realName},#{age},#{sex},#{idNo},#{idAddr}
     )
    </foreach>  
</insert>  

在这里插入图片描述

批量更新

<update id="updateOrderItem"  parameterType="java.util.List">
  <foreach collection="list" item="item"  separator=";">
    update order_item
    <set>
      <if test="item.orderId != null">
        order_id = #{item.orderId},
      </if>
      <if test="item.productId != null">
        product_id = #{item.productId},
      </if>
      <if test="item.count != null">
        count = #{item.count}
      </if>
    </set>
    where id = #{item.id}
  </foreach>
</update>

批量查询

   List<MRailwaystation> listRailwayStationlist( List<String> codeList);
       <select id="listRailwayStationlist" resultType="com.ceic.foundation.op.common.model.MRailwaystation">
        select * from m_railwaystation where railwaystation_id in
        <foreach collection="@Param没有加这个注解就写 list" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
MyBatis 动态 SQL MyBatis动态SQL是在XML映射文件中通过特定标签实现SQL语句动态拼接的技术,解决了传统JDBC手动拼接SQL的繁琐问题。文章介绍了MyBatis的9种动态SQL标签:if(条件判断)、where+if(查询条件处理)、set(更新操作)、choose/when/otherwise(多条件分支)、trim(格式化处理)等,并详细说明了各标签的语法和使用场景。动态SQL通过OGNL表达式实现参数值计算和SQL拼接,既提高了开发效率,又需注意性能优化和SQL注入防范。文中提供了多个典型示例,如条件查询、 阅读详情

相关推荐

树莓派介绍与可安装的操作系统

树莓派是一款由英国树莓派基金会开发的信用卡大小的微型计算机。处理器(CPU)内存(RAM)图形处理器(GPU)USB 接口网络接口(以太网和 Wi-Fi)视频输出(HDMI)音频输出用户只需添加电源、存储卡、显示器和输入设备(键盘、鼠标),就可以将其当作一台功能齐全的电脑使用。主要特点:低成本:价格亲民,适合教育和个人项目。小巧便携:体积小,便于携带和部署。功能强大:支持多种编程语言和操作系统,功能不逊于传统电脑。树莓派从最初的教育工具发展成为功能强大的多用途平台。最新的树莓派 5。

像风一样自由的博客 2196

MyBatis if判断条件为等于的问题

MyBatis if判断条件为等于的问题 在用MyBatis操作数据库的时候相信很多人都用到,当在判断null, 大于,大于等于,小于,小于等于,不等于时估计很多都用到,比较容易实现了,这里就省略了,但唯独判断条件为等于时估计蛮多人遇到坑了, 俺在这个问题上坑了差不多一天,于是把这个实验总结并简要记录一下; 当MyBatis 判断条件为等于的时候,常量需要加 .toString() 来转换,这种方...

weixin_41725862的博客 3860

基于STM32的宠物智能照护嵌入式系统设计

嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

weixin_29155599的博客 293

MyBatis(1)

MyBatis-1入门1.创建数据库2.创建spring boot项目1.添加依赖2.创建持久化对象(pojo)3.写xml文件欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaT...

weixin_42542092的博客 211

伪傻瓜式安装sql server2008【附带安装包】

安装各式各样的软件无疑是学习过程中…较…为烦躁的一部分 木有醋 但还是开始吧 为什么这是伪呢? 因为刚开始天真无邪的我真的是傻瓜式安装(迷之自信),结果就B了(打开配置管理器的瞬间….一片空白) BaiduCloud分享 红领巾在何方?? Link链接:https://pan.baidu.com/s/1NZCxP0Y27dBPrgHoRWLDyQ...

EuniBoom的博客 6万+

【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建

Databricks 已经成为了数据科学的必备工具,今时今日你已经很难抛开它来谈大数据,它常用于做复杂的ETL中的T, 数据分析,数据挖掘等,特别适用于做数据建模,机器学习等。那么顺应时代,现在也来看看这个工具的内容。首先要有一个环境,基于Azure 的Databricks简称ADB。托管在Azure 上的Databricks已经被Azure进行了很大的优化, 在搭建时只需要简单的几步即可拥有一个环境,不过要提醒一句ADB的集群并不便宜,用完马上删掉或停止, 否则一晚过百美金就会烧掉。

MVP黄钊吉(發糞塗牆) 2298

mybatis中==的用法

1.!= 的用法 <if test="xxx != null and xxx !=''"> 2.== 的用法(相较于!=,仅需将双引号和单引号的位置换一下即可) <if test='xxx == "1"'> 注:下面的用法是不行的 <if test="xxx == '1'"> 3.== 的用法的另一种(使用toString) <if test="xxx == '1'.toString()"> ...

xie__jin__cheng的博客 3445

从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南

本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。

weixin_29090089的博客 611

mybatis

mybatis写update时,正常是set了值才会进行update操作,我们一般是这样写: SAMPLE_BATCH_NO =#{sampleBatchNo,jdbcType=VARCHAR}, 1、 String类型是符合的,但是如果是Integer类型的话,mybatis会将i==0的值也认定为空字符串。 所以如果是Integer类型只需要判断!= null即可 2、如果String类型...

柳明哲的博客 537

基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真

新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。

xiaoheshang_123的博客 420

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-L !!! 最新的发文热点

Vision Clue Merge模块在Mamba - YOLO模型中同样重要,主要负责在模型的下采样过程中处理特征图,为后续的特征融合和目标检测任务提供更有效的信息。

Limiiiing的博客 472

MyBatis中的==

mybatis中的==

qq_51972248的博客 1546

【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】

GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。

CodingCos的博客 2116

【MyBatis】动态SQL

在前一篇中,我们已经讲解了Mybatis的基本使用,那么本篇我们就进一步来了解Mybatis的功能。本篇我们主要讲的是Mybatis中的动态SQL,在前面我们的学习中,我们编写的SQL语句基本都是固定的,每个参数都需要传递,而通过动态SQL,它能根据我们所给的参数,动态地选择参数,不需要每个都传递。

zhyhgx的博客 2203

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Mybatis之动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQ...

JustinNeil的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

mybatis强大的动态SQL

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。:抽取 SQL 语句标签。:引入 SQL 片段标签。抽取的 SQL 语句三、多条件组合查询之<where-if>我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。:条件标签。如果有动态条件,则使用该标签代替 where 关键字。:条件判断标签。查询条件拼接。

2501_90401192的博客 1636

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Mybatis-动态SQL

在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间没有传递,那么这两个参数的值就是null。此时,执行的SQL语句为:这个查询结果是不正确的。正确的做法应该是:传递了参数,再组装这个查询条件;如果没有传递参数,就不应该组装这个查询条件。

actavy的博客 3027

MyBatis 动态SQL详解

注意,``失败后, `` 关键字只会去掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即注意,`` 只会去掉`` 语句中的最开始的and关键字。在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。这个标签和是天仙配,是共生的,include用于引用sql标签定义的常量。

Coisini__S的博客 1268

MyBatis 实现动态 SQL

MyBatis 中的动态 SQL 就是SQL语句可以根据不同的情况情况来拼接不同的sql。 本文会介绍 xml 和 注解 两种方式的动态SQL实现方式。

2302_76339343的博客 2375

Mybatis动态SQL

Mybatis 动态Sql

心流时间的博客 1247

MyBatis 之 动态 SQL

动态 SQL

lfm1010123的博客 2133

Mybatis的动态SQL

Test public void insertMoreByList(){ User user1 = new User("a1","男","北京");

m0_73971785的博客 1274
上一篇: 关于前后端时间(LocalDateTime)对接问题
下一篇: mybatis Invalid bound statement (not found): com.gtinfo.propertyFee.mapper.ButlerScoreMapper.xxx
一个大泥球
博客等级 码龄9年 41粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值