【Spring】— 动态SQL :<choose>、<when>和<otherwise>元素

news/2025/1/12 21:51:31/

<choose><when><otherwise>元素

在使用<if>元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个执行。例如,若用户姓名不为空,则只根据用户姓名进行筛选;若用户姓名为空,而用户职业不为空,则只根据用户职业进行筛选;若用户姓名和用户职业都为空,则要求查询出所有电话不为空的用户信息。

此种情况下,使用<if>元素进行处理是非常不合适的,可以使用<choose><when><otherwise>元素进行处理,类似于在Java语言中使用switch…case…default语句。

【示例】使用<choose><when><otherwise>元素组合实现上面的情况。

(1)在映射文件UserMapper.xml中,使用<choose><when><otherwise>元素执行上述情况的动态SQL代码如下所示。

<!--<choose><when><otherwise>元素使用--><select id="findUserByNameOrJobs" parameterType="com.ssm.po.User" resultType="com.ssm.po.User">select * from t_user where 1=1<choose><when test="username !=null and username != ''">and username like connect ('%', #{username}, '%')</when><when test="jobs !=null and jobs != ''">and jobs = #{jobs}</when><otherwise>and phone is not null</otherwise></choose></select>

在上述代码中,使用了<choose>元素进行SQL拼接,若第一个<when>元素中的条件为真,则只动态组装第一个<when>元素内的SQL片段;否则继续向下判断第二个<when>元素中的条件是否为真,以此类推;若前面所有when元素中的条件都不为真,则只组装<otherwise>元素内的SQL片段。

(2)在测试类MybatisTest中,编写测试方法findUserByNameOrJobsTest(),其代码如下所示。

 /**根据用户姓名和职业组合条件查询用户信息列表*/@Testpublic void findUserByNameOrJobsTest() throws Exception {//通过工具类生成SqlSession对象SqlSession sqlSession = MybatisUtil.getSession();//创建User对象,封装需要组合查询的条件User user = new User();user.setUsername("zhangsan");user.setJobs("teacher");//执行SqlSession的查询办法,返回结果集List<User> users =sqlSession.selectList("com.ssm.mapper.UserMapper.findUserByNameOrJobs",user);//输出查询结果for (User u :users) {System.out.println(u.toString());}sqlSession.close();}

执行上述方法后,虽然同时传入了姓名和职业两个查询条件,但MyBatis所生成的SQL是动态组装用户姓名进行条件查询的。如果将上述代码中的“user.setUsername("zhangsan");”删除或者注释掉,然后再次执行,这时MyBatis生成的SQL组装用户职业进行条件查询,同样会查询出用户信息。如果将设置客户姓名和职业参数值的两行代码都注释掉,那么程序的执行结果如图所示,MyBatis的SQL组装<otherwise>元素中的SQL片段进行条件查询。

在这里插入图片描述


http://www.ppmy.cn/news/169502.html

相关文章

AIGC周报|30秒定制一个文生图模型;60美元让AI玩转《我的世界》;手机版“文生图”模型:2秒不到出一张图

AIGC&#xff08;AI Generated Content&#xff09;即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT&#xff0c;以及 DallE 2、Stable Diffusion 等文生图模型&#xff0c;都属于 AIGC 的典型案例&#xff0c;它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

滴滴和华为5年,分享一下真实的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

台灯等级AAA和AA有什么差别?台灯照度国家aa标准是什么

根据GB/T 9473-2017《读写作业台灯性能要求》&#xff0c;国家将护眼灯的照度和均匀度按质量的高低划为了国AA和国A两个等级&#xff0c;具体来讲&#xff0c;以出光面的中心投影点为圆心&#xff0c;半径300mm以内的范围&#xff0c;照度大于300lx就是国A级&#xff0c;大于50…

[buuctf] crypto全解——前84道(不建议直接抄flag)

buuctf crypto 1.MD52.Url编码3.一眼就解密4.看我回旋踢5.摩丝6.[BJDCTF 2nd]签到-y1ng7.password8.变异凯撒9.Quoted-printable10.Rabbit11.篱笆墙的影子12.RSA13.丢失的MD514.[BJDCTF 2nd]老文盲了15.Alice与Bob16.rsarsa17.大帝的密码武器18.Windows系统密码19.[BJDCTF 2nd]…

【菜鸟必看】CSDN博客字体颜色编码大全,前端颜色编码,都在这里了!!

Markdown是一种可以使用普通文本编辑器编写的标记语言&#xff0c;通过类似HTML的标记语法&#xff0c;它可以使普通文本内容具有一定的格式。但是它本身是不支持修改字体、字号与颜色等功能的&#xff01; CSDN-markdown编辑器是其衍生版本&#xff0c;扩展了Markdown的功能&a…

TheDAO悲剧重演,SpankChain重入漏洞分析

前言 在10月8日&#xff0c;区块链项目方SpankChain在medium上发表了一篇文章&#xff0c; 并表明其受到了攻击&#xff0c;导致损失了160多个ETH和一些Token&#xff0c;这次攻击事件&#xff0c;相对来说损失金额是较小的&#xff0c;约4万美元&#xff0c;不过值得一提的是…

python 实验3-2

6、编写程序&#xff0c;利用元组作为函数的返回值&#xff0c;求系列类型中的最大值、最小值和元素个数&#xff0c;并编写测试代码&#xff0c;假设测试数据分别为s1[9,8,7,3,2,1,55,6]、s2[‘apple’,‘pear’,‘melon’,‘kiwi’],s3‘TheQuickBrownFox’。运行效果如下&am…

Node.js的事件轮询Event Loop原理解释

事件轮询主要是针对事件队列进行轮询&#xff0c;事件生产者将事件排队放入队列中&#xff0c;队列另外一端有一个线程称为事件消费者会不断查询队列中是否有事件&#xff0c;如果有事件&#xff0c;就立即会执行&#xff0c;为了防止执行过程中有堵塞操作影响当前线程读取队列…