学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于Mybatis的相关操作吧

        

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一.Mybatis动态SQL如何应用

1.需求

2.问题分析

3.为什么使用动态SQL

二.Mybatis中的常用标签

1.if标签

2.foreach标签

三. 使用Mybatis中的动态SQL完成模糊查询

1.使用#{字段名}

2.使用${字段名}

3.使用concat{'%',#{字段名},'%'}

四、MyBatis结果映射 

1.resultType进行结果映射

2.resultMap进行结果映射


在学习一个东西之前,我们应该要知道它能够给我带来哪些好处,这样的话,我们学习它才会更有目标性,更有方向感。那我们采用对比的方式,来看看Mybatis到底解决了我们什么问题

        当我们还是初级开发工程师的时候,可能写过这样的代码:

//我们需要修改商品的信息,那我们就需要拿到它的id,然后再去修改它的相关信息
String sql="update goods set bname =?, price=? where bid =?"
//如果我此时没有传递bname,因为在我的业务功能中我不需要修改bname,
//那么我在传参的时候我就不会给它传递值,我预想的结果应该是它会照样是之前的那个值,
//可是它却变成了null!!!
String sql="update goods set bname =null, price=1232 where bid =2"
//这是因为我们没有传值,所以会默认给一个null值

        还有当我们写了电商项目中的购物车,那我们应该就会遇到这样的情况:当我们需要全选进行结算时。那么我们需要拿到用户所选商品的id,如果用户选择了多个,那么我们就要将这几个用户选中的id接收(数组),然后遍历,再将其分割,再执行sql语句...

        类似上述这样的情况,还有很多,它们都指向了一个问题:就是我们的sql语句没法很好的被改动,一动则要修改很多地方,所以很多初级开发员通常不会选择动sql,而是选择去适应sql语句,多写一些代码,但这样往往是行不通的...

        所以,我们今天要了解的是一个秘密神器--Mybatis中的动态sql!!!

一.Mybatis动态SQL如何应用

1.需求

假设我们要查询用户信息,但是用户的年龄可能在不同的范围内,我们需要根据年龄的不同来查询不同的信息。

2.问题分析

这个问题需要我们在运行时根据年龄的不同来生成不同的SQL语句,这就需要使用到动态SQL

3.为什么使用动态SQL

因为动态SQL可以根据不同的条件生成不同的SQL语句,这样就可以满足我们的需求

应用过程和解答步骤:首先,我们需要在Mapper接口中定义一个方法,该方法接收一个年龄参数;然后,在对应的XML文件中编写动态SQL;最后,在Service层调用这个方法。

【如果年龄小于18岁,那么就查询用户的名字和年龄;如果年龄大于等于18岁且小于60岁,那么就查询用户的姓名、年龄和性别;如果年龄大于等于60岁,那么就查询用户的姓名、年龄和电话】

上面的文字分析,你或许还是会觉得很懵,那么接下来我就用代码来演示意识使用动态SQL的好处, 那么我将会讲到mybatis动态SQL中比较常用的两种的标签

二.Mybatis中的常用标签

1.if标签

假设我们需要查询某个书城的所有神话小说,包括书名中含有为"圣墟"的和书本ID为56的。 首先需要根据书名中含有为"圣墟"的查询到对应的信息,然后根据书本ID和书名查询到对应的书本信息

这里需要使用if标签来实现动态拼接SQL

 d. 应用过程和解答步骤:首先使用if标签判断书本ID是否存在,如果存在则拼接查询书本信息的SQL语句,书名也是一样,如果都存在,则将这两个SQL语句拼接起来,得到最终的查询结果

<select id="selectBook" parameterType="Book" resultType="Book">SELECT * FROM Book WHERE 1=1<if test="bname!= null">AND bname like #{bname}</if><if test="bid!= null ">AND bid like #{bid}</if>
</select>

2.foreach标签

 <select id="selectByBid" resultType="com.wh.model.Book" parameterType="java.util.List" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bid in<foreach collection="bids" item="bid" open="(" close=")" separator=",">#{bid}</foreach></select>

然后需要在BookMapper中写方法

 List<Book> selectByBid(@Param("bids") List bids);

BookBiz

  List<Book> selectByBid(List bids);

BookBizImpl

  @Overridepublic List<Book> selectByBid(List bids) {return bookMapper.selectByBid(bids);}

测试

  @Testpublic void selectByBid() {List<Integer> bids = Arrays.asList(new Integer[]{56,57,58});bookBiz.selectByBid(bids).forEach(System.out::println);}

结果

三. 使用Mybatis中的动态SQL完成模糊查询

1.使用#{字段名}

 <select id="selectBooksLike1" resultType="com.wh.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like #{bname}
</select>

写完这个xml文件的代码之后,也需要像上面的foreach标签那样在BookBiz,BookBizImpl...中写相应的代码,因为代码逻辑都相似,在这里我就不做过多的赘述了...

结果

2.使用${字段名}

  <select id="selectBooksLike2" resultType="com.wh.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like ${bname}
</select>

 我们使用${字段名}的时候,需要格外注意,因为容易出现问题

 那么这是为什么呢?我们可以看下面这张图

我们也可以对比看看使用#{字段名}时,参数是什么样的

那我们应该怎么解决呢?其实很简单,看下面的代码👇

  <select id="selectBooksLike2" resultType="com.wh.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like '${bname}'
</select>

 那么就阔以看到结果了

3.使用concat{'%',#{字段名},'%'}

<select id="selectBooksLike3" resultType="com.wh.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like concat('%',#{bname},'%')
</select>

 结果

  •  #{字段名}和${字段名}的区别
    • #{}表示使用用户输入的值作为参数,而${}表示使用预定义的变量值作为参数
    • #自带引号$传参不带引号
    • ${}
    • ${}可能会导致SQL注入的风险,因为它允许我们在SQL语句中插入任意的值(SQL注入攻击:SQL注入是一种代码注入技术,攻击者通过在SQL语句中插入恶意的代码来控制数据库。为了防止SQL注入,我们应该尽量避免直接拼接SQL语句,而应该使用参数化查询或者其他安全的方法)
      • 举个例子说明一下:

        假设有一个Web应用,用户可以通过搜索框输入关键词查询商品信息。现在我们要分析这个应用是否存在SQL注入的风险。

        在这个应用中,用户输入的关键词会被拼接到SQL查询语句中,如:SELECT * FROM products WHERE keyword = '用户输入的关键词';。如果攻击者在搜索框中输入特殊字符,如单引号('),那么拼接后的查询语句可能变成:SELECT * FROM products WHERE keyword = '' OR '1'='1';。这样,原本的查询条件就被绕过了,攻击者可以获取到所有商品的详细信息

    • ${}也有它的好处,它可以用来做动态列
      • 举个例子说明一下:

        假设我们有一个销售记录表,其中包含以下列:产品ID、产品名称、销售数量、销售日期和销售价格。现在,我们希望根据销售数量对产品进行分组,并计算每个产品的总销售额。

        为了实现这个需求,我们需要在表中添加一个新列(例如“产品类别”),并根据销售数量对数据进行分组。然后,我们可以使用聚合函数(如SUM)来计算每个产品的总销售额,但是这样的话,我们需要修改的地方就有很多,那么这个时候我们就可以用到动态列,因为动态列允许我们在不修改表结构的情况下实现这个需求

四、MyBatis结果映射 

在使用MyBatis中拥有多个场景,返回的结果是多样的,resultType/resultMap

1返回单表的对应的实体类,仅有一个查询结果,可以用resultType/resultMap

2返回单表的对应的实体类,有多个查询结果,可以用resultType/resultMap

3返回多表对应结果,仅有一个查询结果,通常用resultType也可以用resultMap

4返回多表对应结果,有多个查询结果,通常用resultType也可以用resultMap

5返回单个列段,仅有一个查询结果,就用resultType

6返回单个列段,有多个查询结果,就用resultType

  总结就是在Mybatis中结果集的处理分为两种:

①resultMap:适合使用返回值是自定义实体类的情况

②resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

 如果是单表的情况下,resultType与resultMap都可以使用。
1 使用resultMap返回映射关系,指的是实体类与数据库字段的关系

2 使用resultType返回List<T>

3 使用resultType返回单个对象

4 使用resultType返回List<Map>【适用于多表查询返回结果集】

5 使用resultType返回Map<String,Object>【适用于多表查询返回单个结果集】
 

1.resultType进行结果映射

假设我们有一个用户表user,包含以下字段:id、name、age、gender、email。现在需要根据这些字段查询用户信息并返回一个User对象。

首先,我们需要定义一个User类,用于存储查询结果:

public class User {private int id;private String name;private int age;private String gender;private String email;// getter和setter方法省略
}

然后,在MyBatis的mapper文件中,我们可以使用resultType来映射查询结果到User对象上

<select id="getUserById" resultType="com.example.User">SELECT id, name, age, gender, emailFROM userWHERE id = #{id}
</select>

在上面的配置中,我们使用了resultType属性来指定查询结果映射到的Java对象的全限定名。这样,当执行查询语句时,MyBatis会自动将查询结果映射到指定的Java对象上

2.resultMap进行结果映射


假设我们有一个订单表order,包含以下字段:id、user_id、product_id、price、quantity。现在需要根据这些字段查询订单信息并返回一个Order对象

首先,我们需要定义一个Order类,用于存储查询结果:

public class Order {private int id;private int userId;private int productId;private double price;private int quantity;// getter和setter方法省略
}

然后,在MyBatis的mapper文件中,我们可以使用resultMap来映射查询结果到Order对象上。具体配置如下:


<resultMap id="OrderResultMap" type="com.example.Order"><id property="id" column="id" /><result property="userId" column="user_id" /><result property="productId" column="product_id" /><result property="price" column="price" /><result property="quantity" column="quantity" />
</resultMap>
<select id="getOrderById" resultMap="OrderResultMap">SELECT id, user_id, product_id, price, quantityFROM orderWHERE id = #{id}
</select>

在上面的配置中,我们定义了一个名为"OrderResultMap"的resultMap,它的type属性指定了要映射的Java对象的全限定名。接下来,我们为每个字段指定了对应的属性名和数据库表中的列名。最后,在查询语句中引用这个resultMap即可将查询结果映射到Order对象上。

需要注意的是,如果查询结果中的某个字段在Java对象中没有对应的属性,那么该字段将被映射为null。此外,如果查询结果中的某个字段在Java对象中有多个对应的属性,那么该字段的值将被映射为一个列表或数组

 好啦,今天的分享就到这了,希望能够帮到你呢!😊😊     

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

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

相关文章

分布式锁 总结

分布式锁 在应用开发中&#xff0c;特别是web工程开发&#xff0c;通常都是并发编程&#xff0c;不是多进程就是多线程。这种场景下极易出现线程并发性安全问题&#xff0c;此时不得不使用锁来解决问题。在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0…

五、修改官方FreeRTOS例程(STM32F1)

1、官方源码下载 (1)进入FreeRTOS官网&#xff1a;FreeRTOS官网 (2)下载FreeRTOS。(选择带示例的下载) 2、删减目录 (1)下载后解压的FreeRTOS文件如下图所示。 (2)删除下图中红框勾选的文件。 FreeRTOS-Plus&#xff0c;FreeRTOS的生态文件&#xff0c;非必需的。tools&…

【数据库】表操作 习题总结

目录 关系建表 数据库sql的执行顺序 内外连接的写法 1.设计一张商品表 2.设计一张老师表 3.设计一张图书表 4.查询练习 5.查询练习 6.设计一个考勤系统 7.设计一个学校宿舍管理系统 8.设计一个车辆违章系统 9.设计一个学校食堂管理系统 10.有一张员工表emp&#xf…

开源TTS+gtx1080+cuda11.7+conda+python3.9吊打百度TTS

一、简介 开源项目&#xff0c;文本提示的生成音频模型 https://github.com/suno-ai/bark Bark是由Suno创建的基于变换器的文本到音频模型。Bark可以生成极为逼真的多语种演讲以及其他音频 - 包括音乐、背景噪音和简单的声音效果。该模型还可以产生非言语沟通&#xff0c;如…

Android 11 Display亮灭屏

系统休眠唤醒的时候会涉及到亮灭屏&#xff0c;下面分析下系统&#xff08;高通8155平台&#xff09;Display亮灭屏流程 1. 点亮屏幕 点亮屏幕入口在framework/base/下面LightsService.java&#xff0c;然后通过调用SurfaceControl.java ,最终调用到framework/native下面的Sur…

【洁洁送书第五期】为什么我们要了解可观测性工程

导读 可观测性已成为一个热门话题&#xff0c;并广受关注。随着它的普及&#xff0c;“可观测性”不幸被误作“监控”或“系统遥测”的同义词。可观测性是软件系统的一个特征。而且&#xff0c;只有当团队采用新的实践进行持续开发时&#xff0c;才能在生产软件系统中有效利用这…

Day14-2-NodeJS后端开发流程

Day14-NodeJS后端工程化流程 一 apifox工具 apifox是目前最好的接口调试工具 1 环境搭建 安装登录创建项目接口里面创建对应文件夹在指定的文件夹里面创建接口2 GET请求 1 apifox发送GET请求 2 后端接收GET请求 router.get("/getUserinfo"

Azure防火墙

文章目录 什么是Azure防火墙如何部署和配置创建虚拟网络创建虚拟机创建防火墙创建路由表&#xff0c;关联子网、路由配置防火墙策略配置应用程序规则配置网络规则配置 DNAT 规则 更改 Srv-Work 网络接口的主要和辅助 DNS 地址测试防火墙 什么是Azure防火墙 Azure防火墙是一种用…

EndNote(四)【文献引文格式、同步、智能分组、引文报告、文献笔记导出】

参考文献格式&#xff1a;&#xff08;官网引文格式下载文章引文格式更新-word&#xff09; 官网引文格式下载 网址&#xff1a;Downloads | EndNote 点击output styles&#xff1a; 下下来之后&#xff0c;放在这个路径下&#xff1a; 双击看一下&#xff1a; ok. 比如我们要…

引领行业高质量发展|云畅科技参编《低代码开发平台创新发展路线图(2023)》

8月8日-9日&#xff0c;中国电子技术标准化研究院于北京顺利召开《低代码开发平台创新发展路线图&#xff08;2023&#xff09;》封闭编制会。云畅科技、浪潮、百度、广域铭岛等来自低代码开发平台解决方案供应商、用户方、科研院所等近30家相关单位的40余位专家参与了现场编制…

mybatis动态SQL的运用

一、mybatis动态SQL update 表名 set name?,age? where id? 如果我们的前台没有传参&#xff0c;比如没有传入我们的name值&#xff0c;name就会把字段值改为null&#xff0c;这就违背了我们编码的初衷。 许多人会使用类似于where 1 1 来作为前缀&#xff0c;在代码中会用i…

STL---vector

目录 1.vector的介绍及使用 2.vector接口说明及模拟实现 2.1vector定义 2.2vector迭代器的使用 2.3vector容量 2.4vector增删查改 3迭代器失效 4.使用memcpy拷贝 5.模拟实现 1.vector的介绍及使用 vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数…

战略定位、战略咨询、战略定位咨询:一站式解决您的困惑

战略定位、战略咨询和战略定位咨询是三个密切相关但又不同的概念。它们都与企业的发展战略有关&#xff0c;但各自的侧重点不同。在这篇文章中&#xff0c;我们将详细介绍这三个词的定义&#xff0c;并为您提供一些实用的建议&#xff0c;帮助您更好地理解和应用这些概念。 战略…

ardupilot开发 --- 仿真篇

环境 安装wsl2&#xff0c;win11自带wsl&#xff0c;win10需要安装&#xff1b;git clone ardupilot 源码&#xff1b;安装 Linux下的build环境&#xff1b;安装 flightgear&#xff08;非必须&#xff09; sudo apt-get install flightgearbuild 想要仿真的载具类型&#xff…

漏洞挖掘和安全审计的技巧与策略

文章目录 漏洞挖掘&#xff1a;发现隐藏的弱点1. 源代码审计&#xff1a;2. 黑盒测试&#xff1a;3. 静态分析工具&#xff1a; 安全审计&#xff1a;系统的全面评估1. 渗透测试&#xff1a;2. 代码审计&#xff1a;3. 安全策略审查&#xff1a; 代码示例&#xff1a;SQL注入漏…

怎么维护自己的电脑

文章目录 我的电脑日常维护措施维护技巧键盘&屏幕清洁清理磁盘空间控制温度 电脑换电池 无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器&#xff0c;一台好电脑除了自身配置要经得起考验&#xff0c;后期主人对它的维护也是决定它寿命的重要因素&#xff0…

安防视频云平台EasyNVR视频汇聚平台硬件无法进入服务器的问题处理方法

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供的视频能力包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索、告警、级联等&#xff0c;平台可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频…

三、pikachu之文件上传

文章目录 1、文件上传概述2、客户端检测2.1 客户端检测原理及绕过方法2.2 实际操作之client check 3、服务端检测3.1 MIME type3.3.1 检测原理3.3.2 绕过方法3.3.3 实际操作之MIME type 3.2 文件内容检测3.2.1 检测原理3.2.2 绕过方式3.2.3 实际操作之getimagesize() 3.3 其他服…

微服务中间件--微服务保护

微服务保护 微服务保护a.sentinelb.sentinel限流规则1) 流控模式1.a) 关联模式1.b) 链路模式 2) 流控效果2.a) 预热模式2.b) 排队等待 3) 热点参数限流 c.隔离和降级1) Feign整合Sentinel2) 线程隔离2.a) 线程隔离&#xff08;舱壁模式&#xff09; 3) 熔断降级3.a) 熔断策略-慢…

H3C 无线网络vlan pool架构案例三层组网web配置

实验的是目标就是要实现华为vlan pool那种应用&#xff0c; 整个园区发一种ssid信号&#xff0c;但是连接的客户端可以随机连上后进入不同的vlan&#xff0c;在这大型园区网非常有用。 这种方法也适合同一个ssid情况下&#xff0c;在不同的位置关联不同的vlan 开启自动固化、…