MyBatis——MyBatis 参数处理

news2024/7/4 4:33:56

一、单个简单类型参数

简单类型包括:

  • byte short int long float double char

  • Byte Short Integer Long Float Double Character

  • String

  • java.util.Date

  • java.sql.Date

parameterType 属性:告诉 MyBatis 参数的类型

MyBatis 自带类型自动推断机制,所以大部分情况下 parameterType 属性可以不写

对于部分类型 MyBatis 内置已经起了别名,可以直接使用别名

参考文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases

<select id="selectById" resultType="Account" parameterType="java.lang.String">
    select * from t_act where actno = #{actno};
</select>

二、Map 参数 

这种方式是手动封装 Map 集合,将每个条件以 key 和 value 的形式存放到集合中。

在使用的时候通过 #{map集合的key} 来取值。

/**
* 根据name和age查询
* @param paramMap
* @return
*/
List<Student> selectByParamMap(Map<String,Object> paramMap);
@Test
public void testSelectByParamMap(){
    // 准备Map
    Map<String,Object> paramMap = new HashMap<>();
    paramMap.put("nameKey", "张三");
    paramMap.put("ageKey", 20);

    List<Student> students = mapper.selectByParamMap(paramMap);
    // students.forEach(student -> System.out.println(student));
    students.forEach(System.out::println);
}
<select id="selectByParamMap" resultType="student">
  select * from t_student where name = #{nameKey} and age = #{ageKey}
</select>

三、实体类参数 

这里需要注意的是:#{} 里面写的是属性名字。这个属性名其本质上是:set/get 方法名去掉 set/get 之后的名字。  

/**
 * 保存学生数据
 * @param student
 * @return
 */
int insert(Student student);
<insert id="insert">
  insert into t_student values(null,#{name},#{age},#{height},#{birth},#{sex})
</insert>
@Test
public void testInsert(){
    Student student = new Student();
    student.setName("李四");
    student.setAge(30);
    student.setHeight(1.70);
    student.setSex('男');
    student.setBirth(new Date());
    int count = mapper.insert(student);
    SqlSessionUtil.openSession().commit();
}

四、多参数 

/**
 * 根据name和sex查询
 * @param name
 * @param sex
 * @return
 */
List<Student> selectByNameAndSex(String name, Character sex);
@Test
public void testSelectByNameAndSex(){
    List<Student> students = mapper.selectByNameAndSex("张三", '女');
    // students.forEach(student -> System.out.println(student));
    students.forEach(System.out::println);
}
<select id="selectByNameAndSex" resultType="student">
  select * from t_student where name = #{name} and sex = #{sex}
</select>

执行结果:

异常信息描述了:name 参数找不到,可用的参数包括 [arg1, arg0, param1, param2]

修改 StudentMapper.xml 配置文件:尝试使用 [arg1, arg0, param1, param2] 取参数

<select id="selectByNameAndSex" resultType="student">
  <!--select * from t_student where name = #{name} and sex = #{sex}-->
  select * from t_student where name = #{arg0} and sex = #{arg1}
</select>

执行结果:

再次尝试修改 StudentMapper.xml 文件  

<select id="selectByNameAndSex" resultType="student">
  <!--select * from t_student where name = #{name} and sex = #{sex}-->
  <!--select * from t_student where name = #{arg0} and sex = #{arg1}-->
  <!--select * from t_student where name = #{param1} and sex = #{param2}-->
  select * from t_student where name = #{arg0} and sex = #{param2}
</select>

通过测试可以看到:

  • arg0 是第一个参数

  • param1 是第一个参数

  • arg1 是第二个参数

  • param2 是第二个参数

实现原理:实际上在 mybatis 底层会创建一个 map 集合,以 arg0/param1 为 key,以方法上的参数为 value

// mybatis 部分源码
Map<String,Object> map = new HashMap<>();
map.put("arg0", name);
map.put("arg1", sex);
map.put("param1", name);
map.put("param2", sex);

// 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2}
// 其本质就是 #{map集合的key}

注意:使用 mybatis 3.4.2 之前的版本时:要用 #{0} 和 #{1} 这种形式。

五、@Param 注解(命名参数) 

map 集合的 key 可以自定义:使用使用 @Param 注解即可  

@Param("这里填写的其实就是 map 集合的 key")

使用注解之后 arg0 arg1 失效了,但是 param1 param2 还可以用  

/**
 * 根据name和age查询
 * @param name
 * @param age
 * @return
 */
List<Student> selectByNameAndAge(@Param(value="name") String name, 
                                 @Param("age") int age);
@Test
public void testSelectByNameAndAge(){
    List<Student> stus = mapper.selectByNameAndAge("张三", 20);
    // stus.forEach(student -> System.out.println(student));
    stus.forEach(System.out::println);
}
<select id="selectByNameAndAge" resultType="student">
  select * from t_student where name = #{name} and age = #{age}
</select>

六、@Param 源码分析 

MyBatis 框架中的 @Param 注解主要用于在 SQL 语句中传递参数,并且可以指定参数的名称,以便在 SQL 语句中引用

下面是 @Param 注解的核心原理解析:

  • 参数绑定: 当使用 @Param 注解时,MyBatis 会将注解中指定的参数名与参数值进行绑定,这样在 XML 映射文件或者注解中就可以通过参数名引用对应的参数值。

  • 构建参数Map: 在处理带有 @Param 注解的方法参数时,MyBatis 会将这些带有 @Param 注解的参数构建成一个参数 Map,在执行 SQL 语句时,会将这个参数 Map 传递给 SQL 语句,以便提供参数值。

  • 参数替换: MyBatis 在解析 SQL 语句时,会检测到带有 @Param 注解的参数,并将参数值替换到 SQL 语句中对应的位置,从而构建最终可执行的 SQL 语句。

  • 参数处理: MyBatis 在执行 SQL 语句时,会根据参数 Map 中的参数名和值来替换 SQL 语句中的参数占位符,从而执行 SQL 查询操作。

  • 参数传递: 使用 @Param 注解可以明确指定参数的名称,避免参数不明确导致的错误,同时也可以方便地在 SQL 语句中引用具体的参数值。

总的来说,@Param 注解的核心原理是通过将带有注解的参数与参数值进行绑定,并构建参数 Map,以便在 SQL 语句中引用参数值并执行查询操作。这样可以提高代码的可读性和准确性。

一  叶  知  秋,奥  妙  玄  心

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

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

相关文章

部署Discuz论坛项目

DIscuz 是由 PHP 语言开发的一款开源社交论坛项目。运行在典型的LNMP/LAMP 环境中。 安装MySQL数据库5.7 主机名IP地址操作系统硬件配置discuz-db192.168.226.128CentOS 7-mini-20092 Core/4G Memory 修改主机名用来自己识别 hostnamectl set-hostname discuz-db #重连远程…

虚拟资源在线交易服务平台源码 线上虚拟商品交易平台搭建

在信息爆炸的时代&#xff0c;虚拟资源、素材、源码系统等等以其独特的魅力&#xff0c;逐渐成为人们日常生活和工作中不可或缺的一部分。如何高效地获取、管理和交易这些虚拟资源&#xff0c;分享一款虚拟资源在线交易服务平台源码&#xff0c;轻松搭建线上虚拟商品交易平台&a…

【全开源】智慧小区物业管理小程序基于FastAdmin+UniApp

基于FastAdminUniApp开发的智慧小区物业管理小程序&#xff0c;包含小区物业缴费、房产管理、在线报修、业主活动报名、在线商城等功能。为物业量身打造的智慧小区运营管理系统&#xff0c;贴合物业工作场景&#xff0c;轻松提高物业费用收缴率&#xff0c;更有功能模块个性化组…

HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现首页图片切换轮播效果&#xff0c;共有1个页面…

【网络安全产品互联互通 告警信息资产信息】相关思维导图

近日&#xff0c;在某客户安全建设项目中&#xff0c;涉及安全告警事件的梳理上报。在整理及学习中发现最近&#xff08;以19年等保2.0为参考分隔“最近”&#xff09;发布的可参考标准&#xff0c;因此做了思维导图的整理。 PS&#xff1a;标准中存在引用的情况&#xff0c;过…

OpenHarmony NAPI 使用Cmake 编译C++ .so 并ets调用

一、前言 这两年多随着国产化兴起&#xff0c;国内越来越多的项目都要求支持国产化系统&#xff0c;并且随着OpenHarmony 开源&#xff0c;更多的人都想分一杯羹。因此&#xff0c;我们公司也要求&#xff0c;所有产品的都需要支持开源鸿蒙OpenHarmony。 对于我们这边的设备&am…

Mybatis进阶详细用法

目录 条件构造器 案例 自定义SQL 案例 Service接口 案例 综合案例 条件构造器 案例 Testvoid testQueryMapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…

uniapp小程序:大盒子包裹小盒子但是都有点击事件该如何区分?

在开发过程中我们会遇到这种情况&#xff0c;一个大盒子中包裹这一个小盒子&#xff0c;两个盒子都有点击事件&#xff0c;例如&#xff1a; 这个时候如果点击评价有可能会点击到它所在的大盒子&#xff0c;如果使用css中的z-index设置层级的话如果页面的盒子多的话会混乱&…

基于微信小程序+JAVA Springboot 实现的【停车场小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 停车场微信小程序的设计与实现 在当前信息技术飞速发展的背景下&#xff0c;停车场微信小程序的开发成为了一个创新的解决方案&#xff0c;旨在提高停车场管理的效率和用户的停车体验。本项目通过深入分析现有停车场管理系统的不足&#xff0c…

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移 在本文中&#xff0c;将介绍如何构建一个实时数据pipeline&#xff0c;从MySQL数据库读取数据&#xff0c;通过Kafka传输数据&#xff0c;最终将数据存储到HDFS中。我们将使用Apache Spark的结构化流处理和流处理功能&#…

[Linux][网络][高级IO][一][五种IO模型][同步通信][异步通信][非阻塞IO]详细讲解

目录 0.预备知识 && 思考问题1.五种IO模型0.形象理解五种模型1.阻塞IO2.非阻塞IO3.信号驱动IO4.多路转接/多路复用5.异步IO 2.高级IO重要概念1.同步通信 vs 异步通信2.阻塞 vs 非阻塞 3.非阻塞IO1.fcntl()2.实现SetNonBlock 0.预备知识 && 思考问题 网络通信本…

华为认证存储HCIE有用吗?

首先&#xff0c;对于个人来说&#xff0c;获得华为存储认证可以证明其具备信息存储技术的专业能力 1.专业认可&#xff1a;获得华为存储认证&#xff0c;尤其是HCIE-Storage级别的证书&#xff0c;意味着持有者对信息存储技术有着全面深入的理解&#xff0c;能够设计、部署、…

不同品牌的SSL证书价格差异大吗?

在数字化时代&#xff0c;网络安全的重要性日益凸显&#xff0c;SSL证书作为保护网站和用户数据安全的重要工具&#xff0c;其价值不言而喻。SSL证书通过加密技术保障网站与用户之间的通信安全&#xff0c;防止敏感信息的泄露和篡改。对于网站运营者而言&#xff0c;了解SSL证书…

LearnOpenGL(十三)之网格

一、网格 组合模型的每个单独的形状就叫做一个网格(Mesh)。比如说有一个人形的角色&#xff1a;艺术家通常会将头部、四肢、衣服、武器建模为分开的组件&#xff0c;并将这些网格组合而成的结果表现为最终的模型。一个网格是我们在OpenGL中绘制物体所需的最小单位&#xff08;…

Android Compose 三:切换主题

1 先瞅瞅lightColorScheme / darkColorScheme 创建项目后 自带一个Theme.kt 判断了 使用哪个ColorScheme 下面看看LightColorScheme &#xff08;亮/暗主题差不多&#xff0c;就是颜色不一样罢了&#xff09; private val LightColorScheme lightColorScheme(primary Pur…

StackQueue+泛型简单理解

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

网络安全快速入门(十一)vi/vim

11.1 了解vi 前面我i们已经在基础命令中大致了解了vi&#xff0c;本章我们针对vi来细讲一下&#xff0c;vi和vim 11.1.1 什么是vi/vim&#xff1f; vi和vim&#xff0c;都是一个模块化的文本编辑工具&#xff0c;换句话讲&#xff0c;通过vi下的一系列的命令&#xff0c;可以实…

群晖NAS本地搭建Bitwarden密码管理服务并实现远程同步密码托管

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序&#xff0c;适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…

如何用时尚新姿讲好中国品牌故事?

品牌建设在推动高质量发展中扮演了双重角色&#xff0c;既是高质量发展的重要“承载者”&#xff0c;也是强有力的“助推器”。5月10日-11日&#xff0c;中国时尚品牌URBAN REVIVO&#xff08;以下简称UR&#xff09;以中国品牌日为起点&#xff0c;联合天猫超级品牌日&#xf…

paddle ocr v4 2.6.1实战笔记

目录 效果图&#xff1a; 安装 模型权重是自动下载&#xff0c;如果提前下载会报错。 识别orc&#xff0c;并opencv可视化结果&#xff0c;支持中文可视化 官方原版预测可视化&#xff1a; 效果图&#xff1a; 安装 安装2.5.2识别结果为空 pip install paddlepaddle-gpu…