手敲Mybatis(八)-参数处理器

手敲Mybatis九-优化参数处理器

​​​​​​​
  1. 前言

在之前的章节里边,类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语句就结束。

本节比较好理解,也比较简单,大家好好学习,好好理解

  1. 代码

// 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值