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

🚀 作者主页: 有来技术

🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot

🌺 仓库主页: Gitee 💫 Github 💫 GitCode

💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

目录

  • 前言
  • [ParameterHandler 接口](#ParameterHandler 接口)
  • [DefaultParameterHandler 类](#DefaultParameterHandler 类)
    • [setParameters 方法](#setParameters 方法)
    • [getParameterValue 方法](#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 方法的实现如下:

java 复制代码
@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 方法的实现如下:

java 复制代码
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 微服务商城
Github Gitee
后端 youlai-mall 🍃 youlai-mall 🍃
前端 mall-admin🌺 mall-admin 🌺
移动端 mall-app 🍌 mall-app 🍌
  • SpringBoot 3+ Vue3 单体权限管理系统
Github Gitee
后端 youlai-boot 🍃 youlai-boot 🍃
前端 vue3-element-admin 🌺 vue3-element-admin 🌺
相关推荐
景熙55237 小时前
JDBC 详解:从原理到实战(含完整可运行 Demo)
java·spring·tomcat·mybatis·jdbc
程序猿乐锅8 小时前
一文讲透缓存穿透、击穿和雪崩
java·redis·spring·缓存·mybatis
程序猿乐锅11 小时前
【黑马点评 | 第九篇】秒杀优化-异步实现
java·spring boot·redis·后端·spring·中间件·mybatis
大漠孤烟s1 天前
7.mybatisplus学习-条件构造器、插件、通用枚举、多数据源环境、MybatisX
mybatis
ee又momo1 天前
MyBatis-Plus 用了就回不去,这些功能真香
mybatis
大漠孤烟s7 天前
4.Mybatis学习-动态sql、缓存、逆向工程
mybatis
毕业设计7039 天前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
程序员JerrySUN9 天前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
linmengmeng_13149 天前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
vx_BS8133010 天前
【项目编号:project51381】Spring Boot 婚纱摄影管理系统:套餐预约、在线咨询、支付与客片展示的一站式业务实现
java·spring boot·eclipse·tomcat·mybatis