MyBatis详解(4) -- 动态SQL

MyBatis详解(4)

    • 动态SQL
        • 两种方式:1.映射器配置文件; 2.注解
        • 常用的动态 SQL 元素
        • if元素
        • where元素
        • set元素
        • choose元素(优先,只执行一个)
        • trim元素
        • foreach 元素(批量处理)
        • bind 元素
        • #{} 和 ${}的区别

动态SQL

根据不同条件拼接 SQL 语句,实现对数据库更准确的操作;

两种方式:1.映射器配置文件; 2.注解
常用的动态 SQL 元素

if 元素:判断语句,单条件分支判断.

choose 元素(优先):(when,otherwise)多条件分支判断,等同于 java 的 switch

trim:(万能元素)(where,set):辅助元素,用于处理一些SQL 拼接的问题.

foreach 元素:循环语句,在 in 语句等列举条件常用

bind 元素:自定义上下文变量,传递参数

if元素
<select id="findStudents" parameterType="Student" resultType="Student">select * from student where 1=1<if test="ssex != null">and ssex = #{ssex}</if><if test="classid != 0">and classid = #{classid}</if></select>
where元素

1.自动根据是否有条件添加where
2.去掉第一个条件的and

   <select id="findStudentwhere" parameterType="Student" resultType="Student">select * from student <!-- where1.自动根据是否有条件添加where2.去掉第一个条件的and--><where><if test="ssex != null"> and ssex = #{ssex}</if>	 <if test="classid != 0"> and classid = #{classid}</if>   </where> </select>
set元素

1.自动添加set(如果 set 包含的内容为空的话则会出错。)

2.去掉set包含的语句中最后一个逗号

<update id="updateStudent" parameterType="Student">update student <set><if test="sname != null">sname =#{sname},</if><if test="birthday != null">birthday =#{birthday},</if><if test="ssex != null">ssex =#{ssex},</if><if test="classid != null">classid =#{classid},</if></set>     sid = #{sid}</update>
choose元素(优先,只执行一个)
<select id="findStudentchoose" parameterType="Student" resultType="Student">select * from student <where><choose><when test="sid !=0"> and sid= #{sid}</when><when test="sname !=null"> and sname= #{sname}</when><otherwise> 满足其他条件的语句</otherwise></choose></where></select>
trim元素

prefix :之前要添加的字符

prefixOverrides:之前的后面要去除的字符

suffix:之后要添加的字符

suffixOverrides:后面要去除的字符

<insert id="insertStudent" parameterType="Student">insert into student<trim prefix="("  suffix=")" suffixOverrides=","><if test="sname != null">sname,</if><if test="birthday != null">birthday,</if><if test="ssex != null">ssex,</if><if test="classid != null">classid,</if></trim>values<trim prefix="("  suffix=")" suffixOverrides=","><if test="sname != null">#{sname},</if><if test="birthday != null">#{birthday},</if><if test="ssex != null">#{ssex},</if><if test="classid != null">#{classid},</if></trim></insert>
foreach 元素(批量处理)

在这里插入图片描述

<!-- 批量删除 --><delete id="deleteStudentArray" >delete from student <where> 	<foreach collection="array" item="sid" open="sid in (" close=")" separator=",">#{sid}</foreach> 	</where></delete><!-- 批量添加 --><insert id="addStudentList">insert into student (sname,birthday,ssex,classid)<foreach collection="list" item="x" open="values" separator=",">(#{x.sname},#{x.birthday},#{x.ssex},#{x.classid})	</foreach></insert>
bind 元素
<select id="findStudentsLikeSname" parameterType="string" resultType="Student"><!-- 方式一 :传入的参数就是(%x%) -->select *from student where sname like #{sname} <!-- 方式二 concat()拼接-->	select *from student where sname like concat("%","#{sname}","%")<!-- 方式三 -->	select *from student where sname like "%${sname}%"<!-- 方式四 '"交替出现 -->select *from student where sname like "%"#{sname}"%"<!--方式五  推荐 --><bind name="xxx" value="'%'+_parameter+'%'"/>select *from student where sname like #{xxx}</select>
#{} 和 ${}的区别

​ #{},防止SQL注入的占位符,防止SQL注入
​ ${} 字符串的替换,不能防止SQL注入

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

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

相关文章

【云原生】docker-compose单机容器集群编排工具

目录 一、docker-compose容器编排的简介 二、docker-compose的使用 1、docker-compose的安装 2、docker-compose的配置模板文件yaml文件的编写 &#xff08;1&#xff09;布尔值类型 &#xff08;2&#xff09;字符串类型 &#xff08;3&#xff09;一个key有多个值 &am…

Linux——shell程序的简单实现

shell程序的简单实现 本章思维导图&#xff1a; 注&#xff1a;本章思维导图对应的.xmind和.png文件都已同步导入至资源&#xff0c;可免费查阅 在学习完有关进程的知识后&#xff0c;我们就可以开始尝试自己实现一个简单的shell程序了。 注&#xff1a;在编写简单的shell程…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程&#xff08;源码解读&#xff09; BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor&#xff1a; From java doc&#xff1a; BeanFactoryPostProcessor may interact with and modify bean defin…

openGaussdb5.0单点企业版部署_Centos7_x86

本文档环境&#xff1a;CentOS7.9 x86_64 4G1C40G python2.7.5 交互式初始化环境方式 介绍 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&#xff0c;结合企业级场景需求&#xff0c;持续…

群晖安装Drive Server与Office实现团队固定公网地址远程办公

文章目录 本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是&#xff1a; 1.Word&#xff0c;PPT&#xff0c;Excel等重要文件存在本地环境&#xff0c;如何在编…

基于Prompt Learning的信息抽取

PTR: Prompt Tuning with Rules for Text Classification 清华&#xff1b;liuzhiyuan&#xff1b;通过规则制定subpromptRelation Extraction as Open-book Examination: Retrieval-enhanced Prompt Tuning Relation Extraction as Open-book Examination: Retrieval-enhance…

防御保护(2-6)

第二天 防火墙 防火墙的主要职责---控制和防护---安全策略---翻过去可以根据安全策略来抓取流量之后做出对应的动作。 防火墙分类 按物理特性划分&#xff1a;软件防火墙、硬件防火墙 按性能划分&#xff1a;百兆级防火墙、千兆级防火墙 按防火墙结构划分&#xff1a;单一主机…

为何PostgreSQL性能优于MySQL?

为何PostgreSQL性能优于MySQL? 在数据库选择过程中&#xff0c;性能是一个至关重要的考虑因素。PostgreSQL和MySQL是两个广泛使用的关系型数据库管理系统&#xff0c;它们在性能方面有着不同的特点。本文将深入探讨为何PostgreSQL在某些方面表现优于MySQL&#xff0c;并解释其…

Kotlin基础——高阶函数和内联函数

高阶函数 高阶函数以另一个函数作为参数或者返回值&#xff0c;其可用Lambda或函数引用表示 函数类型 下面将Lambda存储在sum变量中&#xff0c;其是函数类型 val sum { x: Int, y: Int -> x y }完整的函数类型为(para1,prar2…) -> returnValue val a: Int 0 va…

座位预约|座位预约小程序|基于微信小程序的图书馆自习室座位预约管理系统设计与实现(源码+数据库+文档)

座位预约小程序目录 目录 基于微信小程序的图书馆自习室座位预约管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员服务端功能模块 2、学生微信端功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

js实现动漫拼图2.0版

比较与1.0版&#xff0c;2.0版就更像与华容道类似的拼图游戏&#xff0c;从头到尾都只能控制白色块移动&#xff0c;而且打乱拼图和求助的实现与1.0都不相同 文章目录 1 实现效果2 实现思路2.1 打乱拼图2.2 求助功能2.3 判赢 3 代码实现 js实现动漫拼图1.0版 https://blog.csdn…

网络协议与攻击模拟_10DHCP攻击与DHCP欺骗

一、DHCP的报文格式 Message type&#xff1a;消息类型&#xff08;1表示请求&#xff0c;2表示响应&#xff09;Hardware type&#xff1a;硬件类型Hardware address length&#xff1a;硬件地址长度Hops&#xff1a;DHCP报文经过中继的数目。Transaction ID&#xff1a;事务…