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 Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
浅谈自定义校验注解ConstraintValidator
Jun 30 Java/Android
如何给HttpServletRequest增加消息头
Jun 30 Java/Android
Java面试题冲刺第十九天--数据库(4)
Aug 07 Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
Mar 17 Java/Android
Spring Bean是如何初始化的详解
Mar 22 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
Java实现带图形界面的聊天程序
Jun 10 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代码片段
2015/09/24 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
python矩阵的转置和逆转实例
2018/12/12 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
python实现udp传输图片功能
2020/03/20 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
对祖国的寄语大全
2014/04/11 职场文书
工程索赔意向书
2014/08/30 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
干部考核工作总结2015
2015/07/24 职场文书