【Mybatis】关于Mybatis手写xml文件的常见问题

明天就是端午节啦
博主今天先提前祝大家端午节快乐呀!!

文章目录

  • 前言
  • 一、尽量做到参数化查询
  • 二、关于@param注解
  • 三、mybatis处理特殊字符
    • 1.转义字符
    • 2.<![CDATA[]]>(CDATA 标记)
  • 四、结果映射
    • 1、映射好文件与接口 namespace
    • 2、statementId的映射关系
    • 3、parameterType属性
    • 4、resultType
    • 5、resultMap
      • 5.1 resultMap属性
      • 5.2 resultMap子标签
  • 五、最后的最后


前言

开发日常中我们常常用到SSM,SSH等框架,==这篇主要就是总结一些在使用Mybatis的时候,如果我们手写XML的SQL语句的话,需要注意的一些问题和概念;==能帮助我们更好的进行开发和及时发现bug;

提示:这里罗列的主要是我以前手写xml中sql语句语法中,一些容易出错的,和一些模糊的概念点做了梳理;学习中有同样困扰的小伙伴可以看看


一、尽量做到参数化查询

什么是参数化查询,就是在写查询语句的时候,使用 #{} 语法来引用参数,而不要用 ;这里 {};这里 ;这里{}作用我们知道是用来替换sql字符串的值的,这个通常会带来sql注入攻击的问题;这是一个代码编写的习惯问题,我们需要尽量避免;
注:SQL注入简单的理解来说,就是通过插入恶意的SQL代码,来执行一些我们不需要的数据库操作;

二、关于@param注解

该注解主要我们使用在Mapper定义接口方法中,他往往与我们在Mapper XML中的参数所对应;

举个🌰:
XML文件中我们写了一个查询,id作为参数:

<select id="selectUserById" resultType="User">  
    SELECT * FROM users WHERE id = #{id}  
</select>
// Mapper 接口
public interface UserMapper {  
    User selectUser(@Param("id") int id);  
}

刚接触mybatis的小伙伴多少会不理解为啥有时候需要写这个注解,有时候又没有写;

这是因为,@param 对于多参数情况下我们才会去使用,因为mybatis无法确定哪个参数对应哪个,而单参数下,mybatis能根据我们参数的类型自动处理,无需显式使用,还有就是遇到map类型作为单参数时,我们也会发现常见的做法是不写@param注解的,查询语句中也是直接通过键值获取的;
例如:

// XML 
<select id="selectUser" resultType="User">  
    SELECT * FROM users WHERE id = #{id} AND name = #{name}  
</select>
// Mapper 接口 
public interface UserMapper {  
    User selectUser(@Param("id") int id, @Param("name") String name);  
}

另外:@param注解同时还能对应复杂的参数,如我们自定义的一些实体对象(JavaBean等);

例如:下面就是以User bean为参数传递,查询sql中直接使用bean的属性作为参数进行查询

// Mapper 接口 
public interface UserMapper {  
    List<User> selectByUser(@Param("user") User user);  
}
// XML 
<select id="selectByUser" resultType="User">  
    SELECT * FROM users WHERE name = #{user.name} AND age = #{user.age}  
</select>

因此有时候为了代码更好的可读性,其实一个参数时我们也能把@param注解加上,这并没有什么问题;当遇到多个参数中既包含基本类型参数,又包含复杂类型参数的,我们更多的考虑将他们封装为一个查询DTO去处理会更好

三、mybatis处理特殊字符

在mybatis中处理特殊字符,如 <、>、& 等时,转义字符<![CDATA[ ]]>(CDATA 标记)是两种常用的方法,但是他们分别也有不同使用场景;

1.转义字符

转义字符是将特殊字符替换为特定的转义序列,我们常见的有这些:

下面展示一些 常见的转义符

< 替换为 &lt;
> 替换为 &gt;
& 替换为 &amp;
" 替换为 &quot;
' 替换为 &apos;

🌰:例如这里就是对于>的转义
在这里插入图片描述
但是其实大家在实际编码会发现,对于这个符号,似乎不转义,mybatis也不会解析错误,这是为什么?
在这里插入图片描述
因为这个符号比较特殊一些,>符号在mybatis的解析中是一个结束标签标识,通常不会被解析器认为是标签的一部分,相对的<就会被认为是一个标签的开始而不是一个文本来解读,在解析的时候就会出错;

适用场景与特点

1、转义前后的字符都会被 XML 解析器解析,所以大量转义字符存在时,相对比较损耗性能
2、转义字符适用于所有情况,因为任何特殊字符都可以被转义,因此更通用
3、短字符串时的转义中常用的选择,可读性高

2.<![CDATA[]]>(CDATA 标记)

CDATA 标记他的作用简单的来说,就是告诉我们的mybatis解析器,忽略我[]中的字符,直接将其视为纯文本来对待;

🌰:例如,下面的例子中是<即对该符号的转义。<![CDATA[要转义的内容]]>

在这里插入图片描述

适用场景与特点
对于长字符串来说,使用 CDATA 标记会相对更简洁,因为它避免了大量的转义字符的操作,并且解读起来也相对容易;

1、CDATA 标记不能包含 ]]> 字符串,会与自身的结束符号冲突
2、不能嵌套使用
3、书写的时候也要注意]]> 结尾部分不能包含空格或换行
4、转义后的字符不会被 XML 解析器解析,而直接认定为文本处理,所以性能上更好

四、结果映射

在MyBatis中,结果映射是一个非常重要的部分,它负责将数据库查询的结果集映射到Java对象的属性上;通常在这块有几个地方需要去了解;

1、映射好文件与接口 namespace

即映射文件的名称空间(namespace)必须与Mapper接口的全路径名保持一致
在这里插入图片描述

2、statementId的映射关系

映射文件中<select>的statementId(即SQL语句的ID)必须与Mapper接口中的方法名一致
在这里插入图片描述
在这里插入图片描述

3、parameterType属性

这个属性在一般情况下不是必须的,因为mybatis都能自动识别参数类型,但是如果无法推断类型,即参数可能比较复杂的,就需要我们进行指定;例如一些我们自定义的一些实体对象就可以去指定,但是如果你前面已经使用了@param注解参数了,就不需要指定parameterType了;因为mybatis会根据注解去处理
在这里插入图片描述

4、resultType

resultType属性用于指定查询返回结果集中数据的类型。它可以是Java的基本类型、包装类型、字符串、集合类型或自定义的Java对象。我们更常见的还是映射到我们JavaBean对象中
如果数据库中查询结果能和bean对象完全对应,则选择resultType;

// 自定义的对象
public class User {  
    private Integer id;  
    private String name;  
    // getters and setters  
}
// xml文件中直接映射到对象上
<select id="selectUsers" resultType="com.example.User">  
    SELECT id, name FROM users  
</select>

5、resultMap

resultMap可以理解为是resultType的升级版本,他能更好的提供复杂的关系映射;
通常如果数据库中查询结果不能和beand对象完全对应,并且会用到一些关联映射关系,则此时选择的就是resultMap替代resultType;

通常的用法:

<!-- 在 MyBatis 的 mapper XML 文件中 -->  
<resultMap id="userResultMap" type="User">  
    <id property="id" column="user_id" />  
    <result property="username" column="username" />  
    <association property="profile" javaType="Profile" column="user_id" resultMap="profileResultMap" />  
</resultMap>  

5.1 resultMap属性

<resultMap>id = “userResultMap”是resultMap的标识,用于后续查询的结果集引用;例如下面的查询语句,就需要保持resultMap的值与上面定义的id一致;

<select id="selectUserWithProfile" resultMap="userResultMap">  
    SELECT u.*, p.*  
    FROM user u  
    LEFT JOIN profile p ON u.user_id = p.user_id  
    WHERE u.user_id = #{userId}  
</select>

type属性是指定要映射到的Java类型,即我们定义的对象;

5.2 resultMap子标签

<resultMap>标签里的<id>标签用于设定我们映射的java对象主键与数据库的主键对应关系,<result>就是其他的属性映射关系定义,property就是Java对象的属性字段,colunm就是数据库字段,一一对应上即可;

<association>是一个从 User 到 Profile 的关联;属性javaType代表关联的Java对象,属性column就是关联的键值字段;

但是通常它只用于一对一的关联关系,如果这里关系是一对多的情况,我们就会用到另一个元素<collection>==;

<collection>属性基本和<association>中一致;但是会多一个ofType属性来指定集合中元素的Java类型

总的来说:
1、数据库字段和Java对象属性不一致:当数据库字段名与Java对象的属性名不同时,可以使用resultMap来指定映射规则。

2、复杂的Java对象:当Java对象包含其他Java对象或集合时,可以使用<association>和<collection>元素来处理关联关系。

五、最后的最后

喜欢博主内容的伙伴们可以三连支持一下,我们一起进步~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker 容器 mysql 配置主从

1、前提条件 集群的条件下 服务器 172.16.11.195 13316:3306 服务器 172.16.11.196 13317:3306 配置好主数据库和从数据 2、配置主从数据库 2.1使用portainer 来管理容器 建立数据库密码 新增配置文件 # mysql-master.cnf [mysqld] server_id110 log-binmysql-binrela…

android 开机动画执行流程

android深入了解开机动画 开机动画的种类 1&#xff1a;View绘制 2&#xff1a;逐帧动画&#xff1a;比较主流的方式&#xff0c;一般动画的文件打包成 bootanimation.zip 存储到 /system/media/ 下。一般.zip文件 > 5M 就会有明显的卡顿&#xff0c;所以一般开机动画只有…

【代码随想录】【算法训练营】【第36天】 [860]柠檬水找零 [406]根据身高重建队列 [452]用最少数量的箭引爆气球

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 36&#xff0c;周三&#xff0c;最难坚持的一天~ 题目详情 [860] 柠檬水找零 题目描述 860 柠檬水找零 解题思路 前提&#xff1a; 思路&#xff1a;维护5&#xff0c;10&#xff0c;20三种…

【教程】DGL单机多卡分布式GCN训练

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ PyTorch中的DDP会将模型复制到每个GPU中。 梯度同步默认使用Ring-AllReduce进行&#xff0c;重叠了通信和计算。 示例代码&#xff1a; 视频&#xff1…

【免费Web系列】大家好 ,今天是Web课程的第十九天点赞收藏关注,持续更新作品 !

1. Vue工程化 前面我们在介绍Vue的时候&#xff0c;我们讲到Vue是一款用于构建用户界面的渐进式JavaScript框架 。&#xff08;官方&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js&#xff09; 那在前面的课程中&#xff0c;我们已经学习了Vue的基本语法、表达式、指令…

MapperStruct拷贝数据的介绍和使用

1、前言 在java 编程中&#xff0c;对象直接拷贝是很常用的方法&#xff0c;最初我们常用spring提供的拷贝工具BeanUtils的copyProperties方法完成对象之间属性的拷贝。但是它有几个明显的如下缺点 1、属性类型不一致导致摸一个属性值拷贝失败 2、通一个字段使用基本类型和包…

Mybatis plus join 一对多对象语法

1. 实体类环境 题目 package co.yixiang.exam.entity;import co.yixiang.domain.BaseDomain; import co.yixiang.exam.config.CustomStringListDeserializer; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonCreator;…

使用Python爬取temu商品与评论信息

【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作&#xff01; 【&…

Pytorch--Convolution Layers

文章目录 1.nn.Conv1d2.torch.nn.Conv2d()3.torch.nn.ConvTranspose1d()3.torch.nn.ConvTranspose2d() 1.nn.Conv1d torch.nn.Conv1d() 是 PyTorch 中用于定义一维卷积层的类。一维卷积层常用于处理时间序列数据或具有一维结构的数据。 构造函数 torch.nn.Conv1d() 的语法如…

【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)

云资源同步是通过apikey去单向同步云上的主机资源和云区域信息&#xff0c;目前支持腾讯云和亚马逊云。主要特性 1、蓝鲸配置平台周期性的单向只读同步云主机和vpc&#xff08;对应蓝鲸云区域&#xff09;信息&#xff0c;第一次全量&#xff0c;后面增量 2、默认同步到主机池…

kotlin 中的数字

以下均来自官方文档&#xff1a; 一、整数类型 1、kotlin中内置的整数类型&#xff0c;有四种不同大小的类型&#xff1a; 类型存储大小&#xff08;比特数&#xff09;最小值最大值Byte8-128127Short16-3276832767Int32-2,147,483,648 (-231)2,147,483,647 (231 - 1)Long64…

图片导入AutoCAD建立草图—CAD图像导入插件

插件介绍 CAD图像导入插件可将PNG&#xff0c;JPG等格式图片导入到AutoCAD软件内建立图像边缘的二维线条模型。插件可以提取图像黑色或白色区域的边界&#xff0c;并可绘制原状边界或平滑边界两种样式。 模型说明 边界提取&#xff0c;黑色或白色边界的提取根据原图类型选择…

c#调用c++dll方法

添加dll文件到debug目录&#xff0c;c#生成的exe的相同目录 就可以直接使用了&#xff0c;放在构造函数里面测试

排序的时间复杂度、空间复杂度和稳定性等的比较

时间复杂度和空间复杂度我们比较熟悉&#xff0c;重点来看一下稳定性。 稳定性是指假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;a[i] a[j] &…

Golang 百题(实战快速掌握语法)_1

整形转字符串类型 实验介绍 本实验将展示三种方法来实现整形类型转字符串类型。 知识点 strconvfmt Itoa 函数 代码实例 Go 语言中 strconv 包的 itoa 函数输入一个 int 类型&#xff0c;返回转换后的字符串。下面是一个例子。 package mainimport ("fmt"&qu…

跟TED演讲学英文:Toward a new understanding of mental illness by Thomas Insel

Toward a new understanding of mental illness Link: https://www.ted.com/talks/thomas_insel_toward_a_new_understanding_of_mental_illness Speaker: Thomas Insel Date: January 2013 文章目录 Toward a new understanding of mental illnessIntroductionVocabularySum…

【C语言】联合(共用体)

目录 一、什么是联合体 二、联合类型的声明 三、联合变量的创建 四、联合的特点 五、联合体大小的计算 六、联合的应用&#xff08;判断大小端&#xff09; 七、联合体的优缺点 7.1 优点 7.2 缺点 一、什么是联合体 联合也是一种特殊的自定义类型。由多个不同类型的数…

测长仪的发展历程!

测长仪的发展历程可以大致分为以下几个阶段&#xff1a; 早期发展&#xff1a; 最早的测量工具主要是一些机械式测量工具&#xff0c;如角尺、卡钳等。 16世纪&#xff0c;在火炮制造中已开始使用光滑量规。 1772年和1805年&#xff0c;英国的J.瓦特和H.莫兹利等先后制造出利用…

Win快速删除node_modules

在Windows系统上删除 node_modules 文件夹通常是一个缓慢且耗时的过程。这主要是由于几个关键因素导致的&#xff1a; 主要原因 文件数量多且嵌套深&#xff1a; node_modules 文件夹通常包含成千上万的子文件夹和文件。由于其结构复杂&#xff0c;文件和文件夹往往嵌套得非常…

XXL-JOB分布式任务调度快速入门

文章目录 概念快速启动XXL-JOB调度初始化执行器项目配置执行器新增GLUE模式(Java)的任务新增BEAN模式&#xff08;类形式&#xff09;的任务BEAN模式&#xff08;方法形式&#xff09;的任务参考来源 概念 XXL-JOB是一个开源的分布式任务调度平台&#xff0c;它是一个轻量级、…