手敲Mybatis九-优化参数处理器
-
前言
在之前的章节里边,类PreparedStatementHandler我们还没有处理在执行Sql时的参数,目前是硬编码写死存储的,如:ps.setLong(),这里就只能处理long类型的数据因为写死了,我们需要处理下让它支持设置不同的数据类型。
根据要求我们知道本次最重要的就是参数处理器,考虑下需要怎么解析XML中的参数并放到对应容器里,使用时调用参数处理器进行设置对应参数呢?这就是今天的主题。
2. UML类图
本章涉及的内容并不多,新加了7个类,下面图片标灰色以及蓝色和橘黄色都是新增的类,其余的都是根据需求串流程的修改。

2.1 解析生成类型处理器分析
上节我们把XML解析进行解构处理,那么真正解析处理Sql语句以及参数的处理则在SqlSourceBuilder来处理,我们这节以这个为入口在参数处理时考虑加个参数的类型处理器,用来执行SQL语句时最终设置参数处理,这里我们类型处理器只实现了两个类,LongTypeHandler和StringTypeHanler,实际上还会有很多的TypeHandler,本节实现这两个先了解下。
ParameterMappingTokenHandler:SqlSourceBuilder的内部类,主要处理参数映射的,我们在生成ParameterMapping对象时进行修改从类型注册器里找出是否有当前参数类型的值,有则从类型注册器中取,无则通过反射工具类将对象参数解析进行参数类型获取处理。
ParameterMapping:全局变量里添加一个私有的类型处理器的映射,在调用build的方法时进行绑定赋值。
TypeHandler:类型处理器接口,本节添加的类,由于存在于设置参数时使用,只定义了设置参数的方法。
LongTypeHandler:类型处理器实现类,Long类型处理器,只处理Long类型参数值的设置。
StringTypeHandler:类型处理器实现类,String类型处理器,只处理String类型参数值的设置。
TypeHandlerRegistry:类型处理器注册器,定义了启动时直接注册两种(Long,String)类型处理器以及从注册器获取类型处理器方法,判断是否存在此类型处理器方法等。
2.2 使用参数处理器和类型处理器
我们想象一下在哪里需要使用我们处理好的参数映射呢,是不是在Sql执行时,我们把解析好的Sql语句和参数拿过来然后调用JDBC将Sql语句和参数传过去,那么就需要在执行器中的语句处理器下手修改
因为参数执行处理在Mybatis里需要进入预处理语句处理器,所以从这里开始
PreparedStatementHandler:预处理语句处理器实现,在parameterize方法中通过参数处理器进行参数设置,将参数设置到jdbc的PreparedStatement中。
BaseStatementHandler:基础语句处理器,全局变量定义参数处理器,并在构造方法中创建并赋值参数处理器,供PreparedStatementHandler使用。
Configuration:Configuration中修改下添加创建参数处理器的方法供BaseSattementHandler调用
LanguageDriver:语言驱动器,添加了定义了创建参数处理器方法,供Configuration调用
XMLLanguageDriver:语言驱动器实现类,实例化参数处理器DefaultParameterHandler并返回。
ParameterHandler:参数处理器接口,定义了获取参数以及设置参数方法。
DefaultParameterHandler:参数处理器接口实现类,获取参数映射根据参数类型取出对应的类型处理器,并调用对应类型的参数设置,设置完直接执行Sql语句就结束。
本节比较好理解,也比较简单,大家好好学习,好好理解
-
代码
// doto MapperMethod的参数处理
3.1 类型处理器(TypeHandler)
在Mybatis源码里有type的包,这个包下都是关于类型的处理
package df.middleware.mybatis.type
我们创建类型处理器接口,定义设置参数方法,需要用到的参数有预处理语句(preparedment)以及第一个参数i,参数值paramter,参数类型jdbcType即可。
/**
* @Author df
* @Date 2023/3/13 12:36
* @Version 1.0
* 类型处理器接口
*/
public interface TypeHandler<T> {
/**
* 设置参数
*/
void setParameter(PreparedStatement ps,int i,T paramter,JdbcType jdbcType) throws SQLException;
}
3.1.1 抽象类处理器(BaseTypeHandler)
此类使用了模板设计模式,实现了setParameter方法,定义了设置不为空参数setNonNullParameter的抽象方法。通过抽象出基类便于共有化处理,在此类中也可以判断和处理,目前我们暂未有那么多流程,但写出来分析Mybatis源码时也好知道有这样的结构,如果要扩展也非常方便
/**
* @Author df
* @Date 2023/3/13 12:39
* @Version 1.0
* 类型处理器基类,模板模式
*/
public abstract class BaseTypeHandler<T> implements TypeHandler<T> {
@Override
public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
setNonNullParameter(ps, i, parameter, jdbcType);
}
protected abstract void setNonNullParamet

1871

被折叠的 条评论
为什么被折叠?



