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或者true3.如果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 {@Testpublic 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标签语句前面也要加上andList<Book> books = mapper.findBookBySqlIf("" ,null,"");for(Book book : books) System.out.println("查询到:"+book);sqlSession.close();}
}

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

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

相关文章

Day43 动态规划 part05

Day43 动态规划 part05 1049.最后一块石头的重量II 我的思路: 提示说和划分两个和相等的子集差不多&#xff0c;猛然想到&#xff0c;这道题不就是划分子集&#xff0c;用sum - 和最大*2 代码就是划分和相同的子集的变形 解答&#xff1a; class Solution {public int last…

【JavaScript】函数 ⑥ ( 使用 arguments 获取所有实参 | arguments 内置对象 | 伪数组概念 )

文章目录 一、使用 arguments 获取所有实参1、arguments 内置对象2、伪数组概念3、arguments 实参遍历4、arguments 代码示例 - 基本使用5、arguments 代码示例 - 遍历实参 一、使用 arguments 获取所有实参 1、arguments 内置对象 在 定义 JavaScript 函数 时 , 有时 不确定 形…

使用LangChain编写图检索查询实现RAG

大家好&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种先进的人工智能技术&#xff0c;通过整合大型语言模型&#xff08;LLM&#xff09;的内部知识和外部权威数据源&#xff0c;来提升生成式AI模型的表现。 本文…

安全可靠!麒麟信安操作系统各版本均不受liblzma/xz漏洞影响!

近日&#xff0c;XZ Utils 5.6.0和5.6.1版本存在严重后门风险的消息披露后&#xff0c;麒麟信安立即展开全面排查&#xff0c;经分析验证&#xff0c;麒麟信安操作系统各版本均不受liblzma/xz漏洞影响。 关于liblzma/xz漏洞 漏洞描述 xz 5.6.0 与 5.6.1 版本的上游代码中发现…

ComplexHeatmap绘图:注释、图例、热图基础(自备)

目录 基础介绍 Heatmap绘图基础参数 数据 作图参数 Heatmap Annotations&#xff08;注释&#xff09; 基础注释设置 简单注释测试 anno_points散点注释 anno_lines连线注释 anno_barplot条形图 anno_boxplot箱线图 anno_histogram直方图 热图组合 基础组合 进行…

【热门话题】文言一心与ChatGPT-4:一场跨时代智能对话系统的深度比较

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 文言一心与ChatGPT-4&#xff1a;一场跨时代智能对话系统的深度比较一、技术背景…

Maven--lib分离的打包方式

就是把lib包和source源码分开打包。优势就是&#xff0c;面对频繁更新的应用场景时&#xff0c;可以只更新源码包&#xff08;当然&#xff0c;前提是你的依赖没有增减&#xff09;。尤其是使用jenkins更新项目时&#xff0c;会省去很多时间吧&#xff1f; 不同项目的 lib之间不…

SQL语句生成器,支持MSSQL/MYSQL/SQLITE/ACCESS/EXCEL

经过7个月的艰苦开发&#xff0c;SQL语句生成器终于和各位见面了&#xff0c;因为工程量浩大&#xff0c;一度做到崩溃&#xff0c;差点烂尾&#xff0c;好在经过N次激烈思想斗争后还是坚持了下来累累累累累累累 本软件能够自动生成SQL语句及对应的易语言代码&#xff0c;还有相…

图片二维码如何制作生成?常规图片格式的二维码制作技巧

图片是展示信息很常用的一种方式&#xff0c;而现在查看图片很多人会通过二维码的形式来展现&#xff0c;这种方式优势在于更加的灵活&#xff0c;能够通过一个二维码展示大量的图片内容。那么图片二维码是如何制作生成的呢&#xff1f; 想要快速的将图片转二维码使用&#xf…

mapbox-gl扩展sprites图片

在mapbox-gl.js中&#xff0c;通过在styles中设置sprite和glyphs&#xff0c;实现样式图标和字体的加载。而一旦style加载完成&#xff0c;如果重置地图中的style&#xff0c;则会导致地图全部重新加载&#xff0c;图层的顺序&#xff0c;地图上的要素&#xff0c;都会丢失&…

智慧城市治理:构建全域覆盖的城市时空感知体系

TSINGSEE青犀AI算法中台是一款平台型产品&#xff0c;专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点&#xff0c;可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术&#xff0c;包括视频编解码技术、嵌入式…

成都直播基地出租:天府新区兴隆湖天府锋巢直播产业基地

天府新区兴隆湖天府锋巢直播产业基地&#xff0c;作为成都乃至西部地区的一颗璀璨明珠&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;吸引着越来越多的目光。这里不仅是成都直播产业的聚集地&#xff0c;更是传统企业转型升级的摇篮&#xff0c;是新媒体时代下的创新高…

多态--下

文章目录 概念多态如何实现的指向谁调谁&#xff1f;例子分析 含有虚函数类的大小是多少&#xff1f;虚函数地址虚表地址多继承的子类的大小怎么计算&#xff1f;练习题虚函数和虚继承 概念 优先使用组合、而不是继承; 继承会破坏父类的封装、因为子类也可以调用到父类的函数;…

RESTful规范总结

概念&#xff1a;RESTful&#xff08;Representational State Transfer 的缩写&#xff09;是一种广泛使用的API架构风格。 1.资源&#xff1a;在REST API的设计中&#xff0c;首先需要面向资源建模&#xff0c;其中每个节点是是一个简单资源或集合资源。 1.1一个集合包含相同…

基于Uni-app的体育场馆预约系统的设计与实现

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

如何操作RAID 0阵列的扩容?

正文共&#xff1a;1888 字 23 图&#xff0c;预估阅读时间&#xff1a;2 分钟 RAID&#xff08;Redundant Array of Independent Disks&#xff09;即独立磁盘冗余阵列&#xff0c;通常简称为磁盘阵列&#xff0c;在高级磁盘阵列中&#xff0c;部分物理存储空间会用来记录保存…

【性能调优】Java服务端性能优化与实战

一、背景 降本增效&#xff1a;随着公司业务的发展和用户规模的增加&#xff0c;当前服务的QPS已经远远不能满足业务需求&#xff0c;需要申请更多CPU资源&#xff0c;来提升QPS&#xff0c;满足业务发展&#xff0c;但是公司硬件资源有限&#xff0c;额外申请多余资源&#x…

OpenHarmony实战:小型系统器件驱动移植

本章节讲解如何移植各类器件驱动。 LCD驱动移植 移植LCD驱动的主要工作是编写一个驱动&#xff0c;在驱动中生成模型的实例&#xff0c;并完成注册。 这些LCD的驱动被放置在源码目录//drivers/hdf_core/framework/model/display/driver/panel中。 创建Panel驱动 创建HDF驱动…

vulnhub pWnOS v2.0通关

知识点总结&#xff1a; 1.通过模块来寻找漏洞 2.msf查找漏洞 3.通过网站源代码&#xff0c;查看模块信息 环境准备 攻击机&#xff1a;kali2023 靶机&#xff1a;pWnOS v2.0 安装地址&#xff1a;pWnOS: 2.0 (Pre-Release) ~ VulnHub 在安装网址中看到&#xff0c;该靶…

day10 java封装性

封装性 为什么有封装性&#xff1f; 为了保护数据不被随意修改&#xff0c;隐藏类的实现细节。增强了代码的安全性和可维护性。 该隐藏隐藏 该暴露暴露 封装性的实现&#xff1f; 让调用者只能通过方法操作属性。可以在方法中加入一些限制条件或数据检查的操作。 封装性的直…