博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis设置参数
阅读量:2155 次
发布时间:2019-05-01

本文共 3350 字,大约阅读时间需要 11 分钟。

简化流程图

 

PreparedStatement

设置如果是PreparedStatement,则最终都是调用PreparedStatement的setXXX方法

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES  SET AGE=?  WHERE ID = ?");                                  pstmt.setInt(1, 20);pstmt.setInt(2, 110592);

注意第1个参数是1(parameterIndex the first parameter is 1, the second is 2, ...)

PreparedStatement相关方法:

 

BoundSql

 

TypeHandler

这里只关注setParameter函数

public interface TypeHandler
{ void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; .......................}

        如果javaType=UnknownTypeHandler ,并且未指定JdbcType,会根据parameter的类型,推断出对应的TypeHandler,比如,参数是String类型的,会推断StringTypeHandler

 

public class UnknownTypeHandler extends BaseTypeHandler {  private static final ObjectTypeHandler OBJECT_TYPE_HANDLER = new ObjectTypeHandler();  private TypeHandlerRegistry typeHandlerRegistry;  public UnknownTypeHandler(TypeHandlerRegistry typeHandlerRegistry) {    this.typeHandlerRegistry = typeHandlerRegistry;  }  @Override  public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)      throws SQLException {    TypeHandler handler = resolveTypeHandler(parameter, jdbcType); // 根据parameter的类型,找到匹配的TypeHandler    handler.setParameter(ps, i, parameter, jdbcType);  }}

 

StringTypeHandler

public class StringTypeHandler extends BaseTypeHandler
{ @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter); }}

 

DefaultParameterHandler
 

public void setParameters(PreparedStatement ps) {	ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());	List
parameterMappings = boundSql.getParameterMappings(); if (parameterMappings != null) { for (int i = 0; i < parameterMappings.size(); i++) { ParameterMapping parameterMapping = parameterMappings.get(i); // 具体的第几个参数-详细信息 if (parameterMapping.getMode() != ParameterMode.OUT) { // IN or INOUT 才处理 Object value; String propertyName = parameterMapping.getProperty(); //得到入参的属性名 比如username、a.id 等 #{id} #{a.id} if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params value = boundSql.getAdditionalParameter(propertyName); } else if (parameterObject == null) { value = null; } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { // 单个参数的类型,如果在typeHandlerRegistry里注册了,value就是=parameterObject value = parameterObject; // 单个参数情况下,并且在typeHandlerRegistry里注册了parameterObject的类型,则value就是=parameterObject } else { MetaObject metaObject = configuration.newMetaObject(parameterObject); // 一般都是走这里的 value = metaObject.getValue(propertyName); // 通过metaObject得到具体要设置pos的值 first parameter is 1, the second is 2 } TypeHandler typeHandler = parameterMapping.getTypeHandler(); // 未指定是UnknownTypeHandler JdbcType jdbcType = parameterMapping.getJdbcType(); if (value == null && jdbcType == null) { jdbcType = configuration.getJdbcTypeForNull(); } try { typeHandler.setParameter(ps, i + 1, value, jdbcType); // first parameter is 1, the second is 2 } catch (TypeException | SQLException e) { throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e); } } } }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://nqxwb.baihongyu.com/

你可能感兴趣的文章
强化学习 8: approximate reinforcement learning
查看>>
图解什么是 Transformer
查看>>
代码实例:如何使用 TensorFlow 2.0 Preview
查看>>
6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现
查看>>
走进JavaWeb技术世界1:JavaWeb的由来和基础知识
查看>>
走进JavaWeb技术世界2:JSP与Servlet的曾经与现在
查看>>
走进JavaWeb技术世界3:JDBC的进化与连接池技术
查看>>
走进JavaWeb技术世界4:Servlet 工作原理详解
查看>>
走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程
查看>>
走进JavaWeb技术世界6:Tomcat5总体架构剖析
查看>>
走进JavaWeb技术世界7:Tomcat和其他WEB容器的区别
查看>>
走进JavaWeb技术世界9:Java日志系统的诞生与发展
查看>>
走进JavaWeb技术世界10:从JavaBean讲到Spring
查看>>
走进JavaWeb技术世界11:单元测试框架Junit
查看>>
走进JavaWeb技术世界12:从手动编译打包到项目构建工具Maven
查看>>
走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
查看>>
走进JavaWeb技术世界14:Mybatis入门
查看>>
走进JavaWeb技术世界16:极简配置的SpringBoot
查看>>
初探Java设计模式1:创建型模式(工厂,单例等)
查看>>
初探Java设计模式2:结构型模式(代理模式,适配器模式等)
查看>>