4.动态SQL(if,choose,where,set,trim,foreach遍历)的使用+$和#的区别

news/2024/12/22 15:19:00/

文章目录

  • 动态sql
    • 一、动态sql
      • 1.if条件判断
      • 2、choose、when、otherwise
      • 3、where标签
      • 4、set标签
      • 5、`trim标签`
        • 1)替代where标签效果
        • 2) 生成set标签效果
      • 6、foreach迭代遍历
        • 1)属性
      • 7.`SQL`标签-提取重用的SQL代码片段
      • 8、bind标签
      • 9.MyBatis中`${}和#{}`的区别:

sql_1">动态sql

sql_3">一、动态sql

常见动态标签:

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

1.if条件判断

if标签的test属性判断成立,就会将标签对之间的sql语句拼接到主sql语句上

//如果根据传入参数(emp_name和phone)筛选数据   
<select id="queryByNameAndTel" resultType="employee">select emp_name, phone, address, salaryfrom employeewhere 1=1<if test="empName != null">AND emp_name = #{empName}</if><if test="phone != null">and phone = #{phone}</if> </select>

2、choose、when、otherwise

相当与java条件语句Switch语句

//根据多条件筛选语句  
<select id="queryByNameAndTel" resultType="employee">select emp_name, phone, address, salaryfrom employeewhere 1=1<choose><when test="empName != null">and emp_name = #{empName}</when><when test="phone != null">and phone = #{phone}</when><otherwise>and dept_id = 1</otherwise></choose></select>

3、where标签

若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

     <select id="queryByNameAndTel" resultType="employee">select emp_name, phone, address, salaryfrom employee<where><if test="empName != null">and emp_name = #{empName}</if><if test="phone != null">and phone = #{phone}</if></where></select>

4、set标签

用于动态更新语句的类似解决方案叫做 set,

动态更新需要更新的字段,忽略不更新的字段

 <update id="updateByPrimaryKeySelective">update employee<set><if test="empName != null">emp_name = #{empName},</if><if test="phone != null">phone = #{phone},</if><if test="address != null">address = #{address},</if><if test="salary != null">salary = #{salary}</if></set>where id = #{id}</update>

5、trim标签

可以使用属性给sql语句添加前缀和后缀删除前缀和后缀

包含属性:

属性说明
prefix(添加前缀)添加前面的关键字(在标签开始位置,添加属性中的内容)
suffix(添加后缀)添加后面的关键字(在标签结束位置,添加属性中的内容)
prefixoverrides(删除前缀)去掉第一个关键字(所有子标签中第一子标签中的前缀关键字)
suffixoverrides(删除后缀)去掉最后一个关键字(所有子标签中最后一个子标签后缀的关键字)
1)替代where标签效果

prefix添加前缀where,代替where标签;prefixOverrides删除子语句判断条件的and | or

  <select id="queryByNameAndTel" resultType="employee">select emp_name, phone, address, salaryfrom employee<trim prefix="where" prefixOverrides="AND|OR"><if test="empName != null">and emp_name = #{empName}</if><if test="phone != null">and phone = #{phone}</if></trim></select>
2) 生成set标签效果

prefix添加前缀set替代set标签,suffixOverrides删除子语句尾部的,

<update id="updateByPrimaryKeySelective">update employee<trim prefix="set" suffixOverrides=","><if test="empName != null">emp_name = #{empName},</if><if test="phone != null">phone = #{phone},</if><if test="address != null">address = #{address},</if><if test="salary != null">salary = #{salary}</if></trim>where id = #{id}</update>

6、foreach迭代遍历

应用于—批量插入或批量删除

1)属性
属性说明
collection集合的名字 默认为collection或者list ,可以通过@Param(“listName”)
item循环出的每个对象 在访问对象属性时,需要加前缀employee.id
open前缀
close后缀
separator以值进行分隔
index索引(当前迭代的序号)
<insert id="addBath">insert into dept values<foreach collection="deptList" item="dept" open="(" separator="),(" close=")"><!--属性值前加入前缀item值-->#{dept.deptId},#{dept.deptName},#{dept.remark}</foreach><!--           或者这样写也可以<foreach collection="deptList" item="dept" separator=",">( #{dept.deptId},#{dept.deptName},#{dept.remark})</foreach>--></insert>

java%2Ffengyanwen%2F202406221635850.png%20%22image-20240622163538626%22&pos_id=img-MhOCAJD6-1720455002302" alt="外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传" />

7.SQL标签-提取重用的SQL代码片段

通过sql标签封装常使用的字段,通过include标签refid引用其id

 <sql id="base_column_sql">account_id ,account_no,account_name,balance</sql><select id="queryByNo" resultMap="base-result-account">select<include refid="base_column_sql"/>from accountwhere account_no = #{accountNo}</select>

8、bind标签

select id, dept_name as deptName, remark from dept where dept_name like #{dn}

9.MyBatis中${}和#{}的区别:

都是用于SQL语句中的占位符?

  1. #参数值直接替换到sql语句,并对参数进行类型转换和字符转义处理;可以有效防止SQL语句注入问题;
  2. $不会进行类型转换和字符转义处理,可能到值sql注入问题
模糊查询为例:
<select id="getBookByNname" resultType="com.example.demo.entity.BookInfo">select * from book_info where book_name like '${bookName}';
</select><select id="getBookByName" resultType="com.example.demo.entity.BookInfo">select * from book_info where book_name like concat('%',#{bookName},'%');
</select>

book_name like ‘${bookName}’;

select * from book_info where book_name like concat('%',#{bookName},'%'); ~~~

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

相关文章

昇思25天学习打卡营第17天|linchenfengxue

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…

网络安全筑基篇——反序列化漏洞

目录 序列化是什么&#xff1f; 反序列化又是什么&#xff1f; 反序列化漏洞的危害 代码样例 常见的魔术方法 修复方式有哪些&#xff1f; 常见的反序列化漏洞 Shiro反序列化漏洞 Fastjson反序列化漏洞 序列化是什么&#xff1f; 将实例化对象转换成字节流的过程 反序…

Pinia在vue项目中的使用

Pinia是Vue 3官方推荐的状态管理模式&#xff0c;由尤雨溪创建并集成到了 Vue.js 中&#xff0c;它是一个轻量级、纯粹基于函数的思想实现的应用状态管理库。Pinia的设计理念类似于Redux&#xff0c;但它更简单易用&#xff0c;更适合于小型到中型的单文件组件应用。 在Vue 3项…

数据库(表)

要求如下&#xff1a; 一&#xff1a;数据库 1&#xff0c;登录数据库 mysql -uroot -p123123 2&#xff0c;创建数据库zoo create database zoo; Query OK, 1 row affected (0.01 sec) 3&#xff0c;修改字符集 mysql> use zoo;---先进入数据库zoo Database changed …

设计模式7-装饰模式

设计模式7-装饰模式 写在前面动机模式定义结构代码推导原始代码解决问题分析 选择装饰模式的理由1. 职责分离&#xff08;Single Responsibility Principle&#xff09;2. 动态扩展功能3. 避免类爆炸4. 开闭原则&#xff08;Open/Closed Principle&#xff09;5. 更好的组合复用…

Linux多进程和多线程(五)进程间通信-消息队列

多进程(五) 进程间通信 消息队列 ftok()函数创建消息队列 创建消息队列示例 msgctl 函数示例:在上⼀个示例的基础上&#xff0c;加上删除队列的代码 发送消息 示例: 接收消息示例 多进程(五) 进程间通信 消息队列 消息队列是一种进程间通信机制&#xff0c;它允许两个或多个…

6、Redis系统-数据结构-05-整数

五、整数集合&#xff08;Intset&#xff09; 整数集合是 Redis 中 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不大时&#xff0c;就会使用整数集合这个数据结构作为底层实现。整数集合通过紧凑的内存布局和升级机制&#xff0c;实现了…

Linux Vim基础教程

Linux Vim 简单教程&#xff1a; 一、安装与启动 Vim 首先&#xff0c;确保你的 Linux 系统已经安装了 Vim。在大多数 Linux 发行版中&#xff0c;你可以通过包管理器来安装 Vim。以下是在不同发行版中安装 Vim 的命令&#xff1a; Ubuntu/Debian: sudo apt-get install vimF…