mybatis讲解(2)之动态SQL的运用

目录

经典面试题:

1.mybatis动态sql

2.模糊查询(3种方式)

3.查询返回结果集

   总结:


前言:在我上篇已经学习了Mybatis简介以及如何去连接数据库,具有增删改查的方法。那么我们今天来学习Mybatis的第二节关于1.mybatis动态sql,2.模糊查询(3种方式),3.查询返回结果集。希望大家学了可以对你们的学习,工作具有帮助。

经典面试题:

  问题一:#{...}与${...}区别?

        1.$是占位值赋值,#是预处理SQL
        2. 参数类型为字符串,#会在前后加单引号['],$则直接插入值     

 注: mybatis中使用OGNL表达式传递参数

        3.${...}方式存在SQL注入风险

        4.${...}可以做动态列,完成动态sql开发。


注意: 优先使用#{...},因为: ${...}方式存在SQL注入风险

补充:SQL注入风险:SQL注入风险是指通过植入恶意的SQL代码,攻击者可以绕过正常的安全验证机制,执行恶意的数据库操作,导致数据泄露、破坏或未授权访问。这种风险在报表中也存在。通过在报表的查询条件中注入恶意的SQL代码,攻击者可以利用这个漏洞获取敏感数据或对数据库进行破坏。此外,由于报表工具往往直接拼接用户输入的条件串作为SQL语句的一部分,如果没有对用户输入进行充分的验证和过滤,就容易受到SQL注入攻击。因此,为了防范SQL注入风险,在报表开发中需要采取相应的安全措施,如对用户输入进行严格的验证和过滤,使用参数化查询等。

举实例:我们在使用sql查询时使用的两种方式:

deptid=822520

select * from t_oa_employee where deptid = #{deptid}

select * from t_oa_employee where deptid = 822520

                                                                                                                                           select * from t_oa_employee where deptid = ${deptid}                                                  select * from t_oa_employee where deptid = 822520 or 1 = 1 

第二种sql会查出来所有员工信息的不安全哦         

                                

        

                                                                                                                                          问题二:在mybatis中   resultMap,resultType区别?

在MyBatis中,resultMap和resultType是用于在查询中进行结果映射的两种方式。它们的区别如下:

  1. 对象不同:resultType是直接指定返回类型,而resultMap是一个定义了结果映射规则的对象。
  2. 描述不同:resultType通过属性名来进行结果映射,只有查询出来的列名与属性名一致时才能成功映射。而resultMap可以通过配置来定义复杂的映射规则,可以自由地对查询结果进行处理和映射。
  3. 类型适用不同:resultType适用于简单的查询结果映射,当查询结果的列名和属性名一致时比较方便。而resultMap适用于复杂的查询结果映射,可以灵活地处理和映射不同的查询结果。


1.mybatis动态sql

介绍:MyBatis动态SQL是一种基于OGNL表达式的技术,可以在SQL语句中实现一些逻辑判断。总体上,MyBatis动态SQL主要包含以下几类语句:

1. if语句:用于简单的条件判断。
2. choose语句(相当于Java语言中的switch):包含when和otherwise子句,类似于JSTL中的choose语句。
3. trim语句:在包含的内容上添加前缀或后缀,可以用于动态地拼接SQL语句。
4. where语句:主要用于简化SQL语句中的where条件判断,能够智能地处理and和or,防止多余导致语法错误。
5. set语句:主要用于更新操作。
6. foreach语句:在实现MyBatis的in语句查询时特别有用。

以上是MyBatis动态SQL的几种主要用法,可以根据具体需求选择适合的方式来编写动态SQL语句。

MyBatis Dynamic SQL是一个与MyBatis配套的项目,它解决了MyBatis在动态SQL方面的一些缺点,并提供了更灵活、强大的动态SQL功能。该项目可以帮助开发人员更方便地编写复杂的SQL语句,提高开发效率。你可以在官方文档中了解更多关于MyBatis Dynamic SQL的信息。

mybatis – MyBatis 3 | 动态 SQLicon-default.png?t=N6B9https://mybatis.org/mybatis-3/zh/dynamic-sql.html

例如在我们的Mapper文件中修改方法的if标签

 

 例如在我们的自定义Mapper文件中查询的foreach标签

使用foreach去得到指定id的查询指定的值

Mapper.xml

  <select id="selectBooksIn" resultType="com.lya.model.Book" parameterType="java.util.List">select * from t_mvc_book where bid in<foreach collection="bookIds" open="(" close=")" separator="," item="bid">#{bid}</foreach></select>

BookMapper的接口

    List<Book> selectBooksIn(@Param("bookIds") List bookIds);
IBookService接口
    List<Book> selectBooksIn(@Param("bookIds") List bookIds);
BookServiceImpl
    @Overridepublic List<Book> selectBooksIn(List bookIds) {return bookMapper.selectBooksIn(bookIds);}

运行结果: 

2.模糊查询(3种方式)


 
    2.1 参数中直接加入%%

<!--  模糊查询-->
<!--  1--><select id="like1" resultType="com.lya.model.Book" parameterType="java.lang.String">SELECT<include refid="Base_Column_List" />from t_mvc_bookwhere bname like #{bname}</select>
<!--2--><select id="like2" resultType="com.lya.model.Book" parameterType="java.lang.String">SELECT<include refid="Base_Column_List" />from t_mvc_bookwhere bname like ${bname};</select>
<!--  3--><select id="like3" resultType="com.lya.model.Book" parameterType="java.lang.String">SELECT<include refid="Base_Column_List" />from t_mvc_bookwhere bname like concat('%','圣墟','%');</select>

这里我们运行第二种会有个报错

解决方法:传值添加单引号

 

 

 

    2.3 SQL字符串拼接CONCAT

3.查询返回结果集

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

    3.1 使用resultMap返回自定义类型集合

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

 <select id="selectresultType" resultType="com.lya.model.Book" parameterType="java.lang.Integer">select<include refid="Base_Column_List"/>from t_mvc_bookwhere bid = #{bid,jdbcType=INTEGER}</select>


编写接口实现接口

Book selectresultType(Integer bid);@Overridepublic Book selectresultType(Integer bid) {return bookMapper.selectresultType(bid);}


测试方法

    @Testpublic void selectresultType() {System.out.println("测试resultType查询");Book book = bookbiz.selectByPrimaryKey(12);System.out.println(book);}


测试结果

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

1.resultType/resultMap。resultType一个或多个都用实体对象

<select id="selectresultType01" resultType="com.lya.model.Book">select<include refid="Base_Column_List"/>from t_mvc_book</select><select id="selectresultMap01" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from t_mvc_book</select>


编写接口方法和实现接口

    List<Book> selectresultType01();List<Book> selectresultMap01();
@Overridepublic List<Book> selectresultType01() {return bookMapper.selectresultType01();}@Overridepublic List<Book> selectresultMap01() {return bookMapper.selectresultMap01();}


测试方法
 

  @Testpublic void selectresultType01() {bookbiz.selectresultType01().forEach(System.out::println);}@Testpublic void selectresultMap01() {bookbiz.selectresultMap01().forEach(System.out::println);
  1. 返回多表的对应的实体类,仅有一个查询结果,通常用resultType,也可以用resultMap。
  2. 返回多表的对应的实体类,有多个查询结果,通常用resultType,也可以用resultMap。
  3. 返回单个列表,仅有一个查询结果,就用resultType。
  4. 返回单个列表,有多个查询结果,就用resultType。

 

配置xml
<!--单个-->

    <select id="selectByString01" resultType="java.lang.String" parameterType="java.lang.Integer">select bnamefrom t_mvc_bookwhere bid = #{bid,jdbcType=INTEGER}</select>


    <!--多个-->
   

 <select id="selectByString02" resultType="java.lang.String" parameterType="java.lang.String">select bnamefrom t_mvc_bookwhere bname like concat('%', #{bname}, '%')</select>


编写接口和实现接口

 

  String selectByString01(Integer bid);List<String> selectByString02(String bname);@Overridepublic String selectByString01(Integer bid) {return bookMapper.selectByString01(bid);}@Overridepublic List<String> selectByString02(String bname) {return bookMapper.selectByString02(bname);}


测试方法

    @Testpublic void selectByString01() {System.out.println(bookbiz.selectByString01(60));}@Testpublic void selectByString02() {Map map = new HashMap();map.put("sid", "01");map.put("cid", "01");bookbiz.selectByString02("圣墟").forEach(System.out::println);

   总结:

总结来说,resultType是一种简单的结果映射方式,适用于列名和属性名一致的情况;而resultMap是一种更为灵活和强大的结果映射方式,可以自定义映射规则来处理复杂的查询结果

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

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

相关文章

SpringCloud入门实战(十四)Sentinel微服务流量防卫兵简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

GitLab与GitLab Runner安装(RPM与Docker方式),CI/CD初体验

背景 GitLab 是一个强大的版本控制系统和协作平台&#xff0c;记录一下在实际工作中关于 GitLab 的安装使用记录。 一开始使用 GitLab 时&#xff0c;是在 CentOS7 上直接以 rpm 包的方式进行安装&#xff0c;仅作为代码托管工具来使用&#xff0c;版本&#xff1a; 14.10.4 …

人机界面通过RJ45口无线连接多台PLC

人机界面是系统和用户之间进行交互和信息交换的媒介&#xff0c;它实现信息的内部形式与人类可以接受形式之间的转换。人机界面产品由硬件和软件两部分组成&#xff0c;硬件部分包括处理器、显示单元、输入单元、通讯接口、数据存贮单元等&#xff0c;HMI软件一般分为两部分&am…

React+Typescript 父子组件事件传值

好 之前我们将 state 状态管理简单过了一下 那么 本文 我们来研究一下事假处理 点击事件上文中我们已经用过了 这里 我们就不去讲了 主要来说说 父子之间的事件 我们直接来编写一个小dom 我们父组件 编写代码如下 import Hello from "./components/hello";functio…

opencv-dnn

# utils_words.txt 标签文件 import osimage_types (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, containsNone):# return the set of files that are validreturn list_file…

iPhone卫星通信SOS功能如何在灾难中拯救生命

iPhone上的卫星紧急求救信号功能在从毛伊岛野火中拯救一家人方面发挥了至关重要的作用。这是越来越多的事件的一部分&#xff0c;在这些事件中&#xff0c;iPhone正在帮助人们摆脱危及生命的情况。 卫星提供商国际通信卫星组织负责移动的高级副总裁Mark Rasmussen在接受Lifewir…

WPS office 最新未公开 0Day漏洞警示

一、事件描述 近日&#xff0c;网传监测发现WPS Office for Windows版本 存在0day漏洞&#xff0c;攻击者可以利用该0day漏洞在受害者主机上执行任意恶意文件&#xff0c;高危级别&#xff0c;官方尚未对此发布修复漏洞&#xff0c;目前建议只能临时弃用wps或者不要点开未知文件…

flink checkpoint时exact-one模式和atleastone模式的区别

背景&#xff1a; flink在开启checkpoint的时候有两种模式可以选择&#xff0c;exact-one和atleastone模式&#xff0c;那么这两种模式有什么区别呢&#xff1f; exact-one和atleastone模式的区别 先说结论&#xff1a;exact-one可以完全做到状态的一致性&#xff0c;而atle…

Elasticsearch 入门安装

1.Elasticsearch 是什么 The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elaticsearch&#xff0c;简称为…

Fabric.js 元素选中状态的事件与样式

本文简介 带尬猴&#xff01; 你是否在使用 Fabric.js 时希望能在选中元素后自定义元素样式或选框&#xff08;控制角和辅助线&#xff09;的样式&#xff1f; 如果是的话&#xff0c;可以放心往下读。 本文将手把脚和你一起过一遍 Fabric.js 在对象元素选中后常用的样式设置…

无涯教程-PHP - sql_regcase()函数

sql_regcase() - 语法 string sql_regcase (string string) 可以将sql_regcase()函数视为实用程序函数&#xff0c;它将输入参数字符串中的每个字符转换为包含两个字符的带括号的表达式。 sql_regcase() - 返回值 返回带括号的表达式字符串以及转换后的字符。 sql_regcase…

微信小程序 车牌号输入组件

概述 一个小组件&#xff0c;用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况&#xff0c;让客户通过自带键盘输入&#xff0c;体验不好且容易出错&#xff0c;例如车牌号是不能输入O和I的&#xff0c;因此需要有一个自定义的键盘…

【VR】SteamVR2.0的示例场景在哪里

&#x1f4a6;本专栏是我关于VR开发的笔记 &#x1f236;本篇是——在哪里可以找到SteamVR2.0的示例场景 SteamVR2.0的示例场景在哪里 1. 逐步打开方式2. 快速打开方式 1. 逐步打开方式 Assets——SteamVR——InteractionSystem——Samples——>Interactions_Example 2. 快…

CDN、DNS、ADN、SCDN、DCDN、ECDN、PCDN、融合CDN傻傻分不清楚,一文全部搞懂

一、CDN是什么&#xff1f; CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之…

Wireshark数据抓包分析之传输层协议(TCP协议)

一、实验目的&#xff1a; 通过使用wireshark对TCP协议的数据包的抓取分析TCP协议的具体内容 二、预备知识: 1.需要了解TCP协议的三次握手过程 2.需要了解TCP协议的四次挥手的过程 三、网络拓扑 四、实验过程&#xff1a; part1&#xff1a;3次握手和4次挥手的数据包的获取 …

【ThingJS | 3D可视化】开发框架,一站式数字孪生

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; 数字孪生 | 3D可视化框架 开发工具&#xff1a;ThingJS在线开发工具 ThingJs 低代码开发 ThingJs 低代码开发注意点场景效果配置层级层级常用API实例化 Thing&#xff0c;加载场景load 加载函数ThingJs 层级关系图查找层…

睿思BI旗舰版V5.3正式发布

发布时间&#xff1a;2023-7-20 主要更新内容: 1.增加3D地图功能 2.增加水球图 3.增加扇形图&#xff0c;在数据大屏 - 自定义组件中定义。 4.增加指标引导线功能&#xff0c;在数据大屏 - 自定义组件中定义。 5.详情页增加回调函数功能。 6.大屏/仪表盘模版下载&#xff0c;…

排序算法:选择排序

选择排序的思想是&#xff1a;双重循环遍历数组&#xff0c;每经过一轮比较&#xff0c;找到最小元素的下标&#xff0c;将其交换至首位。 public static void selectionSort(int[] arr) {int minIndex;for (int i 0; i < arr.length - 1; i) {minIndex i;for (int j i …

Spring统一功能处理

1. AOP存在的问题 获取参数复杂AOP的规则相对简单 2. 拦截器 2.1. 应用(以登录为例) 2.1.1. 自定义拦截器 新建interceptor文件夹 import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http…

什么是NetDevOps

NetDevOps 是一种新兴的方法&#xff0c;它结合了 NetOps 和 DevOps 的流程&#xff0c;即将网络自动化集成到开发过程中。NetDevOps 的目标是将虚拟化、自动化和 API 集成到网络基础架构中&#xff0c;并实现开发和运营团队之间的无缝协作。 开发运营&#xff08;DevOps&…