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

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

5.png前言


在 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 微服务商城


SpringBoot 3+ Vue3 单体权限管理系统

相关文章
|
10月前
|
SQL 存储 Java
Mybatis源码解析:详述初始化过程
以上就是MyBatis的初始化过程,这个过程主要包括SqlSessionFactory的创建、配置文件的解析和加载、映射文件的加载、SqlSession的创建、SQL的执行和SqlSession的关闭。这个过程涉及到了MyBatis的核心类和接口,包括SqlSessionFactory、SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、Configuration、SqlSession和Executor等。通过这个过程,我们可以看出MyBatis的灵活性和强大性,它可以很好地支持定制化SQL、存储过程以及高级映射,同时也避免了几
196 20
|
11月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1102 29
|
11月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
467 4
|
11月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
11月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1404 1
Spring boot 使用mybatis generator 自动生成代码插件
|
11月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
871 0
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
642 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
703 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。

推荐镜像

更多
  • DNS