MyBatis动态SQL--if 标签

mybatis动态sql对我们来说是非常常见的,比如在下面这样一个场景中,

我们需要多条件查询,但是查询的条件又不是固定的,是可以动态改变的,那我们就需要用到动态sql去完成。

动态SQL之 if 标签

接下来我们介绍第一个动态sql标签---< if > 标签.

我们模拟这样一个场景:有三个参数,这三个参数可以输入,也可以不输入,其中某个参数如果没有输入的话或者输入为空,这个参数就不加入sql语句的条件判断中。

mapper接口代码如下:

List<Book> findBookBySqlIf(@Param("bname") String bname ,@Param("price") Double price ,@Param("cid") String cid ) ;

这里顺便解释一下Param注解,因为这时多参数里面的内容。

Param注解作用:
  因为这里有多条参数,所以mybatis会将他们存进数组,当在编写sql语句时,我们获取这些参数的方式有三种方式。
  方式一:使用arg0,arg1...注意0就是第一个
  方式二:使用param1,param2...这里1是第一个参数
  但是这两种可读性都比较差,因为我在编写sql语句时,并不知道arg0或者param就是bname书名的意思。我还要回来看参数名才知道
  方式三:@Param("xxx")注解,写在对应的参数的前面,相当与给他取一个别名xxx,这样我们在编写sql语句的时候,就可以直接用见名知意的别名

mapper接口编写完成后,我们接下来在mapper映射文件中编写sql语句如下:

<select id="findBookBySqlIf" resultType="com.feisi.mybatis.pojo.Book">
       select * from t_book where 1=1
         <!--
         1.if标签的test属性时必须的,里面放着判断条件
         2.if标签中test属性的值是fasle或者true
         3.如果test中是true,则将if标签里面的sql语句拼接上去,否则跳过这个if标签中的slq语句
         4.在mybatis动态sql中并且用and
         -->
        <!-- 这里的额判断条件就是参数不能为空,因为为空说明没有输入,那么要是加入sql语句的条件中,那么不管如果如何都查不到任何Book
-->
                <if test="bname != null and bname != ''">
                    and bname like "%"#{bname}"%"
                </if>
                <if test="price != null and price != ''">
                    and price>#{price}
                </if>
                <if test="cid != null and cid != ''">
                    and cid = #{cid}
                </if>
    </select>

 从上面可以看出,if标签的作用就是对输入的参数进行判断,如果满足条件,就把if标签里的sql语句拼接起来 , 否则就跳过这段sql语句。主要为了防止输入的参数表空的时候,如果也把它加入sql语句的判断条件中,会导致查出来的数据为空。

     另外,这里获取参数的语句和前面Param注解呼应,如果前面没有加上Param注解起别名,那么这里的bname,price,cid都要写成arg0 ,arg1 , arg2 或者param1,2,3.。

     最后再来看看测试代码:

package com.feisi.testMybatis;

import com.feisi.mybatis.mapper.BookMapper;
import com.feisi.mybatis.pojo.Book;
import com.feisi.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class BookMapperTest {
    @Test
    public void findBookBySqlIfTest(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
//        假设三个条件都不是空
//        List<Book> books = mapper.findBookBySqlIf("怡宝" ,99.0,"");
//        假设三个条件都是空
//        那么这里就会出现一个问题,因为三个都是空,那么条件全部都没有拼接上去,那么sql语句就变成了:
//        select * from t_book where
//        这样肯定是不行的,因为后面多了一个where,怎么解决呢?
//        我们可以在写sql语句的时候后面加一个恒true条件,比如这样写:
//        select * from t_book where 1=1 , 这样的话同时第一个if标签语句前面也要加上and
        List<Book> books = mapper.findBookBySqlIf("" ,null,"");
        for(Book book : books) System.out.println("查询到:"+book);
        sqlSession.close();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java代码审计】S2-045 远程代码执行漏洞分析复现

【Java代码审计】S2-045 远程代码执行漏洞分析复现 1.漏洞原理2.靶场复现 1.漏洞原理 官方对该漏洞的描述是这样的&#xff1a;Struts2 默认处理 multipart 上传报文的解析器为 Jakarta 插件&#xff08;org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类&a…

基于opencv的SVM算法的车牌识别系统设计与实现

基于opencv的SVM算法的车牌识别系统设计与实现 车牌识别技术是智能交通系统中的一项关键技术&#xff0c;它能够自动识别车辆的车牌号码。本文将详细介绍如何使用Python编程语言结合OpenCV库和SVM算法来实现车牌识别系统。 系统架构 车牌识别系统主要包括以下几个模块&…

外贸建站:WordPress搭建外贸独立站零基础自建站完整教程(2024)

对于做外贸来说&#xff0c;拥有自己的外贸独立网站真的非常重要。在外贸领域&#xff0c;如今各平台竞争激烈&#xff0c;规则多&#xff0c;成本高&#xff0c;价格战、政策变化快&#xff0c;还存在封店风险等等因素。在这种情况下&#xff0c;拥有外贸独立站就能很好规避上…

JavaSE:抽象类和接口

目录 一、前言 二、抽象类 &#xff08;一&#xff09;抽象类概念 &#xff08;二&#xff09;使用抽象类的注意事项 &#xff08;三&#xff09;抽象类的作用 三、接口 &#xff08;一&#xff09;接口概念 &#xff08;二&#xff09;接口语法规则 &#xff08;三&a…

八口快速以太网交换机芯片方案分享/JL5110

以太网交换机(switch)是一种网络设备&#xff0c;用于在局域网中连接多个计算机和其他网络设备。它可以实现多个端口之间的同时传输&#xff0c;并根据MAC地址进行帧过滤和转发。交换机通过自学习的方式&#xff0c;将MAC地址与相应的接口关联起来&#xff0c;以便将数据帧准确…

Termius for Mac v8.4.0激活版下载

Termius for Mac是一款功能强大的多协议远程管理软件&#xff0c;专为开发人员、系统管理员和网络专业人士设计。它支持多种远程连接协议&#xff0c;如SSH、Telnet、RDP、VNC和RFB等&#xff0c;使得用户可以轻松连接到不同类型的远程服务器和设备。 软件下载&#xff1a;Term…

湖北兴发MES和用友NCC单据接口对接

湖北兴发MES和用友NCC单据接口对接 对接系统用友NCC 用友NCCloud&#xff0c;为客户提供面向大型企业集团、制造业、消费品、建筑、房地产、金融保险等14个行业大类&#xff0c;68个细分行业&#xff0c;涵盖数字营销、智能制造、财务共享、数字采购等18大解决方案&#xff0c;…

为什么要用能量回馈式负载

能量回馈式负载是一种能够将电能转化为其他形式能量的装置&#xff0c;同时还能将其他形式的能量转化为电能。这种负载在许多应用中具有重要的意义&#xff0c;因为它可以提高能源利用效率&#xff0c;减少能源浪费&#xff0c;降低环境污染&#xff0c;提高系统的稳定性和可靠…

Python3.10 - 列表的常用方法

01 列表的切片 lst [a, b, 1, 2, [c1, 1]]# 01 列表的切片 lst1 lst[0:2] # 从0开始切到1(顾头不顾尾), 切得长度超过1时, 切出来为list类型 print(lst1, type(lst1))lst2 lst[0] # 从中切某个元素时, 切出来的类型即元素本身, 以下同理 print(lst2, type(lst2))lst3 ls…

“由于找不到opencv_world3413.dll,无法继续执行代码”的解决方法

问题 在Windows系统中&#xff0c;编译完涉及到opencv的项目后&#xff0c;提示&#xff0c; 由于找不到opencv_world3413.dll&#xff0c;无法继续执行代码 解决方法 在编译好的opencv的bin文件内&#xff08;如&#xff1a;D:\code\vs2017\opencv\build\x64\vc15\bin&…

Spring Boot 学习(2)——HelloWorld

HelloWorld&#xff01;全宇宙码农的第一个&#xff08;行&#xff09;程序&#xff08;代码&#xff09;。 1、创建项目 打开idea&#xff0c;新建一个maven项目。 1&#xff09;选择项目sdk&#xff08;本例是1.8&#xff09; 2&#xff09;输入GroupId&#xff08;co…

FME学习之旅---day20

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;AutoCAD 入门 FME使用四种主要格式来读取和写入AutoCAD图形文件;初级教程重点介绍AutoDesk AutoCAD DWG\DXF(ACAD) AutoCAD中常用的术语 实体&#xff1a;AutoCAD 图元表示 D…

超强命令行解析工具Apache Commons CLI

概述 为什么要写这篇文章呢?因为在读flink cdc3.0源码的时候发现了这个工具包,感觉很牛,之前写过shell命令,shell是用getopts来处理命令行参数的,但是其实写起来很麻烦,长时间不写已经完全忘记了,现在才发现原来java也有这种工具类,所以先学习一下这个的使用,也许之后自己在写…

封装一个vue3的公共组件

在Vue 3中&#xff0c;封装公共组件的场景包括但不限于以下几种情况&#xff1a; 重复使用的组件&#xff1a;如果你发现某个组件在多个地方重复使用&#xff0c;那么将其封装成公共组件是很有意义的。比如&#xff0c;页面中的各种表单控件&#xff08;输入框、下拉框、日期选…

梵宁教育春日主题大奖赛

梵宁教育春日主题大赛正式拉开帷幕&#xff0c;我们诚挚邀请各位同学积极参与&#xff0c;用你们的创意和才华诠释春天的魅力。 本次大赛以春日为主题&#xff0c;参赛作品形式多样&#xff0c;包括海报设计和剪辑创作。我们鼓励同学们发挥想象力&#xff0c;将春天的美好瞬间、…

Golang和Java的对决:从设计理念到工具链的全面比较

文章目录 使用率排名Golang和Java设计理念语法和类型系统并发处理资源消耗生态系统和工具链 结语 使用率排名 据最新的2024年3月 Tiobe 编程语言排行榜&#xff0c;目前 Golang 的使用率排名为第8呈上升趋势&#xff0c;Java 的使用率排名为第4呈下降趋势 2024年3月2023年3月…

Go——函数

一. 函数定义 1.1 特点 无需声明原型支持不定变参支持多返回值支持命名返回参数支持匿名函数和闭包函数也是一种类型&#xff0c;一种函数可以赋值给变量不支持嵌套&#xff0c;一个包不能有两个名字一样的函数不支持重载不支持默认参数 1.2 函数声明 函数声明包含一个函数名&…

谈谈考研数学几个常见误区

25考研数学&#xff0c;一定一定要吃透基础&#xff0c;练好计算 我之所以要强调这个&#xff0c;是因为现在的考研数学&#xff0c;越来越重视基础和计算的考察&#xff0c;题海战术已经过时&#xff0c;如果想要有效的提升自己&#xff0c;要进行针对性的学习。我去年考研的…

【.NET全栈】.NET全栈学习路线

一、微软官方C#学习 https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/ C#中的数据类型 二、2021 ASP.NET Core 开发者路线图 GitHub地址&#xff1a;https://github.com/MoienTajik/AspNetCore-Developer-Roadmap/blob/master/ReadMe.zh-Hans.md 三、路线…

常州威雅:「西陵氏奖学金」项目,只为寻找优秀的你!

栀子花开&#xff0c;凤凰花落&#xff0c;又是一年中考季。站在深耕“全人教育”的第十年&#xff0c;常州威雅现今面向全社会的优秀初三学子&#xff0c;首次推出「西陵氏奖学金」项目&#xff0c;助力梦想起航。 西陵氏女嫘祖&#xff0c;华夏文明的奠基人。她所发现、发明的…