java executor包参数处理功能 


Posted in Java/Android onFebruary 15, 2022

sql语句中的参数赋值是有由executor包中的parameter子包完成的。

parameter子包其实只有一个parameterHandler接口,它定义了2个方法:

public interface ParameterHandler {

  Object getParameterObject();

  void setParameters(PreparedStatement ps)
      throws SQLException;

}

ParameterHandler接口有一个默认的实现类DefaultParameterHandler,它在scripting包的子包中。

mybatis中支持进行参数设置的语句类型是PreparedStatement接口及其子接口CallableStatement, 所以setParameters的输入参数是PreparedStatement类型。

setParameters方法的实现逻辑就是依次取出每个参数的值,然后根据参数类型调用PreparedStatement中的赋值方法进行赋值。

public class DefaultParameterHandler implements ParameterHandler {
  // 类型处理器注册表
  private final TypeHandlerRegistry typeHandlerRegistry;
  // MappedStatement对象(包含完整的增删改查节点信息)
  private final MappedStatement mappedStatement;
  // 参数对象
  private final Object parameterObject;
  // BoundSql对象(包含SQL语句、参数、实参信息)
  private final BoundSql boundSql;
  // 配置信息
  private final Configuration configuration;

  public DefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    this.mappedStatement = mappedStatement;
    this.configuration = mappedStatement.getConfiguration();
    this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
    this.parameterObject = parameterObject;
    this.boundSql = boundSql;
  }

  @Override
  public Object getParameterObject() {
    return parameterObject;
  }

  /**
   * 为语句设置参数
   * @param ps 语句
   */
  @Override
  public void setParameters(PreparedStatement ps) {
    ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
    // 取出参数列表
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    if (parameterMappings != null) {
      for (int i = 0; i < parameterMappings.size(); i++) {
        ParameterMapping parameterMapping = parameterMappings.get(i);
        // ParameterMode.OUT是CallableStatement的输出参数,已经单独注册。故忽略
        if (parameterMapping.getMode() != ParameterMode.OUT) {
          Object value;
          // 取出属性名称
          String propertyName = parameterMapping.getProperty();
          if (boundSql.hasAdditionalParameter(propertyName)) {
            // 从附加参数中读取属性值
            value = boundSql.getAdditionalParameter(propertyName);
          } else if (parameterObject == null) {
            value = null;
          } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
            // 参数对象是基本类型,则参数对象即为参数值
            value = parameterObject;
          } else {
            // 参数对象是复杂类型,取出参数对象的该属性值
            MetaObject metaObject = configuration.newMetaObject(parameterObject);
            value = metaObject.getValue(propertyName);
          }
          // 确定该参数的处理器
          TypeHandler typeHandler = parameterMapping.getTypeHandler();
          JdbcType jdbcType = parameterMapping.getJdbcType();
          if (value == null && jdbcType == null) {
            jdbcType = configuration.getJdbcTypeForNull();
          }
          try {
            // 此方法最终根据参数类型,调用java.sql.PreparedStatement类中的参数赋值方法,对SQL语句中的参数赋值
            typeHandler.setParameter(ps, i + 1, value, jdbcType);
          } catch (TypeException | SQLException e) {
            throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
          }
        }
      }
    }
  }

}

到此这篇关于java executor包参数处理功能 的文章就介绍到这了,更多相关executor包参数处理功能 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
springboot中一些比较常用的注解总结
Jun 11 Java/Android
Spring Bean的实例化之属性注入源码剖析过程
Jun 13 Java/Android
深入理解以DEBUG方式线程的底层运行原理
Jun 21 Java/Android
启动Tomcat时出现大量乱码的解决方法
Jun 21 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Android Flutter实现图片滑动切换效果
Apr 07 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
springboot集成redis存对象乱码的问题及解决
Jun 16 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 #Java/Android
Java实现给Word文件添加文字水印
Feb 15 #Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 #Java/Android
利用Sharding-Jdbc进行分库分表的操作代码
关于MybatisPlus配置双数据库驱动连接数据库问题
Jan 22 #Java/Android
JavaCV实现照片马赛克效果
Jan 22 #Java/Android
maven依赖的version声明控制方式
You might like
PHP初学入门
2006/11/19 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
python实现多进程代码示例
2018/10/31 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
python标准库OS模块详解
2020/03/10 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
详解python的super()的作用和原理
2020/10/29 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
Otel.com:折扣酒店预订
2017/08/24 全球购物
同学聚会主持词
2014/03/18 职场文书
元宵晚会主持词
2014/03/25 职场文书
会计求职自荐信
2015/03/26 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL