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

MyBatis动态SQL中if、where、trim、choose、when、otherwise、foreach标签及sql标签范例

目录

一、if标签

二、where标签

三、trim标签

四、choose、when、otherwise标签

五、foreach标签

六、sql标签


一、if标签

if标签通过test属性给出判断的条件,如果条件成立,则将执行标签内的SQL语句

范例:

<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp where
    <if test="empName != null and empName != ''">
        emp_name = #{empName}
    </if>
    <if test="age != null and age != ''">
        and age = #{age}
    </if>
    <if test="gender != null and gender != ''">
        and gender = #{gender}
    </if>
</select>

二、where标签

        考虑if标签中的范例出现的一种情况:当第一个if标签条件不成立而第二个条件成立时,拼接成的SQL语句中where后面连着的是and,会造成SQL语句语法错误,而where标签可以解决这个问题

范例:

<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp
    <where>
        <if test="empName != null and empName != ''">
            emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and age = #{age}
        </if>
        <if test="gender != null and gender != ''">
            and gender = #{gender}
        </if>
    </where>
</select>

where标签只会在子标签返回任何内容的情况下才插入WHERE子句。而且,若子句的开头有
多余的and或者or,where标签也会将它们去除,但是子句末尾的and或者or不能去除

三、trim标签

trim标签用于去掉或添加标签中的内容

trim标签常用属性:

1、prefix:在trim标签中的内容的前面添加某些内容
2、prefixOverrides:在trim标签中的内容的前面去掉某些内容
3、suffix:在trim标签中的内容的后面添加某些内容
4、suffixOverrides:在trim标签中的内容的后面去掉某些内容

用trim实现where标签范例相同的功能:

<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp
    <trim prefix="where" prefixOverrides="and">
        <if test="empName != null and empName != ''">
            emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and age = #{age}
        </if>
        <if test="gender != null and gender != ''">
            and gender = #{gender}
        </if>
    </trim>
</select>

四、choose、when、otherwise标签

这三个标签是组合使用的,用于在多条件中选择一个条件,类似Java中的if...else if...else...语句

范例:

<select id="getEmpByCondition" resultType="Emp">
    select * from t_emp where gender = #{gender}
    <choose>
        <when test="empName != null and empName != ''">
            and emp_name = #{empName}
        </when>
        <when test="age != null and age != ''">
            and age = #{age}
        </when>
    </choose>
</select>

当某个when标签的条件满足时将对应的SQL语句返回,如果都不满足并且有otherwise标签
时,才会返回otherwise标签中的SQL语句

五、foreach标签

● foreach标签允许指定一个集合或数组,并且对这个集合或数组进行遍历

● foreach标签可以用的属性:

1、collection:指定需要遍历的集合或数组
2、item:当前遍历到的元素
3、index:当前遍历到的元素的序号
4、当遍历的集合是Map类型时,index表示键,item表示值
5、open:指定遍历开始前添加的字符串
6、close:指定遍历开始后添加的字符串
7、separator:指定每次遍历之间的分隔符

● collection属性值注意事项

如果遍历的是List时,属性值为list
如果遍历的是数组时,属性值为array
如果遍历的是Map时,属性值可以是map.keys()、map.values()、map.entrySet()
除此之外,还可以在映射方法的参数中使用@Param()注解自定义collection属性值

● 批量添加数据:

<insert id="addMoreEmp">
    insert into t_emp values
    <foreach collection="list" separator="," item="emp">
        (null,#{emp.empName},#{emp.age},#{emp.gender},null)
    </foreach>
</insert>

● 批量删除数据:

<delete id="deleteMoreEmp">
    delete from t_emp where emp_id in
    <foreach collection="array" item="empId" separator="," open="("
close=")">
        #{empId}
    </foreach>
</delete>

六、sql标签

用于记录一段通用的SQL语句片段,在需要用到该SQL语句片段的地方中通过include标签将该SQL语句片段插入

sql标签通过id属性唯一标识一个SQL语句片段,include标签通过refid属性指定使用某个SQL片段

范例:

<sql id="item">
    emp_id,emp_name,age,gender,dept_id
</sql>
<select id="getEmpByEmpId" resultType="Emp">
    select <include refid="item"></include>
    from t_emp
    where emp_id = #{empId}
</select>

相关文章:

  • LeetCode每日一题(990. Satisfiability of Equality Equations)
  • 关键字和内置函数
  • 2022-2028全球园艺设备行业调研及趋势分析报告
  • 【Android入门】7、多媒体:用 NotificationChannel 和 NotificationManager 实现系统通知、播放音频和视频
  • eNSP抓包看PPP协议
  • 继SpringCloudAlibaba后阿里又一神作:MySQL应用实战与性能调优
  • 数据库系统概论笔记
  • 读书笔记:《量化投资实务》
  • Dart external关键字
  • 低碳生活进行时!国产“芯”RK3568创造智慧出行新体验
  • 雷达与imu初始化:鲁棒且实时的雷达惯性初始化方法
  • 算法与诗数据结构 --- 查找 --- 线性表的查找
  • UML(用例图进阶)
  • Intel汇编-LOOP循环
  • 基于JAVA社交物联网的服务搜索系统计算机毕业设计源码+数据库+lw文档+系统+部署
  • [case10]使用RSQL实现端到端的动态查询
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Git 使用集
  • js作用域和this的理解
  • oldjun 检测网站的经验
  • OSS Web直传 (文件图片)
  • PaddlePaddle-GitHub的正确打开姿势
  • Promise面试题,控制异步流程
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • spring security oauth2 password授权模式
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于webpack 的 vue 多页架构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 微信公众号开发小记——5.python微信红包
  • 温故知新之javascript面向对象
  • 源码安装memcached和php memcache扩展
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 函数计算新功能-----支持C#函数
  • 容器镜像
  • ​卜东波研究员:高观点下的少儿计算思维
  • #Java第九次作业--输入输出流和文件操作
  • (1)bark-ml
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 版本不支持的问题
  • .net refrector
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据