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

news2024/12/22 14:08:27

目录

经典面试题:

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
    @Override
    public 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_book
    where 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_book
    where 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_book
    where 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_book
        where bid = #{bid,jdbcType=INTEGER}
    </select>


编写接口实现接口

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


测试方法

    @Test
    public 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();
@Override
    public List<Book> selectresultType01() {
        return bookMapper.selectresultType01();
    }
 
    @Override
    public List<Book> selectresultMap01() {
        return bookMapper.selectresultMap01();
    }


测试方法
 

  @Test
    public void selectresultType01() {
        bookbiz.selectresultType01().forEach(System.out::println);
    }
 
    @Test
    public 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 bname
        from t_mvc_book
        where bid = #{bid,jdbcType=INTEGER}
    </select>


    <!--多个-->
   

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


编写接口和实现接口

 

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


测试方法

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

   总结:

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

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

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

相关文章

苹果叶病害识别(Python代码,pyTorch框架,预训练好的VGG16模型,也很容易替换为其它模型,带有GUI识别界面)

代码运行要求&#xff1a;Torch>1.13.1即可 1.数据集介绍&#xff1a; Apple Scab类文件夹图片 Black Rot类文件夹图片 Cedar Apple Rust文件夹 healthy文件夹 2.整个项目 data文件夹存放的是未被划分训练集和测试集的原始照片 picture文件夹存放的是经hf.py对data文件夹…

docker 02(docker 命令)

一、docker服务命令 systemctl start docker 启动docker服务 [参考] systemctl status docker 状态 systemctl stop docker 停止docker服务 systemctl restart docker 重启动docker服务 systemctl enable docker 开机自启动docker服务 &#xff0c;无需手动 二、docke…

远程调试环境配置

目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试&#xff0c;访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方&#xff0c;复制自己的phpinfo源码到方框里&#xff0c;再点击Analyse Xdebug: …

【UML】软件工程中常用图:类图、部署图、时序图、状态图

前言&#xff1a; UML中的很多东西平时都听过、用过&#xff0c;诸如类图、时序图等&#xff0c;本文将详细详细讲一下UML中常用的几类图&#xff0c;并且会引入一个完整的例子来讲解&#xff0c;UML在工程上到底该怎么合理使用。 目录 1.概述 1.1.什么是UML&#xff1f; …

C++入门---vector常用函数介绍及使用

vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大…

第1章:计算机网络体系结构

文章目录 1.1 计算机网络 概述1.概念2.组成3.功能4.分类5.性能指标1.2 计算机网络 体系结构&参考模型1.分层结构2.协议、接口、服务3.ISO/OSI模型4.TCP/IP模型1.1 计算机网络 概述 1.概念 2.组成 1.组成部分&

docker搭建redis三主三从集群,及其常见问题解决

目录结构 redis.conf主要参数 每个配置文件都要修改对应的端口 bind 0.0.0.0 protected-mode no #每个配置文件都要修改端口 port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 supervised no loglevel notice #日志文件路径 #logfile "/mydata/master_redis/log/…

逻辑回归原理,最大化似然函数和最小化损失函数

目录 逻辑回归原理 最大化似然函数和最小化损失函数 一、逻辑回归基本概念 1. 什么是逻辑回归 2. 逻辑回归的优缺点 3. 逻辑回归和多重线性回归的区别 Poisson分布 泊松分布的特点&#xff1a; 泊松分布用途 4. 逻辑回归用途 5. Regression 常规步骤 逻辑回归原理 …

代码随想录 (五)栈和队列

1栈与队列基础知识待看 2.用栈实现队列 题意有说操作是有效的&#xff0c;不用去判断非法的情况 class MyQueue { public:stack<int> stIn;stack<int> stOut; MyQueue() {}void push(int x) {stIn.push(x);}//出队并返回该元素 int pop() {if (stOut.empty()) {…

使用 Nacos 作为 Spring Boot 配置中心

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

数据并行(DP)、张量模型并行(TP)、流水线并行(PP)

数据并行 数据集分为n块&#xff0c;每块随机分配到m个设备(worker)中&#xff0c;相当于m个batch并行训练n/m轮&#xff0c;模型也被复制为n块&#xff0c;每块模型均在每块数据上进行训练&#xff0c;各自完成前向和后向的计算得到梯度&#xff0c;对梯度进行更新&#xff0…

【TypeScript】声明文件

在 TypeScript 中&#xff0c;声明文件&#xff08;Declaration Files&#xff09;用于描述已有 JavaScript 代码库的类型信息&#xff0c;以便在 TypeScript 项目中使用这些代码库时获得类型支持。 当你在 TypeScript 项目中引用外部 JavaScript 模块或库时&#xff0c;可能会…

iPhone 15 Pro与三星Galaxy Z Flip 5对决:谁将成为旗舰手机的佼佼者?

如果你打算买那些钱能买到的最好的手机,你经常会看到1000美元左右的东西。在这一点上,苹果即将推出的旗舰机并不遥远,这就是为什么值得一看iPhone 15 Pro与三星Galaxy Z Flip 5的对决。这两款旗舰手机将以大致相同的价格竞争,但它们的差异远比你想象的要大。 三星的Galaxy…

C语言之扫雷游戏实现篇

目录 主函数test.c 菜单函数 选择循环 扫雷游戏实现分析 整体思路 问题1 问题2 问题3 问题4 游戏函数&#xff08;函数调用&#xff09; 创建游戏盘数组mine 创建游戏盘数组show 初始化游戏盘数组InitBoard 展示游戏盘DisplayBoard 游戏盘置雷SetMine 游戏…

WebGL 变量uniform、gl.getUniformLocation、gl.uniform4f及其同族函数相关

目录 uniform变量命名规范 获取 uniform 变量的存储地址 gl.getUniformLocation 向uniform变量赋值 gl.uniform4f ​编辑 gl.uniform4f()的同族函数 demo&#xff1a;点击webgl坐标系的四个象限绘制各自不同颜色的点 uniform变量命名规范 var FSHADER_SOURCE uniform vec4…

Unity 之 Transform.Translate 实现局部坐标系中进行平移操作的方法

文章目录 Translate 默认使用局部坐标也可以转换成世界坐标 Translate 默认使用局部坐标 在Unity中&#xff0c;Transform.Translate是用于在游戏对象的局部坐标系中进行平移操作的方法。这意味着它将游戏对象沿着其自身的轴进行移动&#xff0c;而不是世界坐标轴。这在实现物…

vue3 watch 函数基本用法

在Vue.js中我们经常会需要监听属性&#xff0c;我们可以通过 watch 来响应数据的变化。下面通过举例来介绍一下watch的基本使用方法。 浅层监听 <template><div><button click"setCount">{{ count }}</button><button click"setName…

IDEA常用插件之类Jar包搜索Maven Search

文章目录 IDEA常用插件之类Jar包搜索Maven Search说明安装插件使用方法1.搜索自己要搜的jar包2.根据类名搜索 IDEA常用插件之类Jar包搜索Maven Search 说明 它可以帮助用户快速查找和浏览Maven中央存储库中可用的依赖项和插件。它可以帮助用户更方便地管理项目依赖项。 安装…

中介者模式-协调多个对象之间的交互

在深圳租房市场&#xff0c;有着许多的“二房东”&#xff0c;房主委托他们将房子租出去&#xff0c;而租客想要租房的话&#xff0c;也是和“二房东”沟通&#xff0c;租房期间有任何问题&#xff0c;找二房东解决。对于房主来说&#xff0c;委托给“二房东”可太省事了&#…

小说图文实现构想

1、当前小说盈利模式 当前大部分小说平台盈利模式主要依赖于小说IP的实现&#xff0c;如影视、动漫及书籍出版等&#xff0c;其中通过VIP等充值阅读方式从部分用户获取收入&#xff0c;当然由于盗版横行&#xff0c;通过VIP获取收益往往不是很理想想&#xff0c;广告收入在整个…