MyBatis框架中各种参数类型绑定的方式

MyBatis框架中各种参数类型绑定的方式

一、MyBatis参数绑定

MyBatis框架中,通过Mapper接口和Mapper映射文件的方式来操作数据库的时候,可能需要通过Mapper接口中的方法传递相应的参数拼接到SQL语句上面,那么Mybatis将传递的参数映射到对应SQL上面的过程,我们就叫做参数绑定。下面介绍MyBatis框架里面,几种常见的参数绑定类型。

1.1、单个参数

当Mapper接口里面的方法只有一个参数的时候,这个时候参数名称和Mapper映射文件里面的参数名称可以不一致,为什么呢???因为你这个方法既然只有一个参数,MyBatis就只能使用这一个参数,那这个参数叫什么名称也就没有什么规定了。

  • 创建Mapper接口方法。
package cn.js.mapper;import cn.js.domain.User;import java.util.List;/*** @author js* @version 1.0.0* @Date: 2023/9/7 12:14* @Description*/
public interface UserMapper {/*** 一个参数的情况* @param id* @return*/List<User> queryList(Integer id);
}
  • 定义Mapper映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList" resultType="cn.js.domain.User"parameterType="java.lang.Integer">select * from userwhere id = #{abc}</select></mapper>

上面定义了一个参数的接口方法,可以看到接口方法中的参数名称叫做:id,而在XML映射文件里面则是使用【#{abc}】来获取的参数,MyBatis对于只有一个参数的时候,是支持这种写法的。

在这里插入图片描述

1.2、多个参数

当接口方法需要传递多个参数的时候,这个时候XML映射文件里面,参数名称就不能任意编写了,那要如何获取到具体某个参数值呢???MyBatis框架支持下面三种方式进行参数绑定:

三种参数获取方式:

  • 第一种方式:通过【arg0】【arg1】等等参数名称来获取参数值。
  • 第二种方式:通过【param0】【param1】等参数名称来获取参数值。
  • 第三种方式:通过@Param注解获取指定参数名称的对应关系。

(1)arg和param获取参数

MyBatis对于多个参数的情况下,框架会默认按照接口方法中参数的顺序,依次将这些参数保存到一个map集合里面,而这个map集合是以【arg】或者【param】两个作为key的,对应的value就是具体的参数值。

举例如下:

  • 接口方法中有两个参数时候,这个时候MyBatis会将参数保存到map集合里面。
  • 【map.put(“arg0”, “参数1”);】或者【map.put(“param0”, “参数1”);】
  • 【map.put(“arg1”, “参数2”);】或者【map.put(“param1”, “参数2”);】
  • 多个参数依次类推,【map.put(“argn”, “参数n”);】或者【map.put(“paramn”, “参数n”);】。

按照上面的规则,我们只需要在XML映射文件里面,通过对应的参数key就可以获取到对应的参数值。

package cn.js.mapper;import cn.js.domain.User;import java.util.List;/*** @author js* @version 1.0.0* @Date: 2029/8/6 13:14* @Description*/
public interface UserMapper {/*** 多个参数情况* @param id* @param username* @return*/List<User> queryList2(Integer id, String username);
}
  • 定义的XML映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList2" resultType="cn.js.domain.User">select * from userwhere id = #{arg0}and username = #{param2}</select>
</mapper>

【arg】和【param】可以混合使用,这两种获取参数的方式都是MyBatis支持的。

在这里插入图片描述

(2)@Param注解获取参数

通过上面方式获取参数来看,太不方便了,我们还需要确保【arg】和【param】对应哪个参数,如果不小心对应错了,不容易发现问题所在,为了解决这个问题,MyBatis提供了@Param注解,@Param注解的作用就是将接口方法参数和XML映射文件中的参数进行关系映射。

package cn.js.mapper;import cn.js.domain.User;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** @author js* @version 1.0.0* @Date: 2023/9/7 14:14* @Description*/
public interface UserMapper {/*** 多个参数的情况* @param id* @param username* @return*/List<User> queryList3(@Param("id") Integer id, @Param("uname") String username);
}
  • 定义XML映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList3" resultType="cn.js.domain.User">select * from userwhere id = #{id}and username = #{uname}</select>
</mapper>

上面这种方式是实际开发里面最常用的,因为这种方式更加的直观,参数绑定关系一目了然。

在这里插入图片描述

1.3、Map类型参数

MyBatis框架对于多个参数的时候,是采用Map集合来保存的,那么我们就可以自己定义Map集合作为参数,使用的时候也是直接通过key获取对应的参数值即可。

package cn.js.mapper;import cn.js.domain.User;import java.util.List;
import java.util.Map;/*** @author js* @version 1.0.0* @Date: 2023/9/9 10:12* @Description*/
public interface UserMapper {/*** Map集合参数* @param map* @return*/List<User> queryList4(Map<String, String> map);
}
  • Mapper映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList4" resultType="cn.js.domain.User">select * from userwhere id = #{id}and username = #{uname}</select>
</mapper>

1.4、JavaBean类型参数

MyBatis对于JavaBean类型的参数,它在进行参数绑定的时候,是根据对应的【getter】方法来获取参数值的,也就是说,XML映射文件里面的参数名称,必须是在JavaBean实体类里面具有【getXXX()】方法的,这样才能够进行参数绑定。

package cn.js.mapper;import cn.js.User;import java.util.List;/*** @author js* @version 1.0.0* @Date: 2023/9/8 09:14* @Description*/
public interface UserMapper {/*** 实体类参数* @param user* @return*/List<User> queryList5(User user);}
  • 创建XML映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList5" resultType="cn.js.domain.User">select * from userwhere id = #{id}and username = #{username}</select>
</mapper>

实体类参数绑定规则如下所示:

在这里插入图片描述

1.5、List集合类型

集合类型的参数,在实际开发里面,使用最多的场景就是【IN】条件查询,批量插入、批量更新的操作。

package cn.js.mapper;import cn.js.domain.User;import java.util.List;/*** @author js* @version 1.0.0* @Date: 2023/9/8 17:21* @Description*/
public interface UserMapper {/*** 集合类型参数* @param ids* @return*/List<User> queryList6(List<String> ids);
}
  • 创建XML映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList6" resultType="cn.js.domain.User">select * from userwhere id in<foreach collection="list" open="(" close=")" item="id" separator=",">#{id}</foreach></select>
</mapper>

MyBatis对于集合类型的参数,如果没有使用@Param注解明确指定参数名称,那么MyBatis框架会默认采用**【arg0,list、collection】**三个参数名称进行映射,所以我们在使用的参数的时候,不能使用接口方法参数名称,只能够使用【arg0,list、collection】这三个参数名称。

<!-- 使用 collection 参数名称 -->
<foreach collection="collection" open="(" close=")" item="id" separator=",">#{id}
</foreach><!-- 使用 arg0 参数名称 -->
<foreach collection="arg0" open="(" close=")" item="id" separator=",">#{id}
</foreach><!-- 使用 list 参数名称 -->
<foreach collection="list" open="(" close=")" item="id" separator=",">#{id}
</foreach>

当然,如果我们通过@Param注解指定了具体的参数名称,那就直接使用具体的参数名称就好啦。

1.6、Set集合类型参数

对于Set集合参数类型来说,它其实和List集合是类似的,只不过Set集合在没有指定具体参数名称的时候,MyBatis框架默认提供了**【arg0,collection】**两个参数名称,相比于List集合,Set集合缺少一个参数名称。

package cn.js.mapper;import cn.js.domain.User;import java.util.List;
import java.util.Set;/*** @author js* @version 1.0.0* @Date: 2023/9/8 17:30* @Description*/
public interface UserMapper {/*** 集合参数类型* @param ids* @return*/List<User> queryList7(Set<String> ids);
}
  • 创建XML映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList7" resultType="cn.js.domain.User">select * from userwhere id in<foreach collection="arg0" open="(" close=")" item="id" separator=",">#{id}</foreach></select>
</mapper>

Set集合类型参数只提供了两种默认的参数名称可供选择。

<!-- 使用 collection 参数名称 -->
<foreach collection="collection" open="(" close=")" item="id" separator=",">#{id}
</foreach><!-- 使用 arg0 参数名称 -->
<foreach collection="arg0" open="(" close=")" item="id" separator=",">#{id}
</foreach>

1.7、数组类型参数

对于数组类型的参数,MyBatis默认提供了两种参数名称可供选择,分别是:【arg0,array】

package cn.js.mapper;import cn.js.domain.User;import java.util.List;/*** @author js* @version 1.0.0* @Date: 2022/9/7 10:26* @Description*/
public interface UserMapper {/*** 数组类型参数* @param ids* @return*/List<User> queryList8(int[] ids);
}
  • 定义XML映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.mapper.UserMapper"><!-- 编写查询SQL语句 --><select id="queryList8" resultType="cn.js.domain.User">select * from userwhere id in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach></select>
</mapper>

注意:以上这些类型参数,MyBatis都默认提供了一些参数名称,例如:arg0,param0,list、array、collection等。

但是,在实际开发中,都是会通过@Param注解来指定具体的参数名称,因为这样更加的直观清晰。

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

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

相关文章

Debian11安装MySQL8.0,链接Navicat

图文小白教程 1 下载安装MySQL1.1 从MySQL官网下载安装文件1.2 安装MySQL1.3 登录MySQL 2 配置Navicat远程访问2.1 修改配置2.2 Navicat 连接 end: 卸载 MySQL 记录于2023年9月&#xff0c;Debian11 、 MySQL 8.0.34 1 下载安装MySQL 1.1 从MySQL官网下载安装文件 打开 MySQ…

FFmpeg入门之FFmpeg源码编译

1.源码下载: git clone https://github.com/FFmpeg/FFmpeg.git windows : macos: ubuntu: 2.编译FFmpeg CompilationGuide – FFmpeg windows: 1.下载yasm并安装 : Download - The Yasm Modular Assembler Project 下载后复制到c:/windows 2.下载SDL 3.下载H264/265源码 git…

stringBuffer.append(“字符串参数“);这个在字符串参数后添加空格怎么写

stringBuffer.append(“字符串参数”);这个在字符串参数后添加空格怎么写&#xff1f; 要在字符串参数后添加空格&#xff0c;可以直接在字符串参数的末尾使用空格字符&#xff0c;像这样&#xff1a; stringBuffer.append("字符串参数 ");这样就在字符串参数后添加…

【HTML5高级第三篇】drag拖拽、音频视频、defer/async属性、dialog应用

文章目录 一、拖拽事件1.1 拖拽事件1.2 案例&#xff1a;拖拽丢弃图片 二、音频和视频三、defer 与 async 属性3.1 概述3.2 示例一&#xff1a;3.3 示例二&#xff1a; 四、dialog 元素 一、拖拽事件 原生JavaScipt案例合集 JavaScript DOM基础 JavaScript 基础到高级 Canvas…

637. 二叉树的层平均值

637. 二叉树的层平均值 题目-简单难度示例1. bfs 题目-简单难度 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…

爬虫逆向实战(29)-某蜂窝详情页(cookie、混淆、MD5、SHA)

一、数据接口分析 主页地址&#xff1a;某蜂窝 1、抓包 通过抓包可以发现数据是静态的&#xff0c;在html中。 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cookie是否加密&#xff1f; 通过查看“c…

Windows wsl2安装Ubuntu

wsl&#xff08;Windows Subsystem for Linux&#xff09;即适用于Windows的Linux子系统&#xff0c;是一个实现在Windows 10 / 11上运行原生Linux的技术。 wsl2 为其迭代版本&#xff0c;可以更好的在Windows上运行Linux子系统。 这里以 Windows 11 安装Ubuntu作为示例。 开启…

kafka学习-消费者

目录 1、消费者、消费组 2、心跳机制 3、消费者常见参数配置 4、订阅 5、反序列化 基本概念 自定义反序列化器 6、位移提交 6.1、自动提交 6.2、手动提交 同步提交 异步提交 7、再均衡 7.1、定义与基本概念 7.2、缺陷 7.3、如何避免再均衡 7.4、如何进行组内分…

电脑同时连接有线和无线网络怎么设置网络的优先级

电脑同时连接有线和无线网络怎么设置网络的优先级&#xff1a; 我们知道在 笔记本电脑系统 中&#xff0c;可以通过有线或无线网络进行联网。如果电脑在有线网络和无线网络同时存在的情况&#xff0c;应该怎么设置有线网络优先连接呢?对此我们提供下面的方法可以让电脑在有Wi…

链路追踪Skywalking快速入门

目录 1 Skywalking概述1.1 微服务系统监控三要素1.2 什么是链路追踪1.2.1 链路追踪1.2.2 OpenTracing1、数据模型&#xff1a;2、核心接口语义 1.3 常见APM系统1.4 Skywalking介绍1、SkyWalking 核心功能&#xff1a;2、SkyWalking 特点&#xff1a;3、Skywalking架构图&#x…

【C++】string类模拟实现上篇(附完整源码)

目录 前言1. string的基本结构2. 构造函数、析构函数2.1 构造函数的实现2.1.1带参构造函数 2.2析构函数2.3无参构造函数2.4无参和带参构造函数合并 3. string的遍历3.1 operator[ ]3.2迭代器模拟实现 (简单实现&#xff09;3.3 const迭代器模拟实现 4. 数据的增删查改4.1 reser…

基于TensorFlow 2.3.0 的手势识别系统设计

一、开发环境 Windows 10PyCharm 2021.3.2Python 3.7TensorFlow 2.3.0 二、制作数据集&#xff0c;作者使用了10个类别的手势数集据 三、开始训练模型&#xff0c;作者使用自己开发的软件进行训练模型&#xff0c;方便快捷。软件介绍及下载地址&#xff1a; 手把手教你使用T…

原生js之dom表单改变和鼠标常用事件

那么好,本次我们聊聊表单改变时如何利用onchange方法来触发input改变事件以及鼠标常用的滑入滑出,点击down和点击up事件. 关于onchange方法 onchange方法在鼠标输入完后点击任何非输入框位置时触发.触发时即可改变原有输入框的值. out 、leave、over、down、up鼠标方法 当用…

KMP超高效匹配算法

简介&#xff1a; KMP算法是一种改进的字符串匹配算法&#xff0c;其中&#xff0c;KMP算法的运用核心是利用匹配失败后的信息&#xff0c;最大进度的减少模式串与目标串的匹配次数以达到快速匹配的效果。算法与暴力求解的改进在于每当一趟匹配过程中出现的字符比较不相等时&am…

Django创建应用、ORM的进阶使用及模型类数据库迁移

1 Django项目创建第一个应用 Django 项目就是基于 Django 框架开发的 Web 应用&#xff0c;它包含了一组配置和多个应用&#xff0c;我们把应用称之为 App&#xff0c;在前文中对它也做了相应的介绍&#xff0c;比如 auth、admin&#xff0c;它们都属于 APP。 一个 App 就是一…

postman token 请求头添加

思路&#xff1a; 1、登录成功后将 得到的token设置为集合变量 2、在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm.response.json(); if(responseData.code 1) {// 获取tokenconst {data:{token}} responseData// 设置为集合变量pm.colle…

C# 实现电子签名

本项目基于Emgu.CV&#xff08;C#下OpenCv的封装&#xff09;开发的&#xff0c;编译器最新版Vs2022&#xff0c;编译环境x86 直接看效果图 1.主页面 2.我们先看手写的方式&#xff1a; 点击确认就到主界面&#xff0c;如下 &#xff1a; 点击自动适配-&#xff0c;再点击生成…

《C++设计模式》——创建型

前言 创建型为了创建东西才是有用的&#xff0c;创建型设计模式使用的场景&#xff1a; 1、创建一个东西&#xff1b; 2、可重复利用&#xff1b; 3、灵活性高&#xff0c;代码可因地制宜。 Factory Method(工厂模式) 工厂模式将目的将创建对象的具体过程屏蔽隔离起来&#…

go channel实践与源码探索(初始化、发送消息、接收消息、关闭)

文章目录 概要一、并发编程1.1、Actor模型1.2、CSP模型 二、Go Channel实践三、源码分析3.1、初始化3.2、发送消息3.3、接收消息3.4、关闭通道 总结 概要 通道&#xff08;Channel&#xff09;是Go语言提供的协程之间通信与同步的方式。我们知道在并发编程&#xff08;多进程、…

时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化

时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化 目录 时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 北方苍鹰优化算法NGO优化VMD&#xff0c;对其分解层数&#xff0c;惩罚因子数做优化…