当前位置:   article > 正文

mybatis源码解析之基础模块-TypeHandler_@mappedtypes({object.class}) @mappedjdbctypes(jdbc

@mappedtypes({object.class}) @mappedjdbctypes(jdbctype.varchar) 为null

在这里插入图片描述

MyBatis源码解析之基础模块—TypeHandler

前文回顾

上一章节我们一起分析了Mybatis的Plugin模块的源码。掌握了如何配置拦截器注解,如何自定义拦截器以及拦截器的执行过程。

在使用Mybatis的过程中,基本上我们都要在xml中编写相应的sql语句以及对应的java属性与字段的转换。那么对于数据库与java之间的转换,Mybatis是怎么做的呢?

接下来本章节我们对MyBatis Type模块类型转换的源码进行分析。

架构设计

按惯例,咱们先了解下Type模块的总体架构设计。

Type模块所在包路径为org.apache.ibatis.type,其对应的类架构设计图如下:

在这里插入图片描述

​ 以上为Type模块的架构逻辑,当然针对不同的类型转换实现,架构图中只展示了IntegerTypeHandler、UnknownTypeHandler两个典型实现。

​ 基于架构图,接下来逐个分析其实现源码。

源码解读

JdbcType

JdbcType就是一个枚举类。该类定义了常用的一些数据类型,比如Integer,Double,Date,Date等,基本上满足了我们开发中常用的数据类型。

package org.apache.ibatis.type;

import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

public enum JdbcType {
   
  INTEGER(Types.INTEGER),
  BIGINT(Types.BIGINT),
  FLOAT(Types.FLOAT),
  REAL(Types.REAL),
  DOUBLE(Types.DOUBLE),
  NUMERIC(Types.NUMERIC),
  DECIMAL(Types.DECIMAL),
  CHAR(Types.CHAR),
  VARCHAR(Types.VARCHAR),
  DATE(Types.DATE),
  BOOLEAN(Types.BOOLEAN)
    ……
    ; // JDBC 4.2 JDK8

  public final int TYPE_CODE;
  private static Map<Integer,JdbcType> codeLookup = new HashMap<>();

  static {
   
    for (JdbcType type : JdbcType.values()) {
   
      codeLookup.put(type.TYPE_CODE, type);
    }
  }

  JdbcType(int code) {
   
    this.TYPE_CODE = code;
  }

  public static JdbcType forCode(int code)  {
   
    return codeLookup.get(code);
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
MappedTypes

该注解接口作用于类型转换的实现类,用于标注要映射的java类型。

public @interface MappedTypes {
   
  /**
   * 返回要映射处理的java类型集合
   */
  Class<?>[] value();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
MappedJdbcTypes

该注解接口作用于类型转换的实现类,用于标注要映射的数据库类型。

public @interface MappedJdbcTypes {
   
  /**
   * 返回要映射处理的jdbc类型集合
   */
  JdbcType[] value();

  /**
   * 返回是否映射空值 默认false
   */
  boolean includeNullJdbcType() default false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

关于MappedTypes、MappedJdbcTypes的使用,可参考源码测试中的StringTrimmingTypeHandler类:

@MappedTypes(String.class)
@MappedJdbcTypes(value={
   JdbcType.CHAR,JdbcType.VARCHAR}, includeNullJdbcType=true)
public class StringTrimmingTypeHandler implements TypeHandler<String> {
   
  //方法实现ain略
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
TypeReference

TypeReference的核心功能是获取类型转换实现类的父类泛型参数类型,听起来貌似有点绕

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/683354
推荐阅读
相关标签