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

news2024/11/25 2:34:28

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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where 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 mapper
        PUBLIC "-//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 user
        where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </select>
</mapper>

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

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

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

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

相关文章

用python实现基本数据结构【03/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

03_瑞萨GUI(LVGL)移植实战教程之驱动触摸屏(I2C)

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg # 3. 驱动触摸屏(I2C) 本次实验我们在上一次实验的基础上驱动I2C触摸屏。从这次实验开始&#xff0c;我们不需要重新创建工程&#xff0c;而是在上一次实验项目的基础…

【Unity编辑器扩展】| SceneView面板扩展

前言【Unity编辑器扩展】| SceneView面板扩展一、Scene界面添加右键菜单二、自定义菜单的方式三、Scene视图中禁用选择对象四、OnSceneGUI()五、Gizmos5.1 绘制线框5.2 拓展方法六、Handles总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中…

IDEA中的MySQL数据库所需驱动包的下载和导入方法

文章目录 下载驱动导入方法 下载驱动 MySQL数据库驱动文件下载方法&#xff1a; 最新版的MySQL版本的驱动获取方法&#xff0c;这个超链接是下载介绍的博客 除最新版以外的MySQL版本的驱动获取方法&#xff0c;选择Platform Independent&#xff0c;选择第二个zip压缩包虾藻…

华清远见第六课程作业day3

类 栈 #include <iostream>using namespace std;class Sta{ private:int *data;int top; public:Sta():data(new int(128)){top-1;cout<<"stack::无参构造:"<<endl;}~Sta(){delete data;cout<<"stack::析构函数:"<<this<…

信息安全技术概论-李剑-持续更新

图片和细节来源于 用户 xiejava1018 一.概述 随着计算机网络技术的发展&#xff0c;与时代的变化&#xff0c;计算机病毒也经历了从早期的破坏为主到勒索钱财敲诈经济为主&#xff0c;破坏方式也多种多样&#xff0c;由早期的破坏网络到破坏硬件设备等等 &#xff0c;这也…

顾曼宁(顾曼):颠覆行业,引领共享伞新浪潮

在共享经济浪潮中&#xff0c;有一位勇敢的女性创业者&#xff0c;以其卓越的洞察力和创新思维&#xff0c;成为国内共享晴雨伞行业的领航者——她就是顾曼宁&#xff08;顾曼&#xff09;。作为行业颠覆者和蚂蚁金服战略投资的受益者&#xff0c;她的创业历程彰显了女性创业者…

【Kafka】Kafka再平衡机制及相关参数

背景 Kafka作为一款基于发布订阅模式的消息队列&#xff0c;生产者将消息发送到Kafka集群&#xff08;Brokers&#xff09;中&#xff0c;消费者&#xff08;Consumer Group &#xff09;拉取消息进行消费&#xff0c;实现了异步机制。Kafka中&#xff0c;消费者通常以消费者组…

【Python从入门到进阶】35、selenium基本语法学习

接上篇《34、selenium基本概念及安装流程》 上一篇我们介绍了selenium技术的基础概念以及安装和调用的流程&#xff0c;本篇我们来学习selenium的基本语法&#xff0c;包括元素定位以及访问元素信息的操作。 一、元素定位 Selenium元素定位是指通过特定的方法在网页中准确定位…

SpringMvc--文件上传下载

一.什么是SpringMvc文件上传下载 二.文件上传 编写hpjyController类 编写upload.jsp 建立一个储存图片的文件夹 ​编辑 编写PageController来处理页面跳转 编写工具类PropertiesUtil 编写resource.properties类 编写list.jsp 测试结果 三.文件下载 编写hpjyControll…

Redis集群3.2.11离线安装详细版本(使用Ruby)

1.安装软件准备 1.Redis版本下载 Index of /releases/http://download.redis.io/releases/ 1.2gcc环境准备 GCC(GNU Compiler Collection,GNU编译器套件)是一套用于编译程序代码的开源编译器工具集。它的主要用途是将高级编程语言(如C、C++、Fortran等)编写的源代码转换…

MyBatis之分页查询:MyBatis PageHelper

MyBatis之分页查询&#xff1a;MyBatis PageHelper 简介 MyBatis&#xff0c;作为目前流行的ORM框架&#xff0c;大大方便了日常开发。而对于分页查询&#xff0c;虽然可以通过SQL的limit语句实现&#xff0c;但是比较繁琐。而MyBatis PageHelper的出现&#xff0c;则解决了这…

如何在postman中实现自动化测试?

这里简单演示在postman中怎样实现自动化测试&#xff08;不涉及到用户登录的token认证&#xff09; 导入测试用例文件&#xff0c;测试web接口 postman使用流程&#xff1a;创建collection文件夹&#xff0c;在该文件夹中创建post&#xff0c;get请求&#xff1b;其中传入的参…

Keil MDK-ARM 软件的部分常用快捷键如下

F7&#xff1a;编译。F8: 下载。F9&#xff1a;添加/取消断点。Ctrl F5&#xff1a;调试。Tab&#xff1a;将选中的内容整体右移。Shift Tab&#xff1a;将选中的内容整体左移。Home&#xff1a;将光标移至行首。End&#xff1a;将光标移至行末。Ctrl >&#xff1a;光标…

【SpringMVC】注解、参数传递、返回值和页面跳转的关键步骤

目录 引言 一、常用注解 1.1.RequestMapping 1.2.RequestParam 1.3.RequestBody 1.4.RequestHeader 1.5.PathVariable 二、参数传递 2.1.基础类型String 2.2.复杂类型 2.3.RequestParam 2.4.PathVariable 2.5.RequestBody 2.6.RequestHeader 三、返回值 3.1.vo…

大数据-玩转数据-Flink状态编程(中)

一、键控状态 键控状态是根据输入数据流中定义的键&#xff08;key&#xff09;来维护和访问的。 Flink为每个键值维护一个状态实例&#xff0c;并将具有相同键的所有数据&#xff0c;都分区到同一个算子任务中&#xff0c;这个任务会维护和处理这个key对应的状态。当任务处理…

Jmeter压测监控体系搭建Docker+Influxdb+Grafana

章节目录&#xff1a; 一、背景介绍1.1 概述1.2 拓扑图 二、云服务器设置三、Docker3.1 概述3.2 搭建流程3.3 安装验证3.4 配置docker镜像加速3.5 取消sudo运行(可选操作) 四、InfluxDB4.1 镜像拉取4.2 运行数据库4.3 创建存储 jmeter 数据的库 五、Grafana5.1 镜像拉取5.2 关联…

Day_13 > 指针进阶(2)

目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上&#xff0c;学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…

mysql的索引结构

索引概述 索引&#xff08; index &#xff09;是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就可以在这些…

Spring与OAuth2:实现第三方认证和授权的最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…