MyBatis操纵数据库-XML实现(补充)

目录

  • 一.多表查询
  • 二.MyBatis参数赋值(#{ }和${ })
    • 2.1 #{ }和${ }的使用
    • 2.2 #{ }和${ }的区别
    • 2.3 SQL注入
    • 2.3 ${ }的应用场景
      • 2.3.1 排序功能
      • 2.3.2 like查询

一.多表查询

多表查询的操作和单表查询基本相同,只需改变一下SQL语句,同时也要在实体类中创建出关联表相应字段,让Mybatis将查询的结果进行映射,以下是一个多表查询的示例

  • 实体类(ArticleInfo)
import lombok.Data;
import java.util.Date;
@Data
public class ArticleInfo {// 文章相关信息private Integer id;private String title;private String content;private Integer uid;private Integer deleteFlag;private Date createTime;private Date updateTime;// 用户相关信息private String userName;private Integer age;private Integer gender;
}
  • Mapper接口(ArticleInfoXMLMapper)与测试方法
// Mapper接口
import org.apache.ibatis.annotations.Mapper;
import org.example.mybatisdemo.model.ArticleInfo;@Mapper
public interface ArticleInfoXMLMapper {ArticleInfo queryArticleInfo(Integer id);}// 测试方法
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ArticleInfoXMLMapperTest {@Autowiredprivate ArticleInfoXMLMapper articleInfoXMLMapper;@Testvoid queryArticleInfo() {System.out.println(articleInfoXMLMapper.queryArticleInfo(1));}
}
  • XML文件(ArticleInfoMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatisdemo.mapper.ArticleInfoXMLMapper"><select id="queryArticleInfo" resultType="org.example.mybatisdemo.model.ArticleInfo">select * from articleinfo ta left join userinfo tb on ta.uid= tb.id where tb.id=#{id}</select>
</mapper>

在这里插入图片描述

二.MyBatis参数赋值(#{ }和${ })

在之前的操作中,我们一直都是使用#{ }来在将参数赋值到SQL语句中,其实在MyBatis中,参数赋值的方式有两种,一种就是我们使用的#{ },而另一种是使用${ }

2.1 #{ }和${ }的使用

我们分别使用#{ }和${ }来赋值不同类型的参数(Integer和String),观察相应的MyBatis日志

  • Integer类型的参数(上图为#{ },下图为${ })
    在这里插入图片描述
    在这里插入图片描述
  • String类型的参数(上图为#{ },下图为${ })
    在这里插入图片描述
    在这里插入图片描述
    通过观察MyBatis日志,可以发现#{ }使用的是预编译SQL,通过 ? 站位的方式提前对SQL进行编译,然后把参数填充到SQL语句中,并且#{ }会根据参数类型,自动给参数添加引号,而使用${ }进行参数赋值时会直接进行字符替换,如果参数是字符串类型的,需要加上手动添加引号,否则会报错(SQL语句语法错误)

2.2 #{ }和${ }的区别

  • #{ }使用的是预编译SQL,而${ }使用的是即时SQL
  • #{ }性能更高,在大部分情况下,某一条SQL语可能会被反复调用执行,或者每次执行时只有个别的值是不同的(比如insert语句的values值不同,update语句的set子句值不同),如果每次都需要经过语法分析,SQL优化,编译等,效率就会大幅降低,预编译SQL很大程度上解决了这个问题,在编译之后会将SQL语句缓存起来,后续在执行这条语句时,不会再次编译,省去了解析优化等过程,提高了效率
  • #{ }更安全,可以防止SQL注入(下面会介绍)

2.3 SQL注入

在使用${ }时,可能会出现SQL注入问题,SQL注入就是通过输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法

// 测试方法
import org.example.mybatisdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid queryUserInfos() {userInfoXMLMapper.queryUserInfos("'' or 1='1'").forEach(System.out::println);}
}

在这里插入图片描述
当我们给参数后添加一个or 1='1'时,此时替换到SQL语句中,因为1='1’语句为true,即永真,导致整个用户表的内容都被返回,如果这是在实际的登录场景中且后端代码中使用了${ },在登录时密码输入or 1='1’就有可能完成登录,试想一下,不用密码就可以登录,这是何等大的一个漏洞

2.3 ${ }的应用场景

虽然${ }存在着SQL注入的风险,但它其实也有自己的应用场景,以下是对其场景的一个简单介绍

2.3.1 排序功能

  • Mapper接口和测试方法
// Mapper接口
import org.apache.ibatis.annotations.Mapper;
import org.example.mybatisdemo.model.UserInfo;
import java.util.List;
@Mapper
public interface UserInfoXMLMapper {List<UserInfo> queryUserInfoBySort(String sort);}//测试方法
import org.example.mybatisdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid queryUserInfoBySort() {userInfoXMLMapper.queryUserInfoBySort("DESC").forEach(System.out::println);}
}
  • XML文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatisdemo.mapper.UserInfoXMLMapper"><select id="queryUserInfoBySort" resultType="org.example.mybatisdemo.model.UserInfo">select * from userinfo order by id ${sort}</select>
</mapper>

在这里插入图片描述

当我们要赋值到SQL语句中的参数为排序的顺序时,使用${ }进行赋值可以正常进行,而#{ }就会出现错误,因为在SQL语句中,排序规则(DESC,ASC)不需要加引号,而因为参数是String类型,使用#{ }赋值时自动添加了引号,从而导致SQL语句出现语法错误

2.3.2 like查询

  • Mapper接口和测试方法
// Mapper接口
import org.apache.ibatis.annotations.Mapper;
import org.example.mybatisdemo.model.UserInfo;
import java.util.List;
@Mapper
public interface UserInfoXMLMapper {List<UserInfo> queryUserInfoByKey(String key);}// 测试方法
import org.example.mybatisdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid queryUserInfoByKey() {userInfoXMLMapper.queryUserInfoByKey("zhang").forEach(System.out::println);}
}
  • XML文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatisdemo.mapper.UserInfoXMLMapper"><select id="queryUserInfoByKey" resultType="org.example.mybatisdemo.model.UserInfo">select * from userinfo where username like '%${key}%'</select>
</mapper>

在这里插入图片描述
同样对于like语句,我们使用${ }进行赋值可以正常执行,而如果使用#{ }就会出现错误,因为这里也不需要自动添加引号,添加引号就会导致SQL语句出现语法错误,但是这种SQL语句的写法同样存在一定问题,因为使用了${ },所以可能会有SQL注入问题,更好的写法是使用Mysql内置的concat()函数来进行处理

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatisdemo.mapper.UserInfoXMLMapper"><select id="queryUserInfoByKey" resultType="org.example.mybatisdemo.model.UserInfo">select * from userinfo where username like concat('%',#{key},'%')</select>
</mapper>

在这里插入图片描述

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

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

相关文章

快速导出接口设计表——基于DOMParser的Swagger接口详情半自动化提取方法

作者声明&#xff1a;不想看作者声明的&#xff08;需要生成接口设计表的&#xff09;直接前往https://capujin.github.io/A2T/。 注&#xff1a;Github Pages生成的页面可能会出现访问不稳定&#xff0c;暂时没将源码上传至Github&#xff0c;如有需要&#xff0c;可联系我私…

TS常见内置映射类型的实现及应用场景

以下是 TypeScript 在前端项目中 常用的映射类型&#xff08;Mapped Types&#xff09;&#xff0c;结合具体场景和代码示例&#xff0c;帮助开发者高效处理复杂类型&#xff1a; 一、基础映射类型 1. Partial<T> 作用&#xff1a;将对象类型 T 的所有属性变为可选。 实…

介绍如何使用YOLOv8模型进行基于深度学习的吸烟行为检测

下面为你详细介绍如何使用YOLOv8模型进行基于深度学习的吸烟行为检测&#xff0c;包含环境配置、数据准备、模型训练以及推理等步骤。 1. 环境配置 首先&#xff0c;你需要安装必要的库&#xff0c;主要是ultralytics库&#xff0c;它包含了YOLOv8模型。你可以使用以下命令进…

AI-医学影像分割方法与流程

AI医学影像分割方法与流程–基于低场磁共振影像的病灶识别 – 作者:coder_fang AI框架&#xff1a;PaddleSeg 数据准备&#xff0c;使用MedicalLabelMe进行dcm文件标注&#xff0c;产生同名.json文件。 编写程序生成训练集图片&#xff0c;包括掩码图。 代码如下: def doC…

【Python】09、字典

文章目录 1. 字典简介2. 字典的使用2.1 字典创建2.2 字典值获取2.3 字典值修改2.4 字典的删除 3. 字典的遍历 1. 字典简介 字典(dict)属于一种新的数据结构&#xff0c;称为映射(mapping)。 字典的作用和列表类似&#xff0c;但是查询性能比列表好&#xff1b;在字典中每个元…

【贪心算法4】

力扣452.用最少数量的剪引爆气球 链接: link 思路 这道题的第一想法就是如果气球重叠得越多那么用箭越少&#xff0c;所以先将气球按照开始坐标从小到大排序&#xff0c;遇到有重叠的气球&#xff0c;在重叠区域右边界最小值之前的区域一定需要一支箭&#xff0c;这道题有两…

SGMEA: Structure-Guided Multimodal Entity Alignment

3 Method 3.1 Problem Definition 3.2 Framework Description 总体框架如图2所示&#xff0c;由三个主要部分组成&#xff1a;初始嵌入采集模块、结构引导模块和模态融合模块。 3.3 Initial Embedding Acquisition 3.3.1 Structural Embedding 3.3.2 Relation, Attribute, …

KY-038 声音传感器如何工作以及如何将其与 ESP32 连接

想为您的项目赋予声音感!然后跟着做,因为在这个项目中,我们将连接一个声音传感器,用它构建一些有趣的项目。我们使用的 KY-038 声音传感器使用电容式麦克风来检测声波,这为我们提供了稳定性和可靠性的完美平衡。因此,在本文中,我们决定将 KY-038 传感器与 ESP32 连接,并…

《基于超高频RFID的图书馆管理系统的设计与实现》开题报告

一、研究背景与意义 1.研究背景 随着信息化时代的到来&#xff0c;运用计算机科学技术实现图书馆的管理工作已成为优势。更加科学地管理图书馆会大大提高工作效率。我国的图书管理体系发展经历了三个阶段&#xff1a;传统图书管理模式、现代图书管理模式以及基于无线射频识别&…

[local-file-system]基于服务器磁盘的本地文件存储方案

[local-file-system]基于服务器磁盘的本地文件存储方案 仅提供后端方案 github 环境 JDK11linux/windows/mac 应用场景 适用于ToB业务&#xff0c;中小企业的单体服务&#xff0c;仅使用磁盘存储文件的解决方案 仅使用服务器磁盘存储 与业务实体相结合的文件存储方案&…

P5708 【深基2.习2】三角形面积(洛谷—python)

题目描述 一个三角形的三边长分别是 a、b、c&#xff0c;那么它的面积为 p(p−a)(p−b)(p−c)​&#xff0c;其中 p21​(abc)。输入这三个数字&#xff0c;计算三角形的面积&#xff0c;四舍五入精确到 1 位小数。 输入格式 第一行输入三个实数 a,b,c&#xff0c;以空格隔开…

智慧加油站小程序数据库设计文档

智慧加油站系统 - 数据库与API设计文档 1. 数据库设计 1.1 ER模型 系统的核心实体关系如下&#xff1a; 用户(User) ---< 订单(Order) ---< 加油记录(RefuelRecord)| | || | vv v …

C++博客分享

本周的一些 C视频分享, 或许后续会做一些内容总结. 博客 Polymorphic, Defaulted EqualityConstexpr factors_ofC26: Removing language featuresBypassing the branch predictor Meeting C 2024 Clean CMake for C (library) developers - Kerstin KellerAn Introduction …

【蓝桥杯每日一题】3.16

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a; 解题代码&#xff1a; 二、高精度减法 题目链接&#xff1a; 题目描述&…

vue 仿deepseek前端开发一个对话界面

后端&#xff1a;调用deepseek的api&#xff0c;所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…

SpringMVC(五)拦截器

目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置&#xff0c;并指定拦截路径。 3 运行结果展示&#xff1a; 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制&#xff0c;允许在请求被目标方法处理的…

Hive SQL 精进系列:PERCENTILE_APPROX 搞定分位数

目录 一、引言二、percentile_approx 函数基础2.1 基本语法参数解释返回值简单示例 三、应用场景3.1 数据分析与报告3.2 数据清洗与异常值检测3.3 性能监控与优化 四、使用注意事项4.1 数据类型要求4.2 精度与性能平衡4.3 空值处理 五、总结 一、引言 百分位数作为一种常用的统…

pytorch快速入门——手写数字分类GPU加速

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; pytorch快速入门——手写数字分类GPU加速 一、tensor1&#…

【开源免费】基于SpringBoot+Vue.JS电商应用系统(JAVA毕业设计)

本文项目编号 T 242 &#xff0c;文末自助获取源码 \color{red}{T242&#xff0c;文末自助获取源码} T242&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

经历过的IDEA+Maven+JDK一些困惑

注意事项&#xff1a;由于使用过程中是IDEA绑定好另外2个工具&#xff0c;所以报错统一都显示在控制台&#xff0c;但要思考和分辨到底是IDEA本身问题导致的报错&#xff0c;还是maven导致的 使用前的配置 编辑期 定义&#xff1a;指的是从open projects开始&#xff0c;到执行…