無論是 MyBatis 在預(yù)處理語句(PreparedStatement)中設(shè)置一個參數(shù)時,還是從結(jié)果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類型。
可以重寫類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標(biāo)準(zhǔn)的類型。
具體做法為:
1. 實(shí)現(xiàn) org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然后可以選擇性地將它映射到一個 JDBC 類型。
@MappedJdbcTypes(JdbcType.INTEGER)
public class MyTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if(parameter.equals("男")){
ps.setInt(i,1); //在被轉(zhuǎn)換的位置上設(shè)置數(shù)值
}else if(parameter.equals("女")){
ps.setInt(i,0);
}
System.out.println(ps);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
int i = rs.getInt(columnName); //通過名稱獲取被轉(zhuǎn)化類型的值
if(i==0){
return "女";
}else
return "男";
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int i = rs.getInt(columnIndex); //通過位置獲取被轉(zhuǎn)化類型的值
if(i==0){
return "女";
}else
return "男";
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return null;
}
}
2. 在mybatis-config.xml中配置typeHandlers
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="com.tamty.utils.MyTypeHandler"/>
</typeHandlers>
3. 也可以在局部配置類型轉(zhuǎn)換器
當(dāng)全局配置時不起作用,可以在直接配置到對于的sql語句中,例如:
<resultMap id="rs" type="Person" >
<result column="sex" property="sex" typeHandler="com.tamty.utils.MyTypeHandler"/>
</resultMap>
<select id="selectPerson" resultMap="rs">
select * from Person where id = #{id}
</select>
<insert id="insertPerson">
insert into person (name ,age,sex)
values(#{name},#{age},#{sex,typeHandler=com.tamty.utils.MyTypeHandler});
</insert>
- 在配置時可以設(shè)置javaType、jdbcType屬性
注:
使用上述的類型處理器將會覆蓋已經(jīng)存在的處理 Java 的 String 類型屬性和 INTEGER參數(shù)及結(jié)果的類型處理器。
要注意 MyBatis 不會通過窺探數(shù)據(jù)庫元信息來決定使用哪種類型,所以你必須在參數(shù)和結(jié)果映射中指明那是 INTEGER類型的字段, 以使其能夠綁定到正確的類型處理器上。這是因?yàn)?MyBatis 直到語句被執(zhí)行時才清楚數(shù)據(jù)類型。
-
通過類型處理器的泛型,MyBatis 可以得知該類型處理器處理的 Java 類型,不過這種行為可以通過兩種方法改變:
- 在類型處理器的配置元素(typeHandler 元素)上增加一個 javaType 屬性(比如:javaType="String");
- 在類型處理器的類上(TypeHandler class)增加一個 @MappedTypes 注解來指定與其關(guān)聯(lián)的 Java 類型列表。 如果在 javaType 屬性中也同時指定,則注解方式將被忽略。
-
可以通過兩種方式來指定被關(guān)聯(lián)的 JDBC 類型:
- 在類型處理器的配置元素上增加一個 jdbcType 屬性(比如:jdbcType="INTEGER");
-
在類型處理器的類上增加一個 @MappedJdbcTypes 注解來指定與其關(guān)聯(lián)的 JDBC 類型列表。 如果在 jdbcType 屬性中也同時指定,則注解方式將被忽略。
默認(rèn)TypeHandlers