Mybatis的类型转换接口TypeHandler

 更新时间:2022年08月09日 14:46:18   作者:周杰伦本人  
这篇文章主要介绍了Mybatis的类型转换接口TypeHandler,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

前言:

mybatis可以实现jdbc类型和java类型之间的转换,具体来说有一个类型转换器的接口

类型处理器接口TypeHandler

public interface TypeHandler<T> {

  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

  /**
   * @param columnName Colunm name, when configuration <code>useColumnLabel</code> is <code>false</code>
   */
  T getResult(ResultSet rs, String columnName) throws SQLException;

  T getResult(ResultSet rs, int columnIndex) throws SQLException;

  T getResult(CallableStatement cs, int columnIndex) throws SQLException;

}

类型处理器BaseTypeHandler

jdbc类型转为java类型

BaseTypeHandler实现了TypeHandler接口,实现了setParameter()方法:

@Override
  public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
    if (parameter == null) {
      if (jdbcType == null) {
        throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
      }
      try {
        ps.setNull(i, jdbcType.TYPE_CODE);
      } catch (SQLException e) {
        throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . "
              + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. "
              + "Cause: " + e, e);
      }
    } else {
      try {
        setNonNullParameter(ps, i, parameter, jdbcType);
      } catch (Exception e) {
        throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . "
              + "Try setting a different JdbcType for this parameter or a different configuration property. "
              + "Cause: " + e, e);
      }
    }
  }

这个方法中就是设置PreparedStatement的参数,也是参数绑定,将jdbcType转为Java类型,setNonNullParameter是抽象方法,根据不同的参数类型有不同的类实现了这个方法,比如

LongTypeHandler实现的setNonNullParameter()方法:

@Override
  public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType)
      throws SQLException {
    ps.setLong(i, parameter);
  }

java类型转为jdbc类型

BaseTypeHandler的getResult()方法:

@Override
  public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
    try {
      return getNullableResult(cs, columnIndex);
    } catch (Exception e) {
      throw new ResultMapException("Error attempting to get column #" + columnIndex + " from callable statement.  Cause: " + e, e);
    }
  }

方法也比较简单,直接调用了getNullableResult抽象类,功能就是从ResultSet中获取数据,把Java类型转换为JdbcType类型,比如LongTypeHandler实现的getNullableResult():

@Override
  public Long getNullableResult(ResultSet rs, String columnName)
      throws SQLException {
    long result = rs.getLong(columnName);
    return result == 0 && rs.wasNull() ? null : result;
  }

通过源码分析我们知道了TypeHandler接口的作用就是用来实现类型转换的,mybatis在初始化的时候就获取TypeHandler,然后创建TypeHandler实例注册到TypeHandlerRegistry中,由TypeHandlerRegistry来进行管理这些实例,下篇文章中我们介绍一下TypeHandlerRegistry这个类

总结

文章讲了Mybatis的类型转换接口TypeHandler和它的实现类BaseTypeHandler,类型转换接口显然就是实现jdbc类型和java类型之间的转换,同时分析了BaseTypeHandler的setParameter()方法和getResult()方法,getNullableResult是抽象类,具体方法由其他实现类进行实现。

到此这篇关于Mybatis的类型转换接口TypeHandler的文章就介绍到这了,更多相关Mybatis类型转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何理解和运用ClassLoader

    如何理解和运用ClassLoader

    这篇文章主要介绍了如何理解和运用 ClassLoader,帮助大家更好的理解和使用JVM,感兴趣的朋友可以了解下
    2021-01-01
  • IDEA启动tomcat状态404的解决

    IDEA启动tomcat状态404的解决

    在使用Idea进行Java Web开发过程中,经常会遇到Tomcat出现404错误的问题,本文就来介绍了IDEA启动tomcat状态404的解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • java中Spring Security的实例详解

    java中Spring Security的实例详解

    这篇文章主要介绍了java中Spring Security的实例详解的相关资料,spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案,需要的朋友可以参考下
    2017-09-09
  • Springboot下载excel文件中文名乱码问题及解决

    Springboot下载excel文件中文名乱码问题及解决

    这篇文章主要介绍了Springboot下载excel文件中文名乱码问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • springboot @Controller和@RestController的区别及应用详解

    springboot @Controller和@RestController的区别及应用详解

    这篇文章主要介绍了springboot @Controller和@RestController的区别及应用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java设计模式之桥接模式(Bridge)

    java设计模式之桥接模式(Bridge)

    这篇文章主要为大家详细介绍了java设计模式之桥接模式Bridge,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • idea 无法debug调试的解决方案

    idea 无法debug调试的解决方案

    这篇文章主要介绍了idea 无法debug调试的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java利用跳跃表解决双重队列问题详解

    Java利用跳跃表解决双重队列问题详解

    这篇文章主要为大家详细介绍了Java如何利用跳跃表来解决双重队列的问题。本文通过一个简单的例题进行了讲解,感兴趣的小伙伴可以了解一下
    2022-12-12
  • java8中Map的一些骚操作总结

    java8中Map的一些骚操作总结

    这篇文章主要给大家介绍了关于java8中Map的一些骚操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 在springboot中使用p6spy方式

    在springboot中使用p6spy方式

    这篇文章主要介绍了在springboot中使用p6spy方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论