当前位置: 首页 > news >正文

SpringBoot中Mapper.xml的入参方式

在SpringBoot开发过程中,我们使用 ***Mapper.xml+***Mapper.java 来封装对数据库表的 CURD 操作,正常每张表会有一组对应的文件。

一、Mapper常见用法

下面例举一个查询操作:

  • 数据表t_sap_customer,表中有字段id、code、name、create_time、update_time、last_ver、is_valid
  • 现在需要根据idis_valid来查询一条数据

TSapCustomerMapper.java 代码:

package com.starcharge.repository.db1.product.mapper;import com.starcharge.repository.db1.product.domain.TSapCustomerDO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;@Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(String id,String isValid);
}

TSapCustomerMapper.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="com.abc.repository.db1.product.mapper.TSapCustomerMapper"><!-- 创建数据库与实体类字段对应关系 --><resultMap id="BaseResultMap" type="com.abc.repository.db1.product.domain.TSapCustomerDO"><result property="id" column="id"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="createTime" column="create_time" jdbcType="VARCHAR"/><result property="updateTime" column="update_time" jdbcType="VARCHAR"/><result property="lastVer" column="last_ver" jdbcType="VARCHAR"/><result property="isValid" column="is_valid" jdbcType="VARCHAR"/></resultMap><!--查询列表--><select id="detail" resultMap="BaseResultMap">selectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid = #{isValid} and id = #{id}</select>
</mapper>

上面TSapCustomerMapper.javaTSapCustomerMapper.xml就是一组针对数据库表t_sap_customer的实体类操作,*Mapper.java负责定义实体类的对外Api,*Mapper.xml负责实现具体的CURD操作的SQL语句。

两者使用xml文件中的id属性值来做映射对应,具体来说就是TSapCustomerMapper接口中的detail方法,会到xml文件中找到对应的id='detail'来执行。

二、mapper.xml入参方法

这里常见的一个问题是,我们在执行SQL的时候会有各种入参,那么我们要如何将api中的入参传入xml文件中,请看下面介绍。

1、简单传参

TSapCustomerMapper.javaTSapCustomerMapper.xml 之间,默认按照参数名入参

以下的入参都是可以正常运行的:

//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(String id, String isValid);
}//TSapCustomerMapper.xml<select id="detail" resultMap="BaseResultMap">selectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid = #{isValid} and id = #{id}</select>

2、@Param传参

//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(@Param("id1") String id, @Param("isValid1") String isValid);
}//TSapCustomerMapper.xml<select id="detail" resultMap="BaseResultMap">selectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid = #{isValid1} and id = #{id1}</select>

3、Map入参

//SapCustomerImpl.java
@Service
public class SapCustomerImpl implements SapCustomerService {    @Overridepublic TSapCustomerDO detail(String id) {HashMap<String,String> map=new HashMap<String,String>();map.put("id",id);map.put("isValid","2");TSapCustomerDO r = sapCustomerMapper.detail(map);return r;}
}//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(HashMap query);
}//TSapCustomerMapper.xml<select id="detail" resultMap="BaseResultMap">selectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid = #{isValid} and id = #{id}</select>

4、param、arg入参

xml文件中默认会传入arg0...argNparam1...paramN两个使用索引的入参。arg从0开始,param从1开始。

//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(String id, String isValid);
}//TSapCustomerMapper.xml<select id="detail" resultMap="BaseResultMap">selectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid = #{param2} and id = #{param1}</select>

5、简单入参+Map入参

//SapCustomerImpl.java
@Service
public class SapCustomerImpl implements SapCustomerService {    @Overridepublic TSapCustomerDO detail(String id) {HashMap<String,String> map=new HashMap<String,String>();map.put("isValid","2");TSapCustomerDO r = sapCustomerMapper.detail(id, map);return r;}
}//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(String id, HashMap map);
}//TSapCustomerMapper.xml<select id="detail" resultMap="BaseResultMap">selectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid = #{map.isValid} and id = #{id}</select>

三、#{} 和 ${} 的区别

MyBatis中 #{ }和${ }都可以用来动态传递参数。

1、不同点

#{} 对应底层使用 jdbcPreparedStatementd 对象来执行sql语句,在SQL中相当于一个参数占位符“?”,用来补全预编译语句。它补全预编译语句时,可以理解为在此参数值两端统统使用单引号引起来。 #{} 里除了可以写接收参数的名称外,还可以设置javaTypejdbcTypemode等。

${} 对应底层使用 jdbcStatement 对象来执行sql语句,就是单纯的字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低,也无法复用。但是在有些 #{ }无法胜任的地方,还是会需要${ }来完成。

2、结论

#{} 很大程度防止sql注入,提高系统安全,一般能用#的地方就别用$

${} 无法防止Sql注入,如果写的SQL语句的参数内容应该作为SQL的一部分,此时必须使用$,比如:表名称,order by 排序字段,分组 group by 等。

相关文章:

SpringBoot中Mapper.xml的入参方式

在SpringBoot开发过程中&#xff0c;我们使用 ***Mapper.xml***Mapper.java 来封装对数据库表的 CURD 操作&#xff0c;正常每张表会有一组对应的文件。 一、Mapper常见用法 下面例举一个查询操作&#xff1a; 数据表t_sap_customer&#xff0c;表中有字段id、code、name、c…...

回归预测 | MATLAB实现WOA-RBF鲸鱼优化算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-RBF鲸鱼优化算法优化径向基函数神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-RBF鲸鱼优化算法优化径向基函数神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#…...

浅析Python爬虫ip程序延迟和吞吐量影响因素

作为一名资深的爬虫程序员&#xff0c;今天我们很有必要来聊聊Python爬虫ip程序的延迟和吞吐量&#xff0c;这是影响我们爬取效率的重要因素。这里我们会提供一些实用的解决方案&#xff0c;让你的爬虫程序飞起来&#xff01; 网络延迟 首先&#xff0c;让我们来看看网络延迟对…...

【100天精通python】Day43:python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

目录 1 urlib 库 2 Beautiful Soup库 3 使用代理 3.1 代理种类 HTTP、HTTPS 和 SOCKS5 3.2 使用 urllib 和 requests 库使用代理 3.3 案例&#xff1a;自建代理池 4 实战 提取视频信息并进行分析 1 urlib 库 urllib 是 Python 内置的标准库&#xff0c;用于处理URL、发送…...

Linux:安全技术与防火墙

目录 一、安全技术 1.安全技术 2.防火墙的分类 3.防水墙 4.netfilter/iptables关系 二、防火墙 1、iptables四表五链 2、黑白名单 3.iptables命令 3.1查看filter表所有链 iptables -L ​编辑3.2用数字形式(fliter)表所有链 查看输出结果 iptables -nL 3.3 清空所有链…...

Confluent kafka 异常退出rd_tmpabuf_alloc0: rd kafka topic info_new_with_rack

rd_tmpabuf_alloc0: rd kafka topic info_new_with_rack 根据网上的例子&#xff0c;做了一个测试程序。 C# 操作Kafka_c# kafka_Riven Chen的博客-CSDN博客 但是执行下面一行时&#xff0c;弹出上面的异常&#xff0c;闪退。 consumer.Subscribe(queueName) 解决方案&…...

最新ChatGPT网站程序源码+AI系统+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…...

chatGPT-对话柏拉图

引言&#xff1a; 古希腊哲学家柏拉图&#xff0c;在他的众多著作中&#xff0c;尤以《理想国》为人所熟知。在这部杰作中&#xff0c;他勾勒了一个理想的政治制度&#xff0c;提出了各种政体&#xff0c;并阐述了他对于公正、智慧以及政治稳定的哲学观点。然而&#xff0c;其…...

Java项目-苍穹外卖-Day04

公共字段自动填充 这些字段在每张表基本都有&#xff0c;手动进行填充效率低&#xff0c;且后期维护更改繁琐 使用到注解AOP主要 先答应一个AutoFill注解 再定义一个切面类进行通知 对应代码 用到了枚举类和反射 package com.sky.aspect; /*** 自定义切面类&#xff0c…...

SQL递归获取完整的树形结构数据

在 SQL 中&#xff0c;WITH RECURSIVE 用于创建递归查询&#xff0c;它允许在查询中引用自身。这种查询通常用于处理具有层次结构的数据&#xff0c;例如树形结构。 以下是使用 WITH RECURSIVE 创建递归查询的一般语法&#xff1a; WITH RECURSIVE [alias] ([column1], [colu…...

如何使用营销活动,提升小程序用户的参与度

在当今数字化时代&#xff0c;小程序已成为企业私域营销的重要一环。然而&#xff0c;仅仅拥有小程序还不足以吸引用户的兴趣和参与。营销活动作为推动用户参与的有效手段&#xff0c;可以在激烈的市场竞争中脱颖而出。本文将深入探讨如何使用营销活动&#xff0c;提升小程序用…...

IDEA中使用Docker插件构建镜像并推送至私服Harbor

一、开启Docker服务器的远程访问 1.1 开启2375远程访问 默认的dokcer是不支持远程访问的&#xff0c;需要加点配置&#xff0c;开启Docker的远程访问 # 首先查看docker配置文件所在位置 systemctl status docker# 会输出如下内容&#xff1a; ● docker.service - Docker Ap…...

第7章 高性能门户首页构建

mini商城第7章 高性能门户首页构建 一、课题 高性能门户建设 二、回顾 1、了解文件存储系统的概念 2、了解常用文件服务器的区别 3、掌握Minio的应用 三、目标 1、OpenResty 百万并发站点架构 OpenResty 特性介绍 搭建OpenResty Web站点动静分离方案剖析 2、多级缓存架…...

用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

Byzer-Notebook 是专门为 SQL 而研发的一款 Web Notebook。他的第一公民是 SQL&#xff0c;而 Jupyter 则是是以 Python 为第一公民的。 随着 Byzer 引擎对大模型能力的支持日渐完善&#xff0c; Byzer-Notebook 也在不自觉中变得更加强大。我和小伙伴在聊天的过程中才发现他已…...

学习设计模式之观察者模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 观察者模式 观察者模式定义了一种一对多的依赖关系&#xff0c;一个对象的状态改变&#xff0c;其他所有依赖者都会接收相应的通知。 所…...

课程项目设计--spring security--用户管理功能--宿舍管理系统--springboot后端

写在前面&#xff1a; 还要实习&#xff0c;每次时间好少呀&#xff0c;进度会比较慢一点 本文主要实现是用户管理相关功能。 前文项目建立 文章目录 验证码功能验证码配置验证码生成工具类添加依赖功能测试编写controller接口启动项目 security配置拦截器配置验证码拦截器 …...

学习设计模式之装饰器模式,但是宝可梦

装饰模式 为了不改变组件的结构&#xff0c;动态地扩展其功能。 通常&#xff0c;扩展功能通过子类进行&#xff0c;但是继承的方式具有静态特征&#xff0c;耦合度高。 意图&#xff1a;动态地给对象添加额外的功能 主要解决&#xff1a;继承方式是静态特征&#xff0c;扩…...

【AWS】创建IAM用户;无法登录IAM用户怎么办?错误提示:您的身份验证信息错误,请重试(已解决)

目录 0.背景问题分析 1.解决步骤 0.背景问题分析 windows 11 &#xff0c;64位 我的问题情景&#xff1a; 首先我创建了aws的账户&#xff0c;并且可以用ROOT用户登录&#xff0c;但是在登录时选择IAM用户&#xff0c;输入ROOT的名字和密码&#xff0c;就会提示【您的身份验证…...

微服务基础知识

文章目录 微服务基础知识一、系统架构的演变1、单体应用架构2、垂直应用架构3、分布式SOA架构&#xff08;1&#xff09;什么是SOA&#xff08;2&#xff09;SOA架构 4、微服务架构5、SOA和微服务的关系&#xff08;1&#xff09;SOA&#xff08;2&#xff09;微服务架构 二、分…...

倒残差结构

倒残差结构&#xff1a;   倒残差结构是MobileNetV2中引入的一种设计&#xff0c;用于增强网络的表达能力和特征提取能力&#xff0c;同时保持轻量级的特点。它的核心思想是在每个瓶颈块中&#xff0c;先使用一个扩张卷积&#xff08;Dilated Convolution&#xff09;&#x…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...