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 相关文章推荐
Java如何实现树的同构?
Jun 22 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Java Lambda表达式常用的函数式接口
Apr 07 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
spring IOC容器的Bean管理XML自动装配过程
May 30 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
Android开发手册Chip监听及ChipGroup监听
Jun 10 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
app场景下uniapp的扫码记录
Jul 23 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中的正则表达式函数介绍
2012/02/27 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
javascript self对象使用详解
2016/10/18 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
在Python的Django框架中编写错误提示页面
2015/07/22 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
python同步两个文件夹下的内容
2019/08/29 Python
python 实现按对象传值
2019/12/26 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
应届毕业生个人自我评价
2013/09/20 职场文书
中学生班主任评语
2014/01/30 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python