mybatis之动态sql、if\choose\when\otherwise\trim\where\set\foreach\bind有案例

mybatis之动态sql

  • 动态SQL
    • if元素
    • choose 、when 、otherwise 元素
    • trim 、where 、set 元素
    • foreach 元素
    • bind 元素

动态SQL

定义:根据不同条件拼接SQLy语句,实现对数据库更准的操作。

实现方式:映射器配置文件或者注解

常用动态SQL元素

  1. if元素:判断语句,但条件分支判断
  2. choose元素:when、otherwise;多条件分支判断,等同于Java中的switch
  3. trim元素:where,set;辅助元素,用于处理一些SQL拼接的问题
  4. foreach元素:foreach元素用于遍历集合或数组
  5. bind元素:自定义上下文变量,传递参数

实体类中定义int还是Integer:一般情况下应该定义为Integer,选择的条件是判断该值能不能为0,因为在动态sql中判读是否输入的条件是0(引用数据类型为null)

if元素

语法:

<if test="条件"> 满足条件的语句</if>
如果需要多重条件进行判断在test中用or或and连接;该表达式也称为OGNL表达式(对象图导航语言),中的字符串比较不能用equals比较;属性名直接写
eg:<select id="findStudnet" resultType="Student" parameterType="Student">select * from studnet where <if test="classId != 0">classid = #{classId}</if><if test="ssex != null">and ssex = #{ssex}</if></select>解决办法一:在where后面加 1=1;但是where会对表中的数据逐行进行判断,因此效率低

解决办法二:

上面的案例存在问题:当传入一个参数时正常,当传入0个参数时where多余,当传入两个参数缺少and,解决办法是引入where标签;第一个and会自动去掉

<select id="findStudnet" resultType="Student" parameterType="Student"><!-- sql片段的使用 --><include refid="sql1"></include><where><if test="classId != 0">and classid = #{classId}</if><if test="ssex != null">and ssex = #{ssex}</if></where></select>

choose 、when 、otherwise 元素

语法:

<choose><when test="条件">满足条件的语句</when><otherwise>满足其他条件条件的语句</otherwise>
</choose>eg:<select id="findStudentChoose" resultType="Student" parameterType="Student">select * from student<where><choose><when test="sname != null">sname = #{sname}</when><when test="birthday != null">birthday = #{birthday}</when><when test="ssex != ssex">ssex = #{ssex}</when><!--	<otherwise>sid = 10</otherwise> --></choose></where></select>

注意:

  1. when中传入参数不论是否有结果匹配到后面的when都不会执行(等同于java中switch的break,前面的条件都为执行otherwise中的内容执行,不是必须的)

trim 、where 、set 元素

where语法:

<where><if test="条件">满足条件的语句</if>
</where>eg:<where><if test="title != null">and title = #{title}</if></where>

where注意:

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

set语法:

<set><if test = "条件">满足条件的语句</if>
</set>eg:<set><if test = "title != null">title = #{title}</if></set>

注意:

set 标签元素主要是用在更新操作的时候,它的主要功能和 where 标签元素其实是差不 多的,主要是在包含的语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果 set 包含的内容为空的话则会出错。有了 set 元素就可以动态的更新那些修改了的字段。

trim语法:

<trim prefix = “”suffixOverrides = “” prefixOverrides=“”suffix=“”></trim>
<!-- prefix:在开始添加一个prefixOverrides:开始去掉一个suffix:结束添加一个suffixOverrides:结束去掉一个
-->eg:
<update id="findStudentTrim" parameterType="Student">update student<trim prefix="set" suffixOverrides=","><if test="sname != null">sname = #{sname},</if><if test="birthday != null">birthday = #{birthday},</if><if test="ssex != null">ssex = #{ssex},</if></trim>where sid = #{sid}</update>

foreach 元素

语法:

<foreach item="" index="" collection="" open="" separator="" close=""></foreach><!-- item:循环中的当前元素index:当前循环位置的下标collection:方法传递的参数,一个数组(array)或是一个集合(list,l为小写)open:以什么符号开头close:以什么符号结束separator:元素间的间隔符号
-->eg:
<select id="findStudentArray" resultType="Student">select * from student<where><foreach item="sid" collection="array" open="sid in (" separator="," close=")">#{sid}</foreach></where>
</select>批量插入数据:将对象存入集合中,再通过 对象.属性 将值赋给数据库中的字段
<insert id="insertStudentForeach">insert into student (sname,birthday,ssex,classid)<foreach collection="list" open=" values"  separator="," item="stu">(#{stu.sname},#{stu.birthday},#{stu.ssex},#{stu.classId})</foreach> 	
</insert>

mybatis中的模糊查询

五种模糊查询:

  1. 方式一:业务层处理传入’张%’ 不推荐,耦合度高
  2. 方式二:通过MySQL的函数进行模糊处理,推荐
  3. ${}:纯字符串替换,不防止sql注入;不能用不能防止sql注入
  4. 方式四:通过sql语法进行特殊字符串拼接:#{v}“%”
  5. 方式五:bind标签 官方推荐;
<select id="selectStudnetLike" parameterType="String" resultMap="Student"><!-- 方式一:业务层处理传入'张%'  不推荐,耦合度高--><!-- select * from student where sname like #{v} --><!-- 方式二:通过MySQL的函数进行模糊处理 推荐 -->select * from student where sname like concat(#{v},'%')<!-- 方式三:不能用#{}:参数位置用?进项占位(sql预处理),然后用PreparedStatement进行传参处理${}:纯字符串替换,不防止sql注入-->select * from student where sname like '${v}%'<!-- 方式四:通过sql语法进行特殊字符串拼接 -->select * from student where sname like #{v}"%"<!-- 方式五:bind标签 官方推荐 --><bind name="x" value="_parameter+'%'"/>select * from student where sname like #{x}%</select>

bind 元素

语法:

<bind name=“” value=“_parameter”>
</bind>
<!--
name:自定义变量的变量名
value:自定义变量的变量值
_parameter:传递进来的参数
-->eg:
<bind name = “name1” value = '%' + _parameter+ '%' ></bind>

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

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

相关文章

oracle-事务一系列理解

一个事务开始后&#xff0c;会被分配一个唯一的id号&#xff0c;xid&#xff0c;xid不仅是一个编号也是一个地址。 事务表 存在undo表空间的某一个段的段头块&#xff0c;最多存放47个事务&#xff0c;事务开始的时候&#xff0c;先将信息写入这个表&#xff0c;所以一个undo段…

css宽度适应内容

废话不多说,看如下demo,我需要将下面这个盒子的宽度变成内容自适应 方法有很多,如下 父元素设置display:flex 实现子元素宽度适应内容 如下给父元素设置flex能实现宽度自适应内容 <!DOCTYPE html><html lang"en"><head><meta charset"U…

我开源了一个 Go 学习仓库

前言 大家好&#xff0c;这里是白泽&#xff0c;我是21年8月接触的 Go 语言&#xff0c;学习 Go 也正好两年半&#xff0c;我决定重启我之前未完成的计划&#xff0c;继续阅读《The Go Programing Language》&#xff0c;一年多前我更新至第五章讲解的时候&#xff0c;工作的忙…

K8S--daemonset小结

1、简介 1、daemonset中的pod会自动设置node.kubernetes.io/unschedulable污点的容忍度&#xff0c;所以即使一台机器被设置成无法调度&#xff0c;daemonset所控制的pod也会调度到该节点上。2、当有一个节点注册到K8S集群上的时候&#xff0c;daemonset控制器将会在该节点上运…

基于springboot+vue2的灾区物资管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

力扣第 379 场周赛VP

目录 一1.思路2.代码 二1.思路2.代码 三1.思路2.代码 四1.思路2.代码 链接:https://leetcode.cn/contest/weekly-contest-379/ 一 1.思路 找最长对角线&#xff0c;很显然直接比较a^2 b ^ 2就行 注意更新时考虑对角线长度相等时候去面积最大 2.代码 class Solution { publ…

java中多线程

文章目录 多线程进程和线程进程线程 继承Thread类方式实现多线程设置线程名字的两个方式获取正在运行的线程线程调度模型和线程优先级设置两种调度模型优先级设置 线程控制sleepjoin守护线程 线程生命周期 多线程 进程和线程 进程 进程&#xff1a;是正在运行的程序 是系统进…

KY43 全排列

全排列板子 ti #include<bits/stdc.h>using namespace std;string s; map<string, int>mp;void swap(char &a, char &b){char em a;a b;b em; }void dfs(int n){ //将s[n~l]的全排列转化成s[n]s[n1~l]的全排列 if(n s.length()){mp[s] 1;return ;}f…

LeetCode刷题:142. 环形链表 II

题目&#xff1a; 是否独立解决&#xff1a;否&#xff0c;参考了解题思路解决问题&#xff0c;思考了用快慢指针&#xff0c;栈&#xff0c;统计链表数量定位尾巴节点&#xff08;因为是环形链表所以是死循环&#xff0c;链表数量用while循环统计不出来&#xff09;都没解决 解…

如何将.NET 8.0的ASP.NET Core Web API部署成Windows服务

写在前面 前面写了一篇关于将.NET应用转换成Windows服务的方法&#xff0c;其实真正的目的是为了探索如何将Asp.Net Core Web Api 部署成Windows 服务。基于上一篇的基础&#xff0c;只需把创建 WebApplication 的代码放到 BackgroundService 的ExecuteAsync方法中即可。 其中…

脱离于ASP.NET 和Visual Studio编辑Razor脚本

Razor Pad是一个编辑Razor脚本的工具&#xff0c;脱离于ASP.NET 和Visual Studio。 github地址&#xff1a;https://github.com/RazorPad/RazorPad 如果在编译源码时出现&#xff1a;签名时出错: 未能对 bin\Debug\app.publish\RazorPad.exe 签名。SignTool Error: No certifi…

编程探秘:Python深渊之旅-----Web 的世界(五)

随着项目进展&#xff0c;团队决定开发一个 web 界面来提升用户体验。码娜&#xff0c;作为团队的新成员&#xff0c;踏上了学习 Python web 开发的旅程。 派超&#xff08;兴奋地&#xff09;&#xff1a;我们要开发一个 web 应用啦&#xff01;码娜&#xff0c;你准备好迎接…

JavaScript数据类型、判断、检测

JavaScript数据类型 number、string、boolean、null、undefined、symbol、bigint Object【Array、RegExp、Date、Math、Function】 存储方式 1. 基础类型存储在栈内存中&#xff0c;被引用或者拷贝时&#xff0c;会创建一个完全相同的变量。 2. 引用类型存放在堆内存中&…

postgresql 最简主从配置

实验目的 配置一个最简的主从环境&#xff0c;了解基本的主从配置。 环境参数 操作系统CentOS Linux release 7.9.2009 (Core)数据库版本PostgreSQL 10.23主库端口15431备库端口15432 因为只是做实验&#xff0c;所以主备库放在同一台机器上&#xff0c;仅通过端口区分主备…

深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 通过学习已经掌握了主要的基础函数之后具备了搭建一个网络并使其正常运行的能力&#xff0c;那下一步我们还…

【Linux笔记】自定义一个简单的shell

一、命令行解释器shell的原理 我们已经知道Linux给我们提供了一系列由exec开头的系统调用接口&#xff0c;可以让我们在自己所写的程序中调用各种指令或者我们自己写的其他程序&#xff1a; 而我们的shell命令行解释器也是接收用户输入的指令&#xff0c;然后执行&#xff1a;…

腾讯滑块(1-13,js逆向)

前言&#xff1a;之前打算写的猿人学比赛题系列因为种种原因耽搁了&#xff0c;主要还是比完赛之后热情就少了很多&#xff0c;看到评论区有人说做了这么久才做出一题&#xff0c;这里需要狡辩一下&#xff0c;我虽然菜但是还没到那种地步&#xff0c;比赛两天时间里我跟队友是…

CH341 SPI方式烧录BK7231U

CH341是一个USB总线的转接芯片&#xff0c;通过USB总线提供异步串口、打印口、并口以及常用的2线和4线等同步串行接口。 BK7231U Wi-Fi SOC芯片&#xff0c;内嵌处理器。1. 符合802.11b/g/n 1x1协议 2. 17dBm 输出功率3. 支持20/40 MHz带宽和STBC 4. 支持Wi-Fi STA、AP、…

38 C++ 函数模版中含有可变参数的处理, 类模版中含有可变参数的处理

函数模版中含有可变参数 假设我们现在函数模版不确定有多少个参数&#xff0c;也不确定参数的类型&#xff0c;我们就可以在函数模版中使用可变参数 函数模版中有可变参数的写法 如何隔将函数模版中可变参数解析出来 //函数模版中含有可变参数 //假设我们现在函数模版不确定有…

Python操作Word:轻松实现文档的创建、编辑与自动化处理

引言&#xff1a; 在日常工作和学习中&#xff0c;我们经常需要使用Microsoft Word来创建、编辑和处理文档。然而&#xff0c;手动操作Word可能会耗费大量的时间和精力。为了提高工作效率&#xff0c;我们可以使用Python编程语言来操作Word文档&#xff0c;实现文档的自动化处理…