动态SQL 模糊查询 联表查询

article/2025/8/31 2:48:57

1. 正文

1. set标签 和 foreach标签 trim标签 sql片段

2. mybatis映射文件处理特殊字符.

3. mybatis完成模糊查询。

4. 联表查询

2. 动态sql

2.1 set标签

这个配合if标签一起用,一般用在修改语句。如果传递的参数值为null,那么应该不修改该列的值。

<!--set:可以帮我们生成关键字 set 并且可以去除最后一个逗号--><update id="update">update account<set><if test="name!=null and name!=''">name=#{name},</if><if test="money!=null">money=#{money},</if><if test="isdeleted!=null">isdeleted=#{isdeleted},</if><if test="created!=null">created=#{created},</if><if test="updated!=null">updated=#{updated},</if></set>where id=#{id}</update>

2.2 foreach标签

循环标签.

查询:

<!-- select * from account where id in(2,3,5,7,0)如果你使用的为数组array  如果你使用的为集合 那么就用listcollection:类型item:数组中每个元素赋值的变量名open: 以谁开始close:以谁结束separator:分割符--><select id="findByIds" resultType="com.zjh.entity.Account">select * from account where id in<foreach collection="array" item="id" open="(" close=")" separator=",">#{id}</foreach></select>

删除:

 <delete id="batchDelete"><foreach collection="array" item="id" open="delete from account where  id in(" close=")" separator=",">#{id}</foreach></delete>

添加:

insert into account(name,isdeleted) values('ldh',0),('ldh2',0),('ldh4',0)<insert id="saveBatch">insert into account(name,isdeleted) values<foreach collection="list" item="acc" separator=",">(#{acc.name},#{acc.isdeleted})</foreach></insert>

2.3 sql片段

在执行查询语句时不建议大家使用select *, 建议大家把查询的列写出。

3. mybatis映射文件处理特殊字符.

   <!--第一种:转义标签 &nbsp; &lt;  第二种: <![CDATA[sql]]>--><select id="findByMaxMin" resultType="com.zjh.entity.Account"><![CDATA[select * from account where id >#{min} and id <#{max}]]></select>

4. mybatis完成模糊查询。

select * from 表名 where 列名 like '%a%'

(1)使用字符串函数 完成拼接 concat

<select id="findByLike" resultType="com.zjh.entity.Account">select * from account where name like concat('%',#{name},'%')
</select>

(2) 使用${}

<select id="findByLike" resultType="com.zjh.entity.Account">select * from account where name like '%${name}%'
</select>

通过观察: 发现使用${}实际上是字符串拼接,它不能防止sql注入, 而#{}它是预编译,它可以防止sql注入问题,#{}实际使用的PreparedStatement.

总结:

动态sql标签: if where (choose when otherwise) set foreach sql 处理特殊字符: <![CDATA[sql]]> 转义符 模糊查询: concat('',#{},'')   ${}

5. 联表查询

  1. 多对一 : 从多的一方来查询一的一方。

班级表:

|1-n

学生表:

根据学生id查询学生信息并携带班级信息。

select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=1

实体类:

package com.zjh.entity;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
/*** @author: jh* @create: 2022/6/2*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {private int id;private String name;private int age;private String sex;private Integer classId;
​private Clazz clazz;//学生所属的班级
}
//如何把联表查询体现到实体类上。
package com.zjh.entity;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
/*** @author: jh* @create: 2022/6/2*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {private Integer cid;private String cname;
​
}

xml:

<resultMap id="baseMap" type="com.zjh.entity.Student"><id column="stu_id" property="id"/><result column="stu_name" property="name"/><result column="stu_age" property="age"/><result column="sex" property="sex"/><result column="class_id" property="classId"/><!--association: 表示一的一方property: 它表示属性名javaType: 该属性名对应的数据类型--><association property="clazz" javaType="com.zjh.entity.Clazz"><id column="cid" property="cid"/><result column="cname" property="cname"/></association></resultMap><select id="findStudentById" resultMap="baseMap">select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}</select>

上面你要是绝的没有懂,那么这里可以使用的一个笨的方式: 但是不推荐。

返回类型就用map封装

//根据学生编号查询学员信息以及班级信息public Map findById(Integer id);<!--key:value--><select id="findById" resultType="java.util.Map">select <include refid="aa"/> from tb_stu s join tb_class c on s.class_id=c.id where s.id=#{id}</select>

http://chatgpt.dhexx.cn/article/V5rkYO2o.shtml

相关文章

动态sql模糊查询和分页

文章目录 动态sql模糊查询查询返回结果集的处理分页 动态sql BookMapper xml bookservice 测试&#xff1a; MapperSql.test 运行&#xff1a; 模糊查询 BookMapper BookMapper.xml Bookservice StringUtiles 测试&#xff1a; 一共介绍了三种模糊查询的方法&#…

每日一课 | SQL模糊查找

07. SQL模糊查找 大家好&#xff0c;我是小C&#xff0c;上期给大家分享——通过查询条件实现数据过滤&#xff08;完结篇&#xff09; 本期分享内容&#xff1a;SQL模糊查找 本期小C邀请的是董旭阳老师&#xff08;资深数据库架构师&#xff09;为我们分享《SQL从入门到精通》…

设置 MYSQL 数据库编码为 utf8mb4

utf-8编码可能2个字节、3个字节、4个字节的字符&#xff0c;但是MySQL的utf8编码只支持3字节的数据&#xff0c;而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据&#xff0c;java程序中将报SQL异常&#xff1a; java.sql.SQLException: Inc…

utf8mb4 字符集(4字节 UTF-8 Unicode 编码)

最近做项目遇到APP评论中有 emoji 表情符号&#xff0c;结果导致插入 MySQL 数据库失败&#xff0c;找到 MySQL 官方相关内容&#xff0c;这里斗胆翻译一下。在翻译过程中有些不明白的地方&#xff0c;如BMP、collation等&#xff0c;都找到官方文档&#xff0c;给出了链接&…

UTF-8编码详解

1.ASCII编码 因为计算机只能处理数字&#xff0c;如果要处理文本&#xff0c;就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特&#xff08;bit&#xff09;作为一个字节&#xff08;byte&#xff09;&#xff0c;所 以&#xff0c;一个字节能表示的最大的…

mysql中的utf8与utf8mb4

一、如何设置utf8mb4 mysql中针对字符串类型&#xff0c;在设置charset的时候可以精确到字段。 如果只将某个字段设置utf8mb4&#xff0c;那么其他字段不会受影响。 如果针对表来设置&#xff0c;那么已经存在的字段依然是utf8&#xff0c;并且会多出utf8的标记&#xff0c;…

What is UTF-8?

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请点击人工智能教程 UTF-8 is a variable-width character encoding standard that uses between one and four eight-bit bytes to re…

图解unicode、utf8和utf8mb4

字符集和字符编码 字符集&#xff08;CCS: Coded Character Set&#xff09;&#xff1a; 就是一个表格&#xff0c;表示每个字符对应数字&#xff08;通常用16进制表示&#xff09;&#xff0c;比如unicode字符集中&#xff0c;数字1对应的就是U00031&#xff0c;字母a对应的…

UTF-8

UTF-8编码规则 UTF-8是Unicode的一种实现方式&#xff0c;也就是它的字节结构有特殊要求&#xff0c;所以我们说一个汉字的范围是0X4E00到0x9FA5&#xff0c;是指unicode值&#xff0c;至于放在utf-8的编码里去就是由三个字节来组织&#xff0c;所以可以看出unicode是给出一个…

MySQL 数据库字符集 utf8 和 utf8mb4 的区别

MySQL 的 utf8 实际上不是真正的 UTF-8。utf8 只支持每个字符最多三个字节&#xff0c;而真正的 UTF-8 是每个字符最多四个字节。 MySQL 一直没有修复这个 bug&#xff0c;他们在 2010 年发布了一个叫作 utf8mb4 的字符集&#xff0c; 绕过了这个问题。当然&#xff0c;他们并…

utf8和utf8mb4的区别

1. 基础知识 1.1 bit &#xff0c; byte &#xff0c; word 字 word 字节 byte (B) 位 bit (b) 1.2 单位换算 1字节 8位(1 byte 8bit) 1字 2字节(1 word 2 byte) 一个汉字 2字节 中文标点 三个字节 一个英文字母 一个字节 英文标点 一个字节 Em…

简单明了!utf8和utf8mb4的区别

一、简介 MySQL在5.5.3之后增加了这个utf8mb4的编码&#xff0c;mb4就是most bytes 4的意思&#xff0c;专门用来兼容四字节的unicode。utf8mb4是utf8 的超集&#xff0c;除了将编码改为utf8mb4外不需要做其他转换。当然&#xff0c;为了节省空间&#xff0c;一般情况下使用u…

浅谈uf8mb4字符集

要在 Mysql 中保存 4 字节长度的 UTF-8 字符&#xff0c;需要使用 utf8mb4 字符集&#xff08;mb4就是most bytes 4的意思&#xff0c;专门用来兼容四字节的unicode&#xff09;&#xff0c;但只有 5.5.3 版本以后的才支持。 为了获取更好的兼容性&#xff0c;应该总是使用 utf…

学习笔记4-K均值聚类算法

K-均值聚类的一般流程 &#xff08;1&#xff09;收集数据&#xff1a;可以使用任何方法收集数据 &#xff08;2&#xff09;准备数据&#xff1a;需要数值型数据来计算距离&#xff0c;也可以将标称型数据映射为二值型数据再用于距离计算 &#xff08;3&#xff09;分析数据…

【吴恩达机器学习-笔记整理】k-means(k-均值聚类算法)

目录&#xff1a; &#x1f335;&#x1f335;&#x1f335;前言一、应用二、k-means1、参数&#xff1a;2、过程3、应用4、优化目标5、随机初始化6、聚类数量的选择 ❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭&#xff01; &#x1f335;&#x1f335;&#x1f335;前言 ✨你好…

25.K-均值算法的介绍及实现过程

主要内容 K-均值算法的介绍K-均值算法的实现过程K-均值算法的具体例子实现过程 一、K-均值算法的介绍 K-均值&#xff08;K- means&#xff09; ** 是最普及的聚类算法**&#xff0c;算法接受一个未标记的数据集&#xff0c;然后将数据聚类成不同的组 聚类算法 是无监督学习…

K-means(K均值聚类算法)算法笔记

K-means&#xff08;K均值聚类算法&#xff09;算法笔记 K-means 算法&#xff0c;是比较简单的无监督的算法&#xff0c;通过设定好初始的类别k&#xff0c;然后不断循环迭代&#xff0c;将给定的数据自动分为K个类别。事实上&#xff0c;大家都知道K-means是怎么算的&#x…

K-近邻算法讲解以及实战

1.概述 邻近算法&#xff0c;或者说K最近邻(KNN&#xff0c;K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是k个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的…

第十五课.K均值算法

目录 K均值算法原理K均值算法的改进&#xff1a;K-meansnumpy实现K-means K均值算法原理 K均值&#xff08;K-means&#xff09;算法属于无监督学习中的聚类算法&#xff1b;聚类是根据样本特征向量之间的相似度或距离&#xff0c;将样本数据划分为若干个样本子集&#xff0c;…

K均值与K近邻算法简析

回顾了一下机器学习的简单算法。 原文链接&#xff1a;https://blog.csdn.net/zll0927/article/details/17000675 K-Means介绍 K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足&#xff1a;同一聚类中的对象相似度…