当前位置: 首页 > article >正文

Javaweb梳理15——MyBatis参数传递以及注解实现CURD

Javaweb梳理15——MyBatis参数传递以及注解实现CURD

  • 15 MyBatis参数传递
    • 15.1 MyBatis参数传递
    • 15.2 单个参数

15 MyBatis参数传递

15.1 MyBatis参数传递

如下面的代码。就是接收连个参数,而接受多个参数需要使用@Param注解,那么为什么要加该注解呢?这个问题要弄明白就必须来研究Mybatis底层对于这些参数是如何处理的。

User select(@Param("username") String username,
@Param("password")String password);
<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{username}
    	and password=#{password}
</select>

我们在接口方法中定义多个参数,Mybatis会将这些参数封装成Map集合对象,值就是参数值,而键在没有使用@Param注解时有以下命名规则:

  • 以arg开头:第一个参数就叫arg0;第二个参数就叫arg1,以此类推。如:

map.put(“arg0”,参数值1);
map.put(“arg1”,参数值2);

  • 以param开头:第一个参数就叫param1,第二个参数就叫param2,以此类推,如:

map.put(“param1”,参数值1);
map.put(“param2”,参数值2);

代码验证:

  • UserMapper 接口中定义如下方法
User select(String username,String password);
  • UserMapper.xml 映射配置文件中定义SQL
<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{arg0}
    	and password=#{arg1}
</select>

或者

<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{param1}
    	and password=#{param2}
</select>
  • 运行代码结果如下
    在这里插入图片描述

在映射配合文件的SQL语句中使用用 arg 开头的和 param 书写,代码的可读性会变的特别差,此时可以使用 @Param 注解。
在接口方法参数上使用 @Param 注解,Mybatis 会将 arg 开头的键名替换为对应注解的属性值。

代码验证:
UserMapper 接口中定义如下方法,在 username 参数前加上 @Param 注解

User select(@Param("username") String username, String password);

Mybatis 在封装 Map 集合时,键名就会变成如下:

map.put(“username”,参数值1);
map.put(“arg1”,参数值2);
map.put(“param1”,参数值1);
map.put(“param2”,参数值2);

  • UserMapper.xml 映射配置文件中定义SQL
<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{username}
    	and password=#{param2}
</select>
  • 运行程序结果没有报错。而如果将 #{} 中的 username 还是写成 arg0
<select id="select" resultType="user">
	select *
    from tb_user
    where 
    	username=#{arg0}
    	and password=#{param2}
</select>
  • 运行程序则可以看到错误
    在这里插入图片描述
    结论:以后接口参数是多个时,在每个参数上都使用 @Param 注解。这样代码的可读性更高。

15.2 单个参数

  • POJO类型
    直接使用。要求 属性名参数占位符名称 一致
  • Map集合类型
    直接使用。要求 map集合的键名参数占位符名称 一致
  • Collection集合类型
    Mybatis 会将集合封装到 map 集合中,如下:

map.put(“arg0”,collection集合);
map.put(“collection”,collection集合);
可以使用 @Param 注解替换map集合中默认的 arg 键名。

  • List集合类型
    Mybatis 会将集合封装到 map 集合中,如下:

map.put(“arg0”,list集合);
map.put(“collection”,list集合);
map.put(“list”,list集合);
可以使用 @Param 注解替换map集合中默认的 arg 键名。

  • Array类型
    Mybatis 会将集合封装到 map 集合中,如下:

map.put(“arg0”,数组);
map.put(“array”,数组);
可以使用 @Param 注解替换map集合中默认的 arg 键名。

  • 其他类型
    比如int类型,参数占位符名称 叫什么都可以。尽量做到见名知意。如下:
  • 查询 :@Select
  • 添加 :@Insert
  • 修改 :@Update
  • 删除 :@Delete
    接下来我们做一个案例来使用 Mybatis 的注解开发
    代码实现
    将之前案例中UserMapper.xml中的根据id查询数据的statement注释掉
    在这里插入图片描述
  • UserMapper 接口的 selectById 方法上添加注解
    在这里插入图片描述
  • 运行测试程序也能正常查询到数据
    我们课程上只演示这一个查询的注解开发,其他的同学们下来可以自己实现,都是比较简单。
    注意:在官方文档中 入门 中有这样的一段话:
    在这里插入图片描述
    所以,注解完成简单功能,配置文件完成复杂功能。
    而我们之前写的动态 SQL 就是复杂的功能,如果用注解使用的话,就需要使用到 Mybatis 提供的SQL构建器来完成,而对应的代码如下:
    在这里插入图片描述
    上述代码将java代码和SQL语句融到了一块,使得代码的可读性大幅度降低。
      MyBatis 参数封装:
        * 单个参数:
            1. POJO类型:直接使用,属性名 和 参数占位符名称 一致
            2. Map集合:直接使用,键名 和 参数占位符名称 一致
            3. Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
                map.put("arg0",collection集合);
                map.put("collection",collection集合);
            4. List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
                map.put("arg0",list集合);
                map.put("collection",list集合);
                map.put("list",list集合);
            5. Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
                map.put("arg0",数组);
                map.put("array",数组);
            6. 其他类型:直接使用
        * 多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
            map.put("arg0",参数值1)
            map.put("param1",参数值1)
            map.put("param2",参数值2)
            map.put("agr1",参数值2)
            ---------------@Param("username")
            map.put("username",参数值1)
            map.put("param1",参数值1)
            map.put("param2",参数值2)
            map.put("agr1",参数值2)

http://www.kler.cn/a/398444.html

相关文章:

  • 三十九、Python(pytest框架-中)
  • 【Ubuntu24.04】使用服务器
  • 深度学习--卷积神经网络
  • 结构化需求分析与设计
  • 基于STM32的智能温室控制系统设计
  • ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析
  • 【Ansible常用命令+模块+Playbook+Roles】
  • React中Redux的基本用法
  • uniapp: vite配置rollup-plugin-visualizer进行小程序依赖可视化分析减少vender.js大小
  • 华为USG5500防火墙配置NAT
  • 【网络安全 | 漏洞挖掘】通过密码重置污染实现账户接管
  • 《TCP/IP网络编程》学习笔记 | Chapter 13:多种 I/O 函数
  • git的常用用法(最简精华版)
  • 【软考】系统架构设计师-计算机系统基础(4):计算机网络
  • 任意文件下载漏洞
  • 基于Jmeter的分布式压测环境搭建及简单压测实践
  • WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统
  • Http常⻅见请求/响应头content-type内容类型讲解(笔记)
  • Linux的指令(三)
  • 【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析
  • Spring-事务学习
  • yolov8目标检测如何设置背景/无标签图像参与训练
  • cooper+隐含数+2元cooper
  • 编辑器vim 命令的学习
  • 快速了解Zookeeper和etcd实现的分布式锁
  • 关于宝塔无法在php中安装fileinfo