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 等。

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

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

相关文章

2023河南萌新联赛第(六)场:河南理工大学 C - 旅游

2023河南萌新联赛第&#xff08;六&#xff09;场&#xff1a;河南理工大学 C - 旅游 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 小C喜欢旅游&#xf…

江西武功山旅游攻略(周末两日游)

一、 往返路线 1: 出发路线 周五晚上上海出发坐火车&#x1f684;到江西萍乡(11.5小时,卧铺550左右) 打车到江西武功山景区,120-150元左右,人均30元,1小时10分左右到达 或者 &#x1f697;到达萍乡北之后 出站后步行200米到长途汽车站&#xff0c;乘旅游巴士直达武功山游…

HCIP STP协议

STP协议 STP协议概念生成树为什么要用STP STP名词解释根网桥根端口指定端口非指定端口 STP的版本802.1DPVSTPVST 快速生成树 STP协议概念 IEEE 802.1d STP&#xff08;生成树协议&#xff0c;Spanning-Tree Protocol&#xff09;协议&#xff1a; ①使冗余端口置于“阻塞状态”…

设计模式(7)模板方法模式

一、定义&#xff1a; 定义一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 //模板方法抽象类 public abstract class AbstractClass {//模板方法publ…

keepalived双机热备,keepalived+lvs(DR)

本节主要学习了keepalivedlvs的作用和配置方法主要配置调度器和web节点&#xff0c;还有keepalived的双击热备&#xff0c;主要内容有概述&#xff0c;安装&#xff0c;功能模块&#xff0c;配置双击热备&#xff0c;验证方法&#xff0c;双击热备的脑裂现象和VIP无法通信。 目…

17.HPA和rancher

文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&…

SQL事务

事务的概念&#xff1a; 事务是在数据库上按照一定的逻辑顺序执行的任务序列&#xff0c;既可以由用户手动执行&#xff0c;也可以由某种数据库程序自动执行。事务就是一些SQL语句组&#xff08;每条单独的SQL语句也算一个事务&#xff09;&#xff0c;其中事务中的SQL…

04-Numpy基础-利用数组进行数据处理

NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式&#xff08;否则需要编 写循环&#xff09;。用数组表达式代替循环的做法&#xff0c;通常被称为矢量化。一般来说&#xff0c;矢量化 数组运算要比等价的纯Python方式快上一两个数量级&#xff08;甚至更多&…

WPF实战项目十二(API篇):配置AutoMapper

1、新建类库WPFProjectShared&#xff0c;在类库下新建文件夹Dtos&#xff0c;新建BaseDto.cs&#xff0c;继承INotifyPropertyChanged&#xff0c;实现通知更新。 public class BaseDto : INotifyPropertyChanged{public int Id { get; set; }public event PropertyChangedEv…

Ant Design Vue 日期选择器DatePicker传给后台日期参数格式问题

花了一个下午才解决&#xff0c;官方组件文档里面是没有处理方案说明的。 项目版本&#xff1a;Ant Design Vue 2.0.2 前端部分代码&#xff1a; <template><a-modal:visible"visible":width"windowWidth":height"800":title"tit…

【C#学习笔记】匿名函数和lambda表达式

文章目录 匿名函数匿名函数的定义匿名函数作为参数传递匿名函数的缺点 lambda表达式什么是lambda表达式闭包 匿名函数 为什么我们要使用匿名函数&#xff1f;匿名函数存在的意义是为了简化一些函数的定义&#xff0c;特别是那些定义了之后只会被调用一次的函数&#xff0c;与其…

牛客:数对

题目&#xff1a; 解题思路&#xff1a;看到题目的时候&#xff0c;一般第1反应是用两个循环暴力解题&#xff0c;时间复杂度是O(n^2)&#xff0c;不能通过&#xff0c;所以要优化&#xff0c;通过找规律。 一、当 y < k 时&#xff0c; 不可能符合题意&#xff0c;所以 y 从…

Docker容器:dockerfile创建 LNMP 服务+Wordpress 网站平台

文章目录 一.环境及准备工作1.项目环境2.服务器环境3.任务需求 二.Linux 系统基础镜像三.docker构建Nginx1.建立工作目录上传安装包2.编写 Dockerfile 脚本3.准备 nginx.conf 配置文件4.生成镜像5.创建自定义网络6.启动镜像容器7.验证 nginx 四.docker构建Mysql1. 建立工作目录…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

android 解决sdk代码冲突

1. 在引用sdk的外面添加排除sdk implementation ("androidx.core:core-ktx:1.9.0"){exclude (group:androidx.appcompat, module:appcompat)} 2. 全局指定对应的sdk版本 configurations.all {resolutionStrategy.eachDependency { DependencyResolveDetails detail…

深度学习loss变为nan的问题

在网上查了一些资料&#xff0c;但是这个情况和网上都不太一样。前100epoch能正常训练&#xff0c;loss缓慢下降&#xff0c;精度缓慢增大&#xff0c;但是突然loss就Nan了&#xff0c;我想应该不是样本问题也不是梯度爆炸或者loss中有除0吧&#xff0c;毕竟都训练了100epoch了…

【DETR】3、Conditional DETR | 拆分 content 和 spatial 来实现对 DETR 的加速

文章目录 一、Conditional DETR 是怎么被提出来的二、Conditional DETR 的具体实现2.1 框架结构2.2 DETR 的 cross-attention 和 Conditional DETR 的 cross-attention 对比 三、效果 论文&#xff1a;Conditional DETR for Fast Training Convergence 代码&#xff1a;https:…

【算法】Java实现KMP算法示例

以下是使用Java实现KMP算法的示例代码&#xff1a; public class KMPAlgorithm {public static void main(String[] args) {String pattern "abc";String text "abcdefabcghi";int[] lps computeLPSArray(pattern);int index search(text, pattern, l…

爬虫逆向实战(二十)--某99网站登录

一、数据接口分析 主页地址&#xff1a;某99网站 1、抓包 通过抓包可以发现登录接口是AC_userlogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”可以发现txtPassword和aws是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无…

Android 之 PowerManager (电源服务)

本节引言&#xff1a; 本节要讲解的是Android为我们提供的系统服务中的——PowerManager(电源服务)&#xff0c;用于 管理CPU运行&#xff0c;键盘或屏幕亮起来&#xff1b;不过&#xff0c;除非迫不得已&#xff0c;否则进来别去使用这个类&#xff0c;假如 你使用以后&#x…