【Mybatis】动态语句 第三期

news2024/11/17 13:18:42

文章目录

  • *一、if和where标签
  • 二、set标签
  • 三、trim标签
  • 四、choose/when/otherwise标签
  • *五、foreach标签 ( 批量操作
  • 六、sql片段


*一、if和where标签

如果传入属性,就判断相等。不传入不加对应的条件。

if 判断传入的参数,最终是否添加语句
test 属性 : 内部做比较运算,最终TRUE将标签内的sql语句进行拼接,FALSE不拼接
判断语句:“key 比较运算符 值 and | or key 比较运算符 值”
大于和小于 不推荐直接写符号-> 使用 大于(>) &gt; , 小于(<) &lt;

where 标签 作用:
1. 自动添加where 关键字 , where内部有任何一个if 满足,就自动添加 where关键字,不满足就会去掉where。
2. 自动去掉多余的 and 和 or 关键字

  • 接口
    /**
     * 根据名字或薪资查询 员工表
     * @param name
     * @param salary
     * @return
     */
    List<Employee> query(@Param("name") String name, @Param("salary") Double salary);
  • xml
    • where标签会自动去掉“标签体内前面多余的and/or”
<mapper namespace="com.wake.mapper.EmployeeMapper">
    <select id="query" resultType="employee">
        select * from t_emp
        <where>
            <if test="name != null">
                emp_name = #{name}
            </if>
            <if test="salary != null and salary &gt; 100">
                and emp_salary = #{salary}
            </if>
        </where>
    </select>
</mapper>
  • 测试
    @Test
    public void testDynamicCondition(){
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> query = employeeMapper.query(null, 147.60000);
        System.out.println(query);
    }

1

二、set标签

set 标签作用 :

  1. 自动去掉多余的 逗号(,)
  2. 自动添加set关键字
  • 接口
    /**
     * 根据员工ID更新员工数据,传入的name和salary不为空才可以更新
     * @param employee
     * @return
     */
    int update(Employee employee);
  • xml
    <update id="update">
        update t_emp
        <set>
            <if test="empName != null">
                emp_name = #{empName},
            </if>
            <if test="empSalary != null">
                emp_salary = #{empSalary}
            </if>
        </set>
        where emp_id = #{empId};
    </update>
  • 测试
    @Test
    public void testDynamicCondition(){
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> query = employeeMapper.query(null, 147.60000);
        Employee employee = query.get(0);
        employee.setEmpName("艾伦");
        employee.setEmpSalary(999.99);
        employeeMapper.update(employee);
    }

1

三、trim标签

使用trim标签控制条件部分两端是否包含某些字符

  • prefix属性:指定要动态添加的前缀
  • suffix属性:指定要动态添加的后缀
  • prefixOverrides属性:指定要动态去掉的前缀,使用“|”分隔有可能的多个值
  • suffixOverrides属性:指定要动态去掉的后缀,使用“|”分隔有可能的多个值

四、choose/when/otherwise标签

对比:
前面的if和where 是可以两个条件都满足 都执行。
choose…是不能都满足,when只满足第一个或是第二个,或都不满足执行otherwise。

在多个分支条件中,仅执行一个。

<!-- List<Employee> selectEmployeeByConditionByChoose(Employee employee) -->
<select id="selectEmployeeByConditionByChoose" resultType="com.wake.mybatis.entity.Employee">
    select emp_id,emp_name,emp_salary from t_emp
    where
    <choose>
        <when test="empName != null">emp_name=#{empName}</when>
        <when test="empSalary &lt; 3000">emp_salary &lt; 3000</when>
        <otherwise>1=1</otherwise>
    </choose>
    
    <!--
     第一种情况:第一个when满足条件 where emp_name=?
     第二种情况:第二个when满足条件 where emp_salary < 3000
     第三种情况:两个when都不满足 where 1=1 执行了otherwise
     -->
</select>

*五、foreach标签 ( 批量操作

  • Mapper 接口
    /**
     * 根据id批量查询
     */
    List<Employee> queryBatch(@Param("ids") List<Integer> ids);

    /**
     * 根据ID批量删除
     * @param ids
     * @return
     */
    int deleteBatch(@Param("ids") List<Integer> ids);

    /**
     * 批量插入对象信息
     * @param employeeList
     * @return
     */
    int insertBatch(@Param("list") List<Employee> employeeList);

    /**
     * 根据ID批量修改对象信息
     * @param employeeList
     * @return
     */
    int updateBatch(@Param("list") List<Employee> employeeList);
  • xml
    <select id="queryBatch" resultType="employee">
        select * from t_emp
        where emp_id in
        <!--
         遍历的数据 : ( 1,2,3 )
          collection="ids | arg0 | list"
          open="("              遍历之前需要的字符串
          separator=","         每次遍历的分割符号,最后一次不会追加
          close=")"             遍历结束要添加的字符串
          item="id"             获取每个遍历项
          -->
        <foreach collection="ids" open="(" separator="," close=")" item="id">
            <!-- 遍历内容:#{遍历项 item指定的key} -->
            #{id}
        </foreach>
    </select>

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

    <update id="updateBatch">
        <foreach collection="list" item="emp">
            update t_emp set emp_name = #{emp.empName} , emp_salary = #{emp.empSalary}
            where emp_id = #{emp.empId};
        </foreach>
    </update>

    <insert id="insertBatch">
        insert into t_emp(emp_name,emp_salary)
        values
        <foreach collection="list" separator="," item="employee">
            (#{employee.empName},#{employee.empSalary})
        </foreach>
    </insert>

批量更新时需要注意:
标签设计多个语句,需要设置允许指定多个语句。

<property name="url" value="jdbc:mysql://localhost:3306/mybatis-example?allowMultiQueries=true"/>
  • 批量插入的例子本质上是一条SQL语句,而实现批量更新则需要多条SQL语句拼起来,用分号分开。
  • 一次性发送多条SQL语句让数据库执行。此时需要在数据库连接信息的URL地址中设置。

六、sql片段

抽取重复的SQL片段:

<!-- 使用sql标签抽取重复出现的SQL片段 -->
<sql id="mySelectSql">
    select emp_id,emp_name,emp_age,emp_salary,emp_gender from t_emp
</sql>

引用已抽取的SQL片段:

<!-- 使用include标签引用声明的SQL片段 -->
<include refid="mySelectSql"/>

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

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

相关文章

139.乐理基础-一四五八度为何用纯?

上一个内容&#xff1a;138.乐理基础-等音、等音程的意义-CSDN博客 上一个内容里练习的答案&#xff1a; 以乐理里写的知识&#xff0c;没办法完全解释透彻 一四五八度为何用纯&#xff1f;这个问题&#xff0c;要透彻的话要从各个文明怎么发现音高、发明音高、制定规则等&…

如何在Vue中实现事件处理?

Vue是一种流行的JavaScript框架&#xff0c;广泛应用于前端开发。在Vue中&#xff0c;事件处理是一个非常关键的概念&#xff0c;可以帮助我们实现用户与页面的交互&#xff0c;今天我们就来探讨一下如何在Vue中实现事件处理。 首先&#xff0c;让我们先了解一下在Vue中如何绑…

【数据结构】实现堆

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解堆&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 堆的概念及结构二. 堆的实现堆的结构体初始化销毁插入数据删除数据&#xff08;默认删除堆顶即…

基于Mahout实现K-Means聚类

需求分析 需要对数据集进行预处理&#xff0c;选择合适的特征进行聚类分析&#xff0c;确定聚类的数量和初始中心点&#xff0c;调用Mahout提供的K-Means算法进行聚类计算&#xff0c;评估聚类结果的准确性和稳定性。同时&#xff0c;需要对Mahout的使用和参数调优进行深入学习…

c++|内存管理

c|内存管理 C/C内存分布strlen 和 sizeof的区别 c语言动态内存管理方式malloccallocrealloc例题 c管理方式new/delete操作内置类型new/delete操作自定义类型证明 new 和 delete 的底层原理operator new与operator delete函数operator new 和 operator delete的 用法构造函数里面…

基于 Vue3打造前台+中台通用提效解决方案(下)

47、通用组件 - 倒计时组件 特惠部分存在一个倒计时的功能,所以我们需要先处理对应的倒计时模块,并把它处理成一个通用组件。 那么对于倒计时模块我们又应该如何进行处理呢? 所谓倒计时,其实更多的是一个时间的处理,那么对于时间的处理,此时我们就需要使用到一个第三方…

Socks5代理协议:原理、应用与优势

在计算机网络中&#xff0c;代理协议是一种用于转发客户端请求的机制。Socks5是其中一种广泛使用的代理协议。它主要工作在传输层和应用层之间&#xff0c;位于OSI参考模型的第五层&#xff08;会话层&#xff09;。其设计初衷是为了帮助授权用户突破防火墙限制&#xff0c;获取…

20240304-2-计算机网络

计算机网络 知识体系 Questions 1.计算机网络分层的优点和缺点 优点 各层之间是独立的&#xff1b;灵活性好&#xff1b;结构上可分割开&#xff1b;易于实现和维护&#xff1b;能促进标准化工作。 缺点&#xff1a; 降低效率&#xff1b;有些功能会在不同的层次中重复出现&…

2000-2021年全国各省市城乡平均受教育年限数据(分城镇和农村)(含原始数据+计算过程+计算结果)

2000-2021年全国各省市城乡平均受教育年限数据&#xff08;分城镇和农村&#xff09; 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;全国及31省 3、来源&#xff1a;人口与就业统计年鉴 4、指标包括&#xff1a;城乡平均受教育年限 、6岁以上总人口 未上过学、…

自动化神器 Playwright 的 Web 自动化测试解决方案!

Playwright认识 3. Playwright环境搭建 Playwright简介&#xff1a; 2020年&#xff0c;微软&#xff08;Microsoft&#xff09;开源了一个名为Playwright的工具&#xff0c;与Selenium一样入门简单&#xff0c;支持多语言&#xff08;Python、Java、Node.js、.NET&#xff0…

Java8,函数式编程应用:

持续更新中&#xff1a; 函数式(Functional)接口 什么是函数式(Functional)接口 只包含一个抽象方法的接口&#xff0c;称为函数式接口。 你可以通过 Lambda 表达式来创建该接口的对象。&#xff08;若 Lambda 表达式 抛出一个受检异常(即&#xff1a;非运行时异常)&#xff0c…

Linux学习:初识Linux

目录 1. 引子&#xff1a;1.1 简述&#xff1a;操作系统1.2 学习工具 2. Linux操作系统中的一些基础概念与指令2.1 简单指令2.2 ls指令与文件2.3 cd指令与目录2.4 文件目录的新建与删除指令2.5 补充指令1&#xff1a;2.6 文件编辑与拷贝剪切2.7 文件的查看2.8 时间相关指令2.9 …

为什么TestNg会成为Java测试框架的首选?还犹豫什么,看它!

上一篇自动化测试我们大概了解了测试的目标、测试的技术选型以及搭建平台的目标及需求&#xff0c;也确定了自动化测试方案以testNg作为整个测试流程贯穿的基础支持框架&#xff0c;那么testNg究竟有什么特点&#xff1f;本篇开始我们来详细的学习testNg这个测试框架。 为什么要…

软件设计师8--输入输出技术

软件设计师8--输入输出技术 考点1&#xff1a;输入输出技术数据传输控制方式中断处理过程例题&#xff1a; 考点1&#xff1a;输入输出技术 数据传输控制方式 √ 程序控制&#xff08;查询&#xff09;方式&#xff1a;分为无条件传送和程序查询方式两种。方法简单&#xff0…

MySQL篇—执行计划之覆盖索引Using index和条件过滤Using where介绍(第三篇,总共三篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

python实现手机号归属地查询

手机上突然收到了某银行的短信提示&#xff0c;看了一下手机的位数&#xff0c;正好是11位。我一想&#xff0c;这不就是标准的手机号码吗&#xff1f;于是一个想法涌上心头——用python的库实现查询手机号码归属地查询自由。 那实现的效果如下&#xff1a; 注&#xff1a;电…

yolov7添加spd-conv注意力机制

一、spd-conv是什么&#xff1f; SPD-Conv&#xff08;Symmetric Positive Definite Convolution&#xff09;是一种新颖的卷积操作&#xff0c;它主要应用于处理对称正定矩阵&#xff08;SPD&#xff09;数据。在传统的卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;…

【java数据结构】模拟二叉树的链式结构之孩子表示法,掌握背后的实现逻辑

&#x1f4e2;编程环境&#xff1a;idea &#x1f4e2;树结构&#xff0c;以及叶子&#xff0c;结点&#xff0c;度等一些名词是什么意思&#xff0c;本篇不再赘述。 【java数据结构】模拟二叉树的链式结构之孩子表示法&#xff0c;掌握背后的实现逻辑 1. 认识二叉树1.1 二叉树…

桂院校园导航 | 云上高校导航 云开发项目 二次开发教程 2.0

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 演示视频 【校园导航小程序】2.0版本 静态/云开发项目 演示 云开发项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页&#xff0c;界面更加高效和美观 2 校园页 新增…