MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

news/2024/9/19 0:37:08/ 标签: mybatis

#{}和${}区别:

#{}:是占位符,采用预编译的方式sql中传值,防止sql注入,如果我们往sql中列值传递一般使用

#{}。

${}:采用字符串拼接的方式直接拼接到sql语句中,一般不用于sql列值传递,用于动态传递列名

列如:使用列名进行排序,order by ${列名},根据动态传递的列名进行排序

查询列      select ${列名1},${列名2}...根据动态传递的列名进行查询

底层实现不同:

#{}:预编译的方式 ,防止sql注入,更加安全

${}:字符串直接拼接

使用场景不同

#{} :适合列值传递

${}:适合动态列名传递

特殊处理定义 ResultMap(多表关联处理结果集)

俩个元素  collection 、association

collection:关联元素处理一对多关联

例如专业与学生是一对多,专业一方配置学生集合

public class Major {private int id;//专业private String name;//专业名称private List<Student> students;//专业下学生集合
}

在学生多方配置专业一方

public class Student {private int id;private int num;private String name;private String gender;private Major major;//建议在学生表中关联专业,将专业信息封装到专业对象中
}

使用ResultMap组装查询结果

<!--专业关联学生
一对多
查询到的多个学生放到一个集合当中-->
<resultMap id="majorMap" type="Major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="list" ofType="Student"><result column="num" property="num"></result><result column="sname" property="name"></result></collection></resultMap><select id="findMajorById" resultMap="majorMap">selectm.id,m.name,s.num,s.name snamefrom major m inner join student s on m.id=s.majorid where m.id=#{id}</select>

代码还有一种写法,这种写法适合分页场景,

<!-- 分页场景--><resultMap id="majorMap1" type="Major"><id column="id" property="id"></id><result column="name" property="name"></result><collection property="students" javaType="list" select="findStudents" column="id"></collection></resultMap><select id="findMajors1" resultMap="majorMap1">select id,name from major</select><select id="findStudents" resultType="Student">select num,name from student where majorid=#{id}</select>

 

association:多表关联,嵌套查询,将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据

例如查询学生的专业,学生表关联专业,学生表是主表,专业表是关联表

学生类属性定义

 private int id;private int num;private String name;private String gender;
//private String mname;学生表中重新定义专业表中已经定义的,发送冗余//private int id;private Major major;//建议在学生表中关联专业,将专业信息封装到专业对象中

专业类属性定义

private int id;//专业
private String name;//专业名称
<resultMap id="studentMap1" type="Student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><association property="major"  javaType="Major" select="findMajorByid" column="majorid"></association>
</resultMap>
<select id="findStudent1" resultMap="studentMap1">select id,num,name,gender,majorid from student  where id=#{id}
</select>
<select id="findMajorByid" resultType="Major">select name from major where id=#{majorid}
</select>

代码还有一种写法 俩次查询写成一次查询

     <!--关联查询--><resultMap id="studentMap" type="student"><id column="id" property="id"></id><result column="num" property="num"></result><result column="name" property="name"></result><result column="gender" property="gender"></result><association property="major" javaType="major"><result column="mname" property="name"></result></association></resultMap><select id="findStudent"  parameterType="int" resultMap="studentMap">select
s.id,
s.num,
s.name,
s.gender,
m.name mname
from student s inner join major m on s.majorid=m.id where s.id=#{id}</select>

注解方式

 @select:插入sql,与xml select sql语法一样

@Select("select id name from major")

@insert:插入sql,与xml insert sql语法一样

@update:插入sql,与xml update sql语法一样

@delete:插入sql,与xml delete sql语法一样

使用注解方式使用sql语句是,这种只适用于一些简单的sql语句,复杂的sql在xml映射文件中写会方便一些。

MyBatis动态SQL

动态sql是mybatis的强大特性之一,mybatis中实现动态sql的元素主要有if 、choose  when otherwise、trim、set、where、foreach。

if元素:if标签可以对传入的条件进行判断

<select id="findActiveBlogWithTitleLike"resultType="Blog">SELECT * FROM BLOGWHERE state = ‘ACTIVE’<if test="title != null">AND title like #{title}</if>
</select>

如果if中条件不成立,就会查询满足state = ‘ACTIVE’的数据,如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果

choose元素:不使用所有条件,而是在多个条件中使用一个或是几个

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when>/*可以有多个when 但不能没有when*/<otherwise>AND featured = 1</otherwise>/*只能有一个otherwise 或者是没有*/</choose>
</select>

where、set、trim元素:where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。

用于动态更新语句的类似解决方案叫做 setset 元素可以用于动态包含需要更新的列,忽略其它不更新的列。比如:

<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id}
</update>

这个例子中,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

或者,你可以通过使用trim元素来达到同样的效果:

<trim prefix="SET" suffixOverrides=",">...
</trim>

foreach元素:主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach

元素的属性主要有 item,index,collection,open,separator,close。
item 表示集合中每一个元素进行迭代时的别名,index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open 表示该语句以什么开始,
separator 表示在每次进行迭代之间以什么符号作为分隔符,close 表示以什 么结束,
在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。
如果传入的是单参数且参数类型是一个 List 的时候,collection 属 性值为 list
如果传入的是单参数且参数类型是一个 array 数组的时候, collection 的属性值为array

示例:

1、批量删除

<delete id="deleteTeacher">delete  from teacher where id in<foreach item="id" collection="array" open="(" separator="," close=")">#{id}</foreach>/* 循环    批量删除  */
</delete>

 2、循环查询

<select id="findTeacher" resultType="com.ffyc.mybatispro.model.Teacher">select<foreach item="col" collection="list" separator=",">${col}</foreach>from teacher
</select>

mybatis中文官网:mybatis – MyBatis 3 | 简介icon-default.png?t=N7T8https://mybatis.org/mybatis-3/zh_CN/index.html


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

相关文章

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中&#xff0c;我手动对各个因子进行了回测&#xff0c;但是数据结果并不是十分理想&#xff0c;难道基本面指标真的和股票走势关系不大么&#xff1f; 这里我还是准备再测试一下&#xff0c;策略如下&#xff1a; &#xff08;1&#xff09;首先我获取了一下…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

如何识别视频里的声音转化为文字?视频转文字方法

如何识别视频里的声音转化为文字&#xff1f;识别视频声音转文字技术&#xff0c;不仅极大地提升了信息处理的效率&#xff0c;还促进了跨语言沟通和文化交流。在全球化背景下&#xff0c;它成为了连接不同语言群体的桥梁。此外&#xff0c;随着人工智能技术的不断进步&#xf…

【Python】标准库的使用

Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效率 库 就是是别人已经写好了的代码&#xff0c;可以让我们直接拿来用 荀子曰: “君子性非异也&#xff0c;善假于物也” 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习…

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记 本文介绍通义实验室最新的多模态手机智能体工作——Mobile-Agent。 一、大模型智能体背景 1.1 大模型智能体的优势 随着大模型的高速发展&#xff0c;大模型智能体成为热门研究方向&#xff0c;受到工业界和学术…

手把手教你从开发进度划分测试

一.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff1a;软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;TDD&#xff1a;测试驱动开发&#xff09;…

2024.9.1 刷题总结

2024.9.1 **每日一题** 1450.在既定时间做作业的学生人数&#xff0c;这是一道简单的模拟题&#xff0c;我们只需要判断每个学生的作业时间是否包含询问时间即可&#xff0c;具体判断方法为开始时间小于等于访问时间&#xff0c;结束时间大于等于访问时间。 class Solution { …

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

1 产品简介 SparkShop开源商城&#xff08;也被称为星火商城&#xff09;是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景&#xff0c;包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌&#xff0c;都可以通过Spar…

Ubuntu下安装NVIDIA-SMI

环境 显卡&#xff1a;gt1030 系统&#xff1a;Ubuntu22.04 安装 1、查询显卡GeForce GT 1030 rootapq-K07-C236:/home# lspci 00:00.0 Host bridge: Intel Corporation 8th/9th Gen Core 8-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] (rev 0d) 0…

深入理解Java序列化:从入门到实践

在前面的学习中我们简单的学习到了对象流的使用&#xff0c;我们先来回顾一下 对象流 在Java中&#xff0c;对象流是一种特殊的输入输出流&#xff0c;用于处理对象的序列化和反序列化操作。对象流主要包括ObjectOutputStream和ObjectInputStream两个类。 ObjectOutputStrea…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——结构与材料工程师 岗位意向——结构 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff…

【hot100篇-python刷题记录】【跳跃游戏】

R6-贪心算法 符合贪心的原因是&#xff1a; 我们要走到最后可以每次都选择尽可能远的来走&#xff0c;其次&#xff0c;能走到该步意味着该步以前都能到达。因此&#xff0c;局部最优解可以代表全局最优解。 class Solution:def canJump(self, nums: List[int]) -> bool:#最…

uniapp 封装uni.login 实现全局调用

封装utils app.vue中 使用globalData 注册 utils 页面中使用方法 定义app 调用方法

Linux 数据结构 哈希表 排序

哈希表: 哈希: 将数据通过哈希算法映射称为一个键值 存时在键值对应的位置存储 取时通过键值对应的位置查找 哈希冲突&#xff08;哈希碰撞&#xff09;&#xff1a;多个数据通过哈希算法映射成同一个键值 存储数字: 排序算法&#xff1a; 1.冒泡排…

TeamTalk消息服务器(群组相关)

具体的流程如下介绍&#xff0c;后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…

AWS api数据信息获取(boto3)

GitHub - starsliao/TenSunS: &#x1f984;后羿 - TenSunS(原ConsulManager)&#xff1a;基于Consul的运维平台&#xff1a;更优雅的Consul管理UI&多云与自建ECS/MySQL/Redis同步Prometheus/JumpServer&ECS/MySQL/Redis云监控指标采集&Blackbox站点监控维护&漏…

亚马逊aws的弹性与可扩展性解析

欢迎来到雲闪世界。可以使用各种服务和工具在 AWS 上实现可扩展性和弹性。例如&#xff0c;AWS Application Auto Scaling 是一种可以自动调整容量以低成本实现出色应用程序性能的服务。这允许轻松设置跨多个服务的多个资源的应用程序扩展。让我们来谈谈弹性和可扩展性之间的区…

Magisto——AI分析视频素材,自动生成剪辑、拼接和添加音乐的成品视频

一、Magisto介绍 Magisto 是一个基于人工智能的视频编辑应用程序&#xff0c;旨在帮助用户快速创建专业水准的视频。它通过自动化处理&#xff0c;简化了视频剪辑、效果添加和音频同步等复杂步骤&#xff0c;使用户能够轻松地将视频、图片和音乐整合成一个完整的短片。 Magis…