mybaties的核心配置文件属性之typehandlers

Posted 热爱生活的老余

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybaties的核心配置文件属性之typehandlers相关的知识,希望对你有一定的参考价值。

typehandles(类型处理器)

 

MyBatis 在设置预处理SQL语句(PreparedStatement)中所需要的 参数 或从 结果集 ResultSet 中获取对象时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

 

 

类型处理器,主要用于处理 Java 类型与 JDBC 类型的映射匹配关系处理,下表描述了一些默认的类型处理器。

  • 类型处理器 BooleanTypeHandler
    • Java 类型:java.lang.Boolean, boolean
    • JDBC 类型:数据库兼容的 BOOLEAN
  • 类型处理器 ByteTypeHandler
    • Java 类型:java.lang.Byte, byte
    • JDBC 类型:数据库兼容的 NUMERIC BYTE
  • 类型处理器 ShortTypeHandler
    • Java 类型:java.lang.Short, short
    • JDBC 类型:数据库兼容的 NUMERIC SMALLINT
  • 类型处理器 IntegerTypeHandler
    • Java 类型:java.lang.Integer, int
    • JDBC 类型:数据库兼容的 NUMERIC INTEGER
  • 类型处理器 LongTypeHandler
    • Java 类型:java.lang.Long, long
    • JDBC 类型:数据库兼容的 NUMERIC BIGINT
  • 类型处理器 FloatTypeHandler
    • Java 类型:java.lang.Float, float
    • JDBC 类型:数据库兼容的 NUMERIC FLOAT
  • 类型处理器 DoubleTypeHandler
    • Java 类型:java.lang.Double, double
    • JDBC 类型:数据库兼容的 NUMERIC DOUBLE
  • 类型处理器 BigDecimalTypeHandler
    • Java 类型:java.math.BigDecimal
    • JDBC 类型:数据库兼容的 NUMERIC DECIMAL
  • 类型处理器 StringTypeHandler
    • Java 类型:java.lang.String
    • JDBC 类型:CHAR, VARCHAR
  • 类型处理器 ClobReaderTypeHandler
    • Java 类型:java.io.Reader
    • JDBC 类型:-
  • 类型处理器 ClobTypeHandler
    • Java 类型:java.lang.String
    • JDBC 类型:CLOB, LONGVARCHAR
  • 类型处理器 NStringTypeHandler
    • Java 类型:java.lang.String
    • JDBC 类型:NVARCHAR, NCHAR
  • 类型处理器 NClobTypeHandler
    • Java 类型:java.lang.String
    • JDBC 类型:NCLOB
  • 类型处理器 BlobInputStreamTypeHandler
    • Java 类型:java.io.InputStream
    • JDBC 类型:-
  • 类型处理器 ByteArrayTypeHandler
    • Java 类型:byte[]
    • JDBC 类型:数据库兼容的字节流类型
  • 类型处理器 BlobTypeHandler
    • Java 类型:byte[]
    • JDBC 类型:BLOB, LONGVARBINARY
  • 类型处理器 DateTypeHandler
    • Java 类型:java.util.Date
    • JDBC 类型:TIMESTAMP
  • 类型处理器 DateOnlyTypeHandler
    • Java 类型:java.util.Date
    • JDBC 类型:DATE
  • 类型处理器 TimeOnlyTypeHandler
    • Java 类型:java.util.Date
    • JDBC 类型:TIME
  • 类型处理器 SqlTimestampTypeHandler
    • Java 类型:java.sql.Timestamp
    • JDBC 类型:TIMESTAMP
  • 类型处理器 SqlDateTypeHandler
    • Java 类型:java.sql.Date
    • JDBC 类型:DATE
  • 类型处理器 SqlTimeTypeHandler
    • Java 类型:java.sql.Time
    • JDBC 类型:TIME
  • 类型处理器 ObjectTypeHandler
    • Java 类型:Any
    • JDBC 类型:OTHER 或未指定类型
  • 类型处理器 EnumTypeHandler
    • Java 类型:Enumeration Type
    • JDBC 类型:VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值)
  • 类型处理器 EnumOrdinalTypeHandler
    • Java 类型:Enumeration Type
    • JDBC 类型:任何兼容的 NUMERIC DOUBLE 类型,用来存储枚举的序数值(而不是名称)。
  • 类型处理器 SqlxmlTypeHandler
    • Java 类型:java.lang.String
    • JDBC 类型:SQLXML
  • 类型处理器 InstantTypeHandler
    • Java 类型:java.time.Instant
    • JDBC 类型:TIMESTAMP
  • 类型处理器 LocalDateTimeTypeHandler
    • Java 类型:java.time.LocalDateTime
    • JDBC 类型:TIMESTAMP
  • 类型处理器 LocalDateTypeHandler
    • Java 类型:java.time.LocalDate
    • JDBC 类型:DATE
  • 类型处理器 LocalTimeTypeHandler
    • Java 类型:java.time.LocalTime
    • JDBC 类型:TIME
  • 类型处理器 OffsetDateTimeTypeHandler
    • Java 类型:java.time.OffsetDateTime
    • JDBC 类型:TIMESTAMP
  • 类型处理器 OffsetTimeTypeHandler
    • Java 类型:java.time.OffsetTime
    • JDBC 类型:TIME
  • 类型处理器 ZonedDateTimeTypeHandler
    • Java 类型:java.time.ZonedDateTime
    • JDBC 类型:TIMESTAMP
  • 类型处理器 YearTypeHandler
    • Java 类型:java.time.Year
    • JDBC 类型:INTEGER
  • 类型处理器 MonthTypeHandler
    • Java 类型:java.time.Month
    • JDBC 类型:INTEGER
  • 类型处理器 YearMonthTypeHandler
    • Java 类型:java.time.YearMonth
    • JDBC 类型:VARCHAR LONGVARCHAR
  • 类型处理器 JapaneseDateTypeHandler
    • Java 类型:java.time.chrono.JapaneseDate
    • JDBC 类型:DATE

 

 

自定义类型处理器:

首先需要继承baseTypehandler或实现typehandler接口。

具体实现如下,先自定义类型处理器类 MyExampleTypeHandler

// MyExampleTypeHandler.java

@MappedJdbcTypes(JdbcType.VARCHAR)

public class MyExampleTypeHandler extends BaseTypeHandler<String> {

 

  @Override

  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {

    ps.setString(i, parameter);

  }

 

  @Override

  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {

    return rs.getString(columnName);

  }

 

  @Override

  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

    return rs.getString(columnIndex);

  }

 

  @Override

  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

    return cs.getString(columnIndex);

  }

}

自定义类已设定:JdbcType.VARCHAR String 类做映射转换(注解和泛型已体现)。

其次,在核心配置文件中设置类型处理器:

<!-- mybatis-config.xml -->

<typeHandlers>

  <typeHandler handler="org.mybatis.example.MyExampleTypeHandler"/>

</typeHandlers>

 

或者不使用注解方式的话,取消 @MappedJdbcTypes(JdbcType.VARCHAR) 注解,直接在 xml 配置中指定 jdbcType javaType 映射

<!-- mybatis-config.xml -->

<typeHandlers>

  <typeHandler jdbcType="VARCHAR" javaType="string" handler="org.mybatis.example.MyExampleTypeHandler"/>

</typeHandlers>

 

这里,自定义类型处理器将会覆盖已有的处理 Java String 类型的属性以及 VARCHAR 类型的参数和结果的类型处理器,基本以上步骤就已经自定了 JdbcType.VARCHAR  String类做映射转换。

 

 

某个时候只希望自定义的类型处理器只用在某一个类中或某一个类的一个字段,其它都用默认的转换,这时候这样做。我们只需要把以上两步都去掉,在自定义类型处理类的注解@javaType@MappedJdbcTypes都移除,配置文件中把 typehandler 属性配置移除,直接在映射文件中编写:

 

<resultMap id="MyResultMap" type="com.panshenlian.pojo.User">

        <!-- idint类型,但是没指定自定义类型处理器,不受影响-->

        <id column="id" property="id" />

        <!-- usernameString类型,但是没指定自定义类型处理器,不受影响-->

        <id column="username" property="username" />

        <!-- passwordString类型,但是没指定自定义类型处理器,不受影响-->

        <id column="password" property="password" />

        

        

        <!-- birthdayString类型,指定自定义类型处理器,受影响!-->

        <id column="birthday" property="birthday"  typeHandler="com.panshenlian.typeHandler.MyStringHandler"/>

        

    </resultMap>

    <select id="findAll" resultType="com.panshenlian.pojo.User" resultMap="MyResultMap">

        select * from User

    </select>

以上是关于mybaties的核心配置文件属性之typehandlers的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis核心配置文件

Mybatis核心配置文件属性

MyBatis核心配置解析

Mybatis学习之核心配置详解

Mybatis学习之核心配置详解

mybaties核心配置文件的属性environments