首页 > 其他分享 >mybatis 传递参数的7种方法

mybatis 传递参数的7种方法

时间:2024-01-30 11:55:07浏览次数:23  
标签:ResultMsg gender age List 传递 参数 result mybatis

 

文章目录
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>

2.第二种方式 使用@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>

3.使用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);

可以看到使用map来传递多个参数,可以直接使用参数名称进行引用

<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
  select * from employee where gender = #{gender} and age = #{age}
</select>

4.用过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);
}
1

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": ""
}

标签:ResultMsg,gender,age,List,传递,参数,result,mybatis
From: https://www.cnblogs.com/3xiaoleilei/p/17996811

相关文章

  • D35XB60-ASEMI整流桥D35XB60参数、封装、尺寸
    编辑:llD35XB60-ASEMI整流桥D35XB60参数、封装、尺寸型号:D35XB60品牌:ASEMI封装:GBJ-5最大重复峰值反向电压:600V最大正向平均整流电流(Vdss):35A功率(Pd):芯片个数:4引脚数量:5类型:插件、整流桥正向浪涌电流:450A正向电压:1.05V最大输出电压(RMS):封装尺寸:如图工作温度:-40°C~1......
  • C#(10):传值,输出,引用,数组,具名,可选参数,拓展方法
    传值参数:被调用后并不会更改变量值,改变的是方法中传去的变量值副本,仅影响方法中的参数值,不影响变量本身的值变量以及参数指向的是地址,方法调用后参数中重新指向新对象地址,将原来引用的变量对象地址丢弃,重新创建新对象地址  getHashcode方法,获取内存中的对象的has......
  • WebAssembly入门笔记[4]:利用Global传递全局变量
    利用WebAssembly的导入导出功能可以灵活地实现宿主JavaScript程序与加载的单个wasm模块之间的交互,那么如何在宿主程序与多个wasm之间传递和共享数据呢?这就需要使用到Global这个重要的对象了。一、数值类型全局变量二、将JavaScript函数设置为全局变量三、利用全局变量处理字符......
  • 如何使用保留可探测字段参数的方法解决视频监控管理平台EasyCVR无法启动的问题
    有用户反馈,在使用EasyCVR时出现启动失败,服务无法使用的情况。收到用户反馈后,技术人员立即开展解决,以下为解决步骤:注:此解决方法为保留hardware_version可被探测的字段参数。1、首先查看报错日志:2、由上图可见,报错为LocalMachineCheckError!本地机器检查错误!随后检查配置文件,是否因......
  • 如何使用保留可探测字段参数的方法解决视频监控管理平台EasyCVR无法启动的问题
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • MT6789(G99)性能参数/datasheet_MTK联发科4G处理器
    联发科MT6789将4G智能手机带入下一代。基于高效率的台积电N6(6nm级)芯片生产工艺,该芯片可全天候实现出色的游戏,加上大摄像头,快速显示,流畅的流媒体和可靠的全球连接。合作伙伴可以定制联发科HelioG99平台,以满足其设备或市场的特定要求。与天玑700相比,MT6789去掉了5G基带。它采用八......
  • 推荐几款IDEA插件,助你玩转Mybatis开发
    在软件开发的征程中,MyBatis框架一直是Java开发者中的首选,其简洁的SQL映射和强大的灵活性使其成为持久层框架的瑰宝。然而,在我们开发过程中,很多人都曾面对过一个相对繁琐的问题:如何高效而准确地将数据库表映射到实体类和相应的Mapper文件中?如何将单测日志中的SQLLOG快速高......
  • 线程分批处理数据及MyBatis的批量插入
    文章目录一、背景二、代码实现:三、分页查询下游批次处理场景四、MyBatis的批量插入1、活动表简单表结构:2、业务层组装数据:一、背景数据量较多时,我们常常遇到需要分批处理的情况,比如上千上万数据需要需要操作数据库时(入库或者更新),我们想到分批处理,或者解析文件数据量较多,我......
  • 为什么button command 不需要lambda函数添加参数 但是 bind 需要
    combo=tk.ttk.Combobox(frame_combo,values=self.lis,width=25,font=("MicrosoftYaHei",20))combo.pack(side='top',anchor="nw")combo.set("请选择功能")combo.option_add("*TCombobox*......
  • tar中的参数 cvf,xvf,cvzf,zxvf的使用
    tar中的参数cvf,xvf,cvzf,zxvf的使用:https://blog.csdn.net/adminsheery/article/details/127491059?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170650878916800182140677%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=1706508......