Mybatis Mapper XML文件-参数(Parameters)

在之前的所有语句中,你看到了简单参数的例子。参数在MyBatis中是非常强大的元素。对于简单的情况,也就是90%的情况,它们并没有太多的复杂性,例如:

<select id="selectUsers" resultType="User">select id, username, passwordfrom userswhere id = #{id}
</select>

上面的示例展示了一个非常简单的命名参数映射。参数类型被设置为 int,所以参数可以使用任何名称。原始的或简单的数据类型,如 Integer 和 String,并没有相关的属性,因此会完全替换参数的值。然而,如果你传入一个复杂对象,那么行为就有些不同。例如:

<insert id="insertUser" parameterType="User">insert into users (id, username, password)values (#{id}, #{username}, #{password})
</insert>

如果传入一个类型为 User 的参数对象到该语句中,会查找 id、username 和 password 属性,并将它们的值传递给 PreparedStatement 参数。

那对于将参数传递到语句中来说确实非常简单。但是参数映射还有许多其他功能。

首先,和 MyBatis 的其他部分类似,参数可以指定更具体的数据类型。

#{property,javaType=int,jdbcType=NUMERIC}

和 MyBatis 的其他部分一样,javaType几乎总能从参数对象中确定,除非该对象是HashMap。在这种情况下,应该指定javaType以确保使用正确的TypeHandler。

注意:如果将null作为值传递,那么JDBC要求对所有可空列都提供JDBC类型。你可以通过阅读PreparedStatement.setNull()方法的JavaDocs来自行了解这一点。

为了进一步自定义类型处理,你还可以指定一个特定的TypeHandler类(或别名),例如:

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

确实,看起来已经有些冗长了,但事实上你很少需要设置这些参数。

对于数值类型,还有一个numericScale属性用于确定有多少位小数是相关的。

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

最后,mode属性允许您指定IN、OUT或INOUT参数。如果参数是OUT或INOUT,参数对象的实际值将被修改,就像你调用输出参数一样。如果mode=OUT(或INOUT)并且jdbcType=CURSOR(即Oracle的REFCURSOR),您必须指定一个resultMap来将ResultSet映射到参数的类型。请注意,此处的javaType属性是可选的,如果使用CURSOR作为jdbcType,并且将其留空,则它会自动设置为ResultSet。

#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

MyBatis还支持更高级的数据类型,如structs,但是在注册出参数时必须告诉语句类型名称。例如(再次强调,在实际应用中不要打破行):

#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap}

尽管有这些强大的选项,大多数情况下你只需指定属性名,MyBatis会自动处理其余部分。最多,你只需为可空列指定jdbcType。

#{firstName}
#{middleInitial,jdbcType=VARCHAR}
#{lastName}
String 替换

默认情况下,使用#{}语法将导致MyBatis生成PreparedStatement属性,并安全地将值设置到PreparedStatement参数(例如?)中。虽然这样更安全、更快速,并且通常是首选的方式,但有时您只想直接将一个未修改的字符串注入到SQL语句中。例如,在ORDER BY语句中,您可能会这样使用:

ORDER BY ${columnName}

在这里,MyBatis不会修改或转义字符串。

字符串替换在SQL语句中的元数据(例如表名或列名)是动态的时候非常有用,例如,如果你想根据表的任何一个列进行查询,而不是编写如下的代码:

@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);// and more "findByXxx" method

你只需要写成:

@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);

其中${column}将直接替换,而#{value}将被"准备"。因此,你可以通过以下方式完成相同的工作:

User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", "noone@nowhere.com");

这个想法同样适用于替换表名。

注意:接受用户输入,并以这种方式未经修改地提供给语句是不安全的。这会导致潜在的SQL注入攻击,因此你应该要么禁止用户在这些字段中输入,要么始终进行自己的转义和检查。

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

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

相关文章

odoo17核心概念view2——view_service

这是view系列的第二篇文章&#xff0c;介绍view_service.js static\src\views\view_service.js 一、前端js /** odoo-module **/import { registry } from "web/core/registry"; import { UPDATE_METHODS } from "web/core/orm_service";export const vi…

H.264运动补偿(Motion Compensation)概念(块匹配、运动矢量和残差编码、块划分和运动估计)(运动估计算法:全搜索、钻石搜索、六边形搜索)

文章目录 H.264 运动补偿概念引言I. 运动补偿基本原理1.1 运动预测1.2 帧类型1.3 块匹配 II. 运动矢量和残差编码2.1 运动矢量2.2 残差编码 III. H.264 运动补偿技术难点3.1 块划分和运动估计3.2 残差编码3.3 B帧的预测 IV. H.264 运动补偿实现4.1 帧划分与运动估计4.2 残差编码…

Jmeter 压测 —— 非GUI模式执行实例!

1、上传脚本 把在Windows下调试好的脚本上传的Linux系统/home目录下。 注意&#xff1a;只留测试脚本&#xff0c;屏蔽其它监控组件&#xff0c;比如&#xff1a;查看结果树、聚合报告、监听器等。 2、执行脚本 ①输入命令执行脚本 jmeter -n -t case.jmx -l case.jtl -n&…

Servlet技术之Cookie对象与HttpSession对象

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 Servlet技术之Cookie对象与HttpSession对象 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前…

神经网络:模型部署

【一】模型压缩的必要性与可行性&#xff1f; 模型压缩是指对算法模型进行精简&#xff0c;进而得到一个轻量且性能相当的小模型&#xff0c;压缩后的模型具有更小的结构和更少的参数&#xff0c;可以有效降低计算和存储开销&#xff0c;便于部署在端侧设备中。 随着AI技术的…

kubernetes(k8s)部署metrics及hpa-example示例

本例以kubernetes v1.26.0 为例&#xff0c;metrics-server版本为v.06.3&#xff0c;拉取源为阿里云提供 metrics yaml apiVersion: v1 kind: ServiceAccount metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system --- apiVersion: rbac.auth…

LeetCode //C - 1493. Longest Subarray of 1‘s After Deleting One Element

1493. Longest Subarray of 1’s After Deleting One Element Given a binary array nums, you should delete one element from it. Return the size of the longest non-empty subarray containing only 1’s in the resulting array. Return 0 if there is no such subarr…

多组件卡片式问答引擎

#本篇文章联合同花顺人工智能领域开发者严同学创作 1.简介 为了满足用户个性化需求以及精细化运营&#xff0c;越来越多的企业推出多组件式的卡片问答&#xff0c;这种回答方式不会千篇一律&#xff0c;能够更好地为客户提供服务&#xff0c;帮助客户解决问题。 使用这种问答…

JAVA中的栈和堆

JAVA在程序运行时&#xff0c;在内存中划分5片空间进行数据的存储。分别是&#xff1a;1&#xff1a;寄存器。2&#xff1a;本地方法区。3&#xff1a;方法区。4&#xff1a;栈。5&#xff1a;堆。 基本&#xff0c;栈stack和堆heap这两个概念很重要&#xff0c;不了解清楚&…

从零实现一套低代码(保姆级教程) --- 【6】在项目中使用redux状态管理

摘要 在上一篇文章中的末尾&#xff0c;我们也完成了Input组件的属性面板配置。现在我们的低代码项目已经小有成就了。但是后面的内容还是不少的。 如果你是第一次看到这篇文章&#xff0c;那么请移步到第一节&#xff1a; 从零实现一套低代码&#xff08;保姆级教程&#xf…

防雷接地设备综合应用方案

防雷接地设备是一种用于保护建筑物、设备和人员免受雷电危害的设备。 防雷接地设备主要包括以下几种&#xff1a; 防雷针&#xff1a;防雷针是一种用于吸引雷电并将其导入地面的金属棒&#xff0c;通常安装在建筑物的最高点或其他易受雷击的位置。 防雷带&#xff1a;防雷带…

蓝桥1位运算

1.1 课程介绍_哔哩哔哩_bilibili &与 |或 ^异或 ~非 >>右移 <<左移 >>>0填充高位 >>符号位填充高位 用法&#xff1a;判断奇偶数 x&1 获取二进制位 交换两个整数的值 求绝对值 题1-1&#xff1a;如何找出数组中唯一成对的数 public static…

【论文笔记】BiFormer: Vision Transformer with Bi-Level Routing Attention

论文地址&#xff1a;BiFormer: Vision Transformer with Bi-Level Routing Attention 代码地址&#xff1a;https://github.com/rayleizhu/BiFormer vision transformer中Attention是极其重要的模块&#xff0c;但是它有着非常大的缺点&#xff1a;计算量太大。 BiFormer提…

Android 获取wlan0地址

要获取 Android 设备的 wlan0 接口的 IP 地址&#xff0c;可以使用以下代码&#xff1a; fun getIPAddress(interfaceName: String): String? {try {val interfaces: List<NetworkInterface> Collections.list(NetworkInterface.getNetworkInterfaces())for (intf in i…

Halcon颜色提取,基于MLP自动颜色提取功能

1.前言 在实际的图像处理中&#xff0c;经常会遇到彩色图像&#xff0c;使用彩色图像往往跟颜色识别有关系。但是使用RGB进行调参时又很难达到所需要的效果&#xff08;异常区域过多不好处理&#xff09;。 在Halcon中&#xff0c;halcon对颜色提取采用MLP&#xff08;多层感知…

Hive 部署

一、介绍 Apache Hive是一个分布式、容错的数据仓库系统&#xff0c;支持大规模的分析。Hive Metastore&#xff08;HMS&#xff09;提供了一个中央元数据存储库&#xff0c;可以轻松地进行分析&#xff0c;以做出明智的数据驱动决策&#xff0c;因此它是许多数据湖架构的关键组…

C/C++ 递增/递减运算符和指针

可以将递增运算符用于指针和基本变量。本书前面介绍过。将递增运算符用于指针时。将把指针的值增加其指向的数据类型占用的字节数&#xff0c;这种规则适用于对指针递增和递减。 double arr[5] {1.1, 2.1, 3.1, 4.1, 5.1}; double *ptr arr; ptr; 也可以结合使用这些运算符和…

PostgreSQL | 概念 | 什么是OLTPOLAP?

什么是OLTP&OLAP&#xff1f; 大白话理解&#xff1a;业务系统都可以称作OLTP&#xff0c;基于业务系统产生的数据进行数据分析和决策的都可以称为OLAP。 OLTP OLTP&#xff08; Online Transaction Processing&#xff09;在线事务处理系统 用途&#xff1a; 用于支持日…

14.Unity中序列化

非字符串类型转字节数组 //关键类&#xff1a;BitConverter//所在命名空间&#xff1a;System//主要作用&#xff1a;除字符串的其他常用类型和字节数组相互转换byte[] byte1 BitConverter.GetBytes(100); 字符串类型转字节数组 //关键类&#xff1a;Encoding//所在命名空间&…

第十部分 欧拉图与哈密顿图

欧拉图&#xff1a; 历史背景&#xff1a; 哥尼斯堡七桥问题与欧拉图 问题提出后&#xff0c;很多人对此很感兴趣&#xff0c;纷纷进行试验&#xff0c;但在相当长的时间里&#xff0c;始终未能解决。而利用普通数学知识&#xff0c;每座桥均走一次&#xff0c;那这七座桥所有的…