1. 程式人生 > >mybatis typeHandlers 型別處理器(xml配置四)

mybatis typeHandlers 型別處理器(xml配置四)

typeHandlers

為什麼會有型別轉換器typeHandlers

typeHandler起到一個橋樑作用,分別對應jdbcType和javaType

  • jdbcType用於定義資料庫型別
  • javaType用於定義Java型別
  • typeHandler的作用就是承擔jdbcType和javaType之間的相互轉換,

讀:jdbcType -> typeHandler -> javaType 寫:javaType -> typeHandler -> jdbcType

系統定義typeHandlers

org.apache.ibatis.type.TypeHandlerRegistry

型別處理器 Java 型別 JDBC 型別
BooleanTypeHandler java.lang.Boolean, boolean 資料庫相容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 資料庫相容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short 資料庫相容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 資料庫相容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long 資料庫相容的 NUMERIC 或 LONG INTEGER
FloatTypeHandler java.lang.Float, float 資料庫相容的 NUMERIC 或 FLOAT
DoubleTypeHandler java.lang.Double, double 資料庫相容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal 資料庫相容的 NUMERIC 或 DECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 資料庫相容的位元組流型別
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定型別
EnumTypeHandler Enumeration Type VARCHAR-任何相容的字串型別,儲存列舉的名稱(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何相容的 NUMERIC 或 DOUBLE 型別,儲存列舉的索引(而不是名稱)。
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE

普通註冊方式

<!-- 註冊處理器 -->
<typeHandlers>
	<typeHandler javaType="String" jdbcType="NVARCHAR" handler="priv.dengjl.ns.handler.MyStringHandler" />
</typeHandlers>

使用方式

  • 第一種:jdbcType="NVARCHAR" javaType="string"
  • 第二種: typeHandler="priv.dengjl.ns.handler.MyStringHandler" 例子1
   <resultMap id="BaseResultMap" type="priv.dengjl.ns.bean.TestOracle">
   	<result column="ID" jdbcType="DECIMAL" property="id" />
   	<result column="NAME" jdbcType="NVARCHAR" javaType="string" property="name" />
   	<result column="DESCRIPTION" typeHandler="priv.dengjl.ns.handler.MyStringHandler" jdbcType="OTHER" property="description" />
   	<result column="OTHER" jdbcType="TIMESTAMP" property="other" />
   </resultMap>

例子2

<select id="selectByPrimaryKey" parameterType="java.lang.String"
	resultMap="BaseResultMap">
	select
	<include refid="Base_Column_List" />
	from TEST_ORACLE
	where NAME = #{name, jdbcType=NVARCHAR, javaType=string}
</select>
<select id="selectByDescrption" parameterType="java.lang.String"
	resultMap="BaseResultMap">
	select
	<include refid="Base_Column_List" />
	from TEST_ORACLE
	where DESCRIPTION = #{description, typeHandler=priv.dengjl.ns.handler.MyStringHandler}
</select>

包方式

<typeHandlers>
  <package name="org.mybatis.example"/>
</typeHandlers>

包方式需要顯示在java類注型別

@MappedJdbcTypes(JdbcType.NVARCHAR) @MappedTypes(String.class)