MyBatis 四大核心组件之 ParameterHandler 源码解析

news2024/11/28 0:32:38

🚀 作者主页: 有来技术
🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 仓库主页: Gitee 💫 Github 💫 GitCode
💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

在这里插入图片描述

目录

  • 前言
  • ParameterHandler 接口
  • DefaultParameterHandler 类
    • setParameters 方法
    • getParameterValue 方法
  • 结语
  • 开源项目

前言

在 MyBatis 中,ParameterHandler 是四大核心组件之一,负责将 Java 方法的参数解析成 SQL 语句中的参数。在本文中,我们将详细介绍 ParameterHandler 的源码,并解释复杂对象作为参数时一个和多个的区别和原因。

ParameterHandler 接口

ParameterHandler 接口定义了参数解析器的基本方法,包括:

  • setParameters(PreparedStatement ps):将 Java 方法的参数设置到 PreparedStatement 中。
  • getParameterObject():获取 Java 方法的参数对象。
  • getParameterType():获取 Java 方法的参数类型。

DefaultParameterHandler 类

DefaultParameterHandler 类是 ParameterHandler 接口的默认实现,它提供了参数解析的默认实现。DefaultParameterHandler 类中包含了两个重要的成员变量:

  • parameterObject:Java 方法的参数对象。
  • mappedStatement:当前正在执行的 SQL 语句的映射语句。

setParameters 方法

setParameters 方法是 ParameterHandler 接口的核心方法,它负责将 Java 方法的参数设置到 PreparedStatement 中。setParameters 方法的实现如下:

@Override
public void setParameters(PreparedStatement ps) throws SQLException {
  // 获取 Java 方法的参数对象
  Object parameterObject = getParameterObject();

  // 获取当前正在执行的 SQL 语句的映射语句
  MappedStatement mappedStatement = getMappedStatement();

  // 获取 SQL 语句中的参数映射
  List<ParameterMapping> parameterMappings = mappedStatement.getParameterMappings();

  // 遍历参数映射
  for (int i = 0; i < parameterMappings.size(); i++) {
    // 获取参数映射
    ParameterMapping parameterMapping = parameterMappings.get(i);

    // 获取参数值
    Object value = getParameterValue(parameterMapping, parameterObject);

    // 设置参数值
    ps.setObject(i + 1, value);
  }
}

getParameterValue 方法

getParameterValue 方法负责获取参数值。getParameterValue 方法的实现如下:

private Object getParameterValue(ParameterMapping parameterMapping, Object parameterObject) {
  // 获取参数类型
  Class<?> parameterType = parameterMapping.getJavaType();

  // 获取参数名称
  String parameterName = parameterMapping.getProperty();

  // 获取参数值
  Object value = null;
  if (parameterType == String.class) {
    value = (String) parameterObject;
  } else if (parameterType == Integer.class) {
    value = (Integer) parameterObject;
  } else if (parameterType == Long.class) {
    value = (Long) parameterObject;
  } else if (parameterType == Float.class) {
    value = (Float) parameterObject;
  } else if (parameterType == Double.class) {
    value = (Double) parameterObject;
  } else if (parameterType == Date.class) {
    value = (Date) parameterObject;
  } else if (parameterType == byte[].class) {
    value = (byte[]) parameterObject;
  } else {
    // 如果参数类型是复杂类型,则需要使用反射获取参数值
    try {
      Field field = parameterObject.getClass().getDeclaredField(parameterName);
      field.setAccessible(true);
      value = field.get(parameterObject);
    } catch (NoSuchFieldException e) {
      throw new RuntimeException("Error getting parameter value: " + e.getMessage());
    } catch (IllegalAccessException e) {
      throw new RuntimeException("Error getting parameter value: " + e.getMessage());
    }
  }

  // 返回参数值
  return value;
}

这两个方法结合起来完成了将 Java 方法的参数解析并设置到 PreparedStatement 的过程。

结语

通过深入理解 MyBatis 中 ParameterHandler 的源码,我们能够更好地把握参数解析的机制,提高 SQL 语句的执行效率。同时,了解复杂对象作为参数时的处理方式,能够更灵活地应对各种场景。在实际应用中,合理地使用参数映射规范,能够使 SQL 语句更加清晰易读,提高开发效率。

开源项目

  • SpringCloud + Vue3 微服务商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移动端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 单体权限管理系统
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

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

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

相关文章

55.手写实现grpc连接池以及gin和grpc交互

文章目录 一、简介前置说明 二、敏感词过滤服务1、定义sensitive.proto文件2、protoc生成pb.go文件3、sensitive服务端实现 三、关键词匹配服务1、编写keywords.proto文件2、生成pb.go文件3、keywords服务端实现 四、gin web 路由服务1、新建grpcpool服务作为gin web服务2、根据…

.net core提示The xx field is required,One or more validation errors occurred

访问接口时缺少model中的参数时&#xff0c;会提示&#xff1a; The xx field is required One or more validation errors occurred原因是.net core webapi默认参数为不可空&#xff0c;因此会验证并报错。 解决方案&#xff1a; 在项目的.csproj中&#xff0c;修改Nullable…

2023团体程序设计天梯赛——模拟赛和总决赛题

M-L1-1 嫑废话上代码 Linux 之父 Linus Torvalds 的名言是&#xff1a;“Talk is cheap. Show me the code.”&#xff08;嫑废话&#xff0c;上代码&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一行中输出…

华为新款笔记本搭载5nm麒麟芯片,来源成谜,可能让大家失望了~

近日&#xff0c;华为公司悄悄推出了一款基于国产技术打造的全新商用笔记本——华为擎云L540。目前&#xff0c;华为擎云L540在京东平台悄然上线的&#xff0c;尚未在华为官方渠道公开售卖。华为擎云L540搭载了麒麟9006C处理器&#xff0c;采用先进的5nm制程工艺&#xff0c;8 …

大数据HCIE成神之路之数据预处理(1)——缺失值处理

缺失值处理 1.1 删除1.1.1 实验任务1.1.1.1 实验背景1.1.1.2 实验目标1.1.1.3 实验数据解析 1.1.2 实验思路1.1.3 实验操作步骤1.1.4 结果验证 1.2 填充1.2.1 实验任务1.2.1.1 实验背景1.2.1.2 实验目标1.2.1.3 实验数据解析 1.2.2 实验思路1.2.3 实验操作步骤1.2.4 结果验证 1…

JAVA高级(后端需深入移步)

单元测试&#xff1a;使用Junit单元测试框架 使用Junit单元测试&#xff1a; 通过左侧的对❌来进行提示 Junit框架的常见注解&#xff1a; 反射&#xff08;用于框架&#xff0c;也是最重要&#xff09;&#xff1a;展示框架的成员信息 由于是用于对象&#xff0c;即使在获取…

PHP基础 - 类型比较

在 PHP 中,作为一种弱类型语言,它提供了松散比较和严格比较两种方式来比较变量的值和类型。 松散比较: 使用两个等号(==)进行比较,只会比较变量的值,而不会考虑它们的数据类型。例如: $a = 5; // 整数 $b = 5; // 字符串if ($a == $b) {echo "相等"; // 输…

Go性能分析工具

前言 作为后端研发&#xff0c;性能分析是我们在研发过程中必然会会遇到的环节&#xff0c;接口耗时、堆栈溢出、内存泄露等等。所谓工欲善其事必先利其器&#xff0c;之前在java中我们是使用arthas这一大神器&#xff0c;不得不说确实好用&#xff0c;想了解arthas的可以看下…

Zookeeper单机模式搭建

1、下载 ​wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 2、解压 tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz 3、进入 apache-zookeeper-3.6.3-bin目录下&#xff0c;创建data cd apache-zookeeper-3.6.3-bin mkdir da…

面试官:性能测试瓶颈调优你是真的会吗?

引言&#xff1a;性能瓶颈调优 在实际的性能测试中&#xff0c;会遇到各种各样的问题&#xff0c;比如 TPS 压不上去等&#xff0c;导致这种现象的原因有很多&#xff0c;测试人员应配合开发人员进行分析&#xff0c;尽快找出瓶颈所在。 理想的性能测试指标结果可能不是很高&…

CGAL的2D符合规定的三角剖分和网格

1、符合规定的三角剖分 1.1、定义 如果三角形的任何面的外接圆在其内部不包含顶点&#xff0c;则该三角形是 Delaunay 三角形。 约束 Delaunay 三角形是一种尽可能接近 Delaunay 的约束三角形。 约束 Delaunay 三角形的任何面的外接圆在其内部不包含从该面可见的数据点。 如果…

Leetcode—1768.交替合并字符串【简单】

2023每日刷题&#xff08;五十五&#xff09; Leetcode—1768.交替合并字符串 实现代码 class Solution { public:string mergeAlternately(string word1, string word2) {int len1 word1.size(), len2 word2.size();string ans;for(int i 0; i < len1 || i < len2;…

编译Android14 AOSP原生代码并运行X86模拟器镜像过程记录

最近在研究Android Entreprise部分的特性&#xff0c;需要在Android手机上分析WorkProfile相关的源码&#xff0c;因为新买的Pixel样机还未到货&#xff0c;看了几天Android源码&#xff0c;迫切需要上真机对比分析。 又听说最近几年Android模拟器已经有些进步&#xff0c;至少…

IDEA远程调试与JDWP调试端口RCE漏洞

文章目录 前言Docker远程调试Java调试原理远程调试实践 JDWP端口RCE调试端口探测调试端口利用 总结 前言 在对一些 Java CVE 漏洞的调试分析过程中&#xff0c;少不了需要搭建漏洞环境的场景&#xff0c;但是本地 IDEA 搭建的话既麻烦&#xff08;通过 pom.xml 导入各种漏洞组…

散列卡片悬停变为整齐列表

效果展示 CSS 知识点 transform 属性运用 页面整体布局 <ul><li><div class"box"><img src"./user1.jpg" /><div class"content"><h4>Hamidah</h4><p>commented on your photo.<br />…

每日OJ题_算法_双指针④_力扣11. 盛最多水的容器

目录 力扣11. 盛最多水的容器 解析代码 力扣11. 盛最多水的容器 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 难度 中等 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两…

APP备案(Android) - 获取签名证书公钥、MD5

因为近期刚针对各应用平台对APP备案时间节点要求进行了统一整理&#xff0c;然后隔天就被要求提供一下app相关的的公钥和MD5&#xff0c;虽然很快就解决了这个事情&#xff0c;但忍不住又稍微衍生了一下&#xff0c;但行小步&#xff0c;莫问远方吧 关联Blog APP备案(Android)…

【Spring Boot 源码学习】ApplicationListener 详解

Spring Boot 源码学习系列 ApplicationListener 详解 引言往期内容主要内容1. 初识 ApplicationListener2. 加载 ApplicationListener3. 响应应用程序事件 总结 引言 书接前文《初识 SpringApplication》&#xff0c;我们从 Spring Boot 的启动类 SpringApplication 上入手&am…

harmonyOS创建低的代码开发模式项目 带你基本不写代码完成一个界面跳转的小案例

之前 我们讲了 JavaScript类Web开发模式和ArkTS开发模式 但是 有人就会说 我一点代码基础都没有 难道就不能开发鸿蒙了吗&#xff1f; 其实也是可以的 本文来讲述一下低代码开发模式 我们先打开编辑器 先创建一个项目 默认模板 直接下一步 这里配置中 我们输入名称 然后选择…

【Vulnhub 靶场】【hacksudo: ProximaCentauri】【简单 - 中等】【20210608】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶场下载&#xff1a;https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年06月08日 文件大小&…