MyBatis(四):参数处理器

//此时parameterMappings就会为size = 0

if (parameterMappings != null) {

for (int i = 0; i < parameterMappings.size(); i++) {

//获取每一个参数映射

ParameterMapping parameterMapping = parameterMappings.get(i);

//如果参数映射的类型不为OUT

//参数映射的类型有IN OUT INOUT三种

//如果为OUT是不做处理的

if (parameterMapping.getMode() != ParameterMode.OUT) {

//这个value是用来存储额外的参数的,其实就是sql参数对应传进去的值!

Object value;

//获取映射的名称,如果没有加param注解且多个参数,就是arg0,arg1。。那些

String propertyName = parameterMapping.getProperty();

//判断当前这个映射的参数有没有额外参数

if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params

value = boundSql.getAdditionalParameter(propertyName);

}

//判断parameterObject是否为空

//parameterObject是用来存储映射关系的,也就是sql参数与传进来的参数映射

//比如arg0~123

//也就是如果没有传进来的参数,那么额外参数value也为null

else if (parameterObject == null) {

value = null;

}

//TypeHandler为类型处理器,也就是用来转化JavaBean和SQL列数组映射的

//这里是针对只有一个参数的时候

//只有一个参数的时候,parameterObject不是一个Map,而是一个引用类型

//这时候就会注册相对应的处理器了(没有Map的处理器)

else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {

value = parameterObject;

}

//一般来说都是else这里进行处理

else {

//获取parameter的元数据

MetaObject metaObject = configuration.newMetaObject(parameterObject);

//从元数据中去获取该sql参数对应的值!

value = metaObject.getValue(propertyName);

}

//获取这个映射参数的类型处理器

//在parameterMapping中有已经固定了类型处理器

TypeHandler typeHandler = parameterMapping.getTypeHandler();

//同时去获取jdbc的类型

JdbcType jdbcType = parameterMapping.getJdbcType();

//如果没有设置jdbc连接类型且映射Sql参数的值为null

//不太懂。。。

if (value == null && jdbcType == null) {

jdbcType = configuration.getJdbcTypeForNull();

}

//交由typeHandler去进行转化参数

//也就是由Java类型去转化成sql类型

try {

typeHandler.setParameter(ps, i + 1, value, jdbcType);

} catch (TypeException | SQLException e) {

throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);

}

}

}

}

}

从代码上可以看到

参数处理器有主要几个对象

  • parameterMappings:为一个ArrayList,里面是多个parameterMapping,一个parameterMapping代表SQL语句中的参数,并标明MODE、javaType和typeHandler等属性,也就是相当于sqk参数的处理形式都在里面

在这里插入图片描述

  • parameterObject:表明SQL参数与实际传进来的参数的映射关系!,可以看到里面有4个值,param1和param2是一定会有的,而arg0、arg1则是默认生成的,假如用了@Param注解,arg0和arg1将会变回@Param里面的值,假如只有一个参数,那么就不会进行处理,一般都会与parameterMapping的property一一对应,除了一种特殊情况(只有一个参数)

下面来看看没加@Param注解前

没加注解前

在这里插入图片描述

加了注解后

在这里插入图片描述

假如参数只有一个,那么parameter就不是一个Map了,而只是一个引用类型!

在这里插入图片描述

这也是为什么在代码上会有一个判断有没有注册parameterObject的类型处理器,如果有,value直接为parameterObject(对于引用类型肯定是有注册类型处理器的,但对于Map是没有类型处理器的!)

前面提到过,只有一种参数,那么parameterMapping和parameter是不可能对应上的(因为没必要对应)

在这里插入图片描述

在这里插入图片描述

可以看到,property甚至都没用JDK反射生成的arg0,arg1那些,直接使用了SQl写的占位符value

typeHandler去匹配参数

DefaultParameterHandler用来存储一句SQL里面的所有参数与传进来的参数的映射关系,现在映射关系找到了,下面就需要进行类型处理了,因为MySQL的数据类型与Java的数据类型是不一样的,需要进行转换,在MyBatis中负责这一块的为TypeHandler类,而每一个parameterMapping都有自己的TypeHandler

具体的方法为setParameter方法

setParameter方法

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

在这里插入图片描述

最新整理电子书

在这里插入图片描述

整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

[外链图片转存中…(img-m8WPkE1j-1719283683110)]

最新整理电子书

[外链图片转存中…(img-olCTLODy-1719283683110)]

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值