mybatis 传递参数的7种方法

2023-11-09

文章目录

1.第一种方式 匿名参数 顺序传递参数

2.第二种方式 使用@Param注解

3.使用Map传递参数

4.用过java bean传递多个参数

5.直接使用JSON传递参数

6.传递集合类型参数List、Set、Array

7.参数类型为对象+集合

在实际开发过程中,增删改查操作都要涉及到请求参数的传递,今天这节就集中讲下在mybatis中传递参数的7中方法

单个参数的传递很简单没有什么好将的,这里主要说下多个参数的传递

  1. 第一种方式 匿名参数 顺序传递参数

controller

@ApiOperation(value = "多个参数查询_匿名顺序传参")
@GetMapping("findByParams")
public ResultMsg findByParams(Short gender,String age)
{
    List result= employeeMapper.selectByGenderAndAge(gender,age);
    return ResultMsg.getMsg(result);
}

mapper

List<Employee> selectByGenderAndAge(Short gender,String age );

xml

<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
  select * from employee where gender = #{gender} and age = #{age}
</select>
注意这里按参数名去引用的话会报如下错误,mybatis错误提示很细致,这里明确给我们提示,匿名参数只能使用

arg1, arg0, param1, param2 类似的形式

这种传参方式的缺点是不够灵活,必须严格按照参数顺序来引用
BindingException: Parameter 'gender' not found. Available parameters are [arg1, arg0, param1, param2]

所以正确的引用方式如下:

  <select id="selectByGenderAndAge" resultMap="BaseResultMap" >
    select *  from employee where gender = #{param1} and age = #{param2}
  </select>
  1. 第二种方式 使用@Param注解

controller

@ApiOperation(value = "多个参数查询_注解方式传参")
@GetMapping("findByParams2")
public ResultMsg findByParams2(Short gender,String age)
{
    List result= employeeMapper.selectByGenderAndAge2(gender,age);
    return ResultMsg.getMsg(result);
}

mapper

使用@Param注解显示的告诉mybatis参数的名字,这样在xml中就可以按照参数名去引用了

List<Employee> selectByGenderAndAge( @Param("gender") Short gender,@Param("age") String age );

xml

<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
  select * from employee where gender = #{gender} and age = #{age}
</select>
  1. 使用Map传递参数

实际开发中使用map来传递多个参数是一种推荐的方式

controller

@ApiOperation(value = "多个参数查询")
@GetMapping("findByMapParams")
public ResultMsg findByMapParams(Short gender,String age)
{
    Map params = new HashMap<>();
    params.put("gender",gender);
    params.put("age",age);
    List result= employeeMapper.selectByMapParams(params);
    return ResultMsg.getMsg(result);
}

mapper

List<Employee> selectByMapParams(Map params);

List<Employee> selectByMapParams(Map params);

<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
  select * from employee where gender = #{gender} and age = #{age}
</select>
  1. 用过java bean传递多个参数

也可以使用bean的方式来传递多个参数,使用时parameterType指定为对应的bean类型即可

这就传参方式的优点是比较方便,controller层使用@RequestBody接收到实体类参数后,直接传递给mapper层调用即可,不需要在进行参数的转换

controller

@ApiOperation(value = "多个参数查询_通过Java Bean传递多个参数")
@PostMapping("findByBeans")
public ResultMsg findByBeans(@RequestBody Employee employee)
{
    List result= employeeMapper.selectByBeans(employee);
    return ResultMsg.getMsg(result);
}

mapper

List <Employee> selectByBeans(Employee employee);

xml

参数的引用直接使用bean的字段

<select id="selectByBeans" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Employee">
  select
  *
  from employee where gender = #{gender} and age = #{age}
</select>

测试一下:

5.直接使用JSON传递参数

这也是推荐的一种传参方式,controller层收到JSON型数据后,直接传递给mapper层进行查询操作,简单 方便

controller

@ApiOperation(value = "多个参数查询_通过JSON传递多个参数")
@PostMapping("findByJSONObject")
public ResultMsg findByJSONObject(@RequestBody JSONObject params)
{
    List result= employeeMapper.findByJSONObject(params);
    return ResultMsg.getMsg(result);
}

mapper

List <Employee> findByJSONObject(JSONObject params);
<select id="findByJSONObject" resultMap="BaseResultMap" parameterType="com.alibaba.fastjson.JSONObject">
  select
  *
  from employee where gender = #{gender} and age = #{age}
</select>

测试一下:

6.传递集合类型参数List、Set、Array

在一些复杂的查询中(如 sql中的 in操作),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array类型的参数传递,具体使用如下:

controller

@ApiOperation(value = "多个参数查询_通过List、Set、Array传递多个参数")
@PostMapping("findByList")
public ResultMsg findByList(@RequestBody List<String> list)
{
    List result= employeeMapper.findByList (list);
    return ResultMsg.getMsg(result);
}

mapper

List <Employee> findByList(List list);

xml

  <select id="findByList" resultMap="BaseResultMap" >
SELECT * from employee where age in
    <foreach collection="list" open="(" separator="," close=")" item="age">
      #{age}
    </foreach>
  </select>

这里foreach表示循环操作,具体的参数含义如下:

foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,

index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

open表示该语句以什么开始,

separator表示在每次进行迭代之间以什么符号作为分隔符,

close表示以什么结束

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

  • 1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

  • 2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

  • 3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map或者Object

测试:

7.参数类型为对象+集合

该类参数与java Bean参数形式类似,只不过更复杂一些,如下面的Department类,除了基本字段还包括一个Employee的列表

bean

@Data
public class Department {
    private Long id;

    private String deptName;

    private String descr;

    private Date createTime;

    List<Employee> employees;

}

controller

@ApiOperation(value = "多个参数查询_对象+集合参数")
@PostMapping("findByDepartment")
public ResultMsg findByDepartment(@RequestBody Department department)
{
    List result= employeeMapper.findByDepartment(department);
    return ResultMsg.getMsg(result);
}

mapper

List <Employee> findByDepartment(@Param("department")Department department);

xml

<select id="findByDepartment" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Department">
    SELECT * from employee where dept_id =#{department.id} and age in
    <foreach collection="department.employees" open="(" separator="," close=")" item="employee">
        #{employee.age}
    </foreach>
</select>

这里foreach 对应Departmen部门中的List employees

请求参数: 查询部门Id=1,并且年龄 等于24和25的员工

{
  "createTime": "2019-07-02T10:17:16.756Z",
  "deptName": "string",
  "descr": "string",
  "employees": [
    {
      "age": "24",
    },
    {
      "age": "25",
    }
  ],
  "id": 1
}

结果:

{
  "data": [
    {
      "address": "北新街ndcpc",
      "age": "24",
      "createTime": 1562062434000,
      "deptId": "1",
      "gender": 1,
      "id": "318397755696631808",
      "name": "kls0bx19cy"
    },
    {
      "address": "北新街lavi0",
      "age": "25",
      "createTime": 1562062436000,
      "deptId": "1",
      "gender": 1,
      "id": "318397755801489408",
      "name": "gj9q3ygikh"
    }
  ],
  "result": "SUCCESS",
  "resultCode": 200,
  "resultMsg": ""
}

————————————————

版权声明:本文为CSDN博主「独钓寒江雪~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/bdqx_007/article/details/94836637

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis 传递参数的7种方法 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • JAVA垃圾回收机制

    大家好 我是皮卡 这次分享的是JAVA垃圾回收机制 如果有需要或是感兴趣的话 就一起看下去吧 目录 一 手动垃圾回收机制 二 自动垃圾回收机制 1 概念 2 判断哪些对象有用 3 finalize方法 final finally final
  • docker 命令学习

    帮助命令 dockers version 显示docker的版本信息 docker info 显示docker的系统信息 包括镜像和容器数量 docker 命令 help 帮助命令 通过这个查看命令参数等 在官方文档查看命令 https d
  • 软件测试(二)——软件测试的方法

    基于直觉和经验的方法 基于经验和直觉推测程序中所有可能存在的各种错误 从而有针对性地设计测试用例 1 Ad hoc测试方法和ALAC测试 ALAC 是Act like a customer 象客户那样做 的简写 ALAC测试方法是一种基于客
  • 虚拟ip的概念

    1 虚拟IP是什么 要是单讲解虚拟 IP 理解起来很困难 所以干脆把 动态 IP 固定 IP 实体 IP 与虚拟 IP都讲解一下 加深理解和知识扩展 实体 IP 在网络的世界里 为了要辨识每一部计算机的位置 因此有了计算机 IP 位址的定义
  • 3-论文笔记--《Privacy-preserving and Efficient Aggregation based on Blockchain for Power Grid...》

    题目 Privacy preserving and Efficient Aggregation based on Blockchain for Power Grid Communications in Smart Communities 基
  • 理解构造器为什么不能被继承

    不能 因为子类继承父类的时候 先运行父类构造函数 具体的说就是运行父类时就会先 调用 父类的构造函数 注意 调用 和继承不是一个含义 实质上是 自动运行 继承 extends 的含义其实是 扩展 子类完全没必要扩展父类的构造函数 因为反正每
  • eslint自定义规则(禁用 localStorage和sessionStorage)

    背景 项目为了统一管理localStorage和sessionStorage 使用了统一的方法对Storage进行存取 为限制项目成员直接使用localStorage和sessionStorage 需要通过eslint对直接引用的形式加以限
  • 我与GPT的一次关于Orb-SLAM3源码(包括2)的深入对话

    目录 一 前言 二 关于Orb SLAM3的代码结构 三 关于system 3 1 关于摄像头初始化 3 2 关于摄像头模型化 3 2关于初始化 四 关于ORBVocabulary 五 关于优化 六 小结 一 前言 Orb SLAM2或者3
  • 【微信小程序】微信退款注意事项及退款通知信息解密

    1 商户退款单号 out refund no 必须唯一 如果不唯一微信端返回的错误提示是 支付单号校验不一致 需要注意 2 退款解密算法注意操作密钥 在此记录下解密代码 1 对加密串A做base64解码 得到加密串B 2 对商户key做md
  • 线程最大线程数什么时候会被创建

    线程最大线程数什么时候会被创建 前言 之前一直错误的以为线程池在执行过程中会先判断核心数然后在判断最大线程数最后才加入队列 完全错误 已经下已代码展示最大线程数量在什么时候才会被创建 1 首先创建一个队列长度只有10的时候 启动10个线程
  • 基于一道ctf 引发的 TP链分析

    回看 newstarctf week 3 的web题 想了想看看tp链吧 这道题是tp5 1 的版本 链比5 0的 短而且清晰 基于我这个shaluan tp不知道为什么动态调试出了问题 就只能静态分析了 首先是定入口 这里5 0和5 1的
  • 将2个链表交替合并成一个链表

    将带有头结点的2个线性单链表交替有规则的合并成为一个链表 今天做这个的时候 又犯了以前一个愚蠢的错误 对于有些代码 为了方便我就直接复制了 编译器查出来有错 我一直看不出来错误在哪里 那一块我直接就忽略了 代码不敢随便复制 我画个图我认为直
  • 考研同济六版课后必做题

    考研数学必做习题 同济6版 第1章 第1节 映射与函数 习题1 1 4 1 2 3 7 8 9 10 5 1 2 3 4 7 1 8 9 1 2 13 15 1 2 3 4 17 18 第1章 第2节 数列的极限 习题1 2 1 1 2 4
  • 【微信】微信小程序前后端数据请求示例

    本篇内容简介之 微信小程序的前后端数据交互示例 主要涉及到获取服务端的数据 和提交到服务端的数据演示 服务端使用java springboot进行快速搭建演示 1 在小程序中的index wxml中进行一个表单的设计 例如 说明一下wxml
  • CMake中set_target_properties/get_target_property的使用

    CMake中的set target properties命令用于为targets设置属性 targets can have properties that affect how they are built 其格式如下 set target
  • 推荐

    1 搭建你自己的神经网络 Make Your Own Neural Network 价格 45 美元 一步步让你了解神经网络的数学原理并用 Python 搭建自己的神经网络 神经网络是深度学习和人工智能的关键元素 然而 几乎很少有人真正了解
  • DITA Topic常用开发

    DITA Topic常用开发 Concept Topic用于描述类 Task Topic用于过程类 步骤类 Reference Topic用于过 DITA Topic开发特殊 应急维护手册使用 xtask 案例集手册使用 trbcase 巡
  • 破解2018的Pycharm的与下载JetbrainsCrack-3.1-release-enc.jar的架包

    https pan baidu com s 1L2uJeQIwg jDvHa7t tB6Q 提取码 143o 安装 找到安装目录如下 这里面根据下的版本号来引入 我用的是3 1的 博客转发的是2 8的 要改成3 1 C Program Fi
  • 蓝桥杯2019年第十届真题-人物相关性分析

    题目 题目链接 题解 字符串 滑动区间 不想写题解了 bug没de出来 吃饭去了 代码 我的代码 不知道为什么一直就是91 有大佬帮忙看一下吗 include
  • mybatis 传递参数的7种方法

    文章目录 1 第一种方式 匿名参数 顺序传递参数 2 第二种方式 使用 Param注解 3 使用Map传递参数 4 用过java bean传递多个参数 5 直接使用JSON传递参数 6 传递集合类型参数List Set Array 7 参数