-
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
-
可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:
1. 实现 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); //在被转换的位置上设置数值
}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); //通过名称获取被转化类型的值
if(i==0){
return "女";
}else
return "男";
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int i = rs.getInt(columnIndex); //通过位置获取被转化类型的值
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. 也可以在局部配置类型转换器
当全局配置时不起作用,可以在直接配置到对于的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>
- 在配置时可以设置javaType、jdbcType属性
注:
-
使用上述的类型处理器将会覆盖已经存在的处理 Java 的 String 类型属性和 INTEGER参数及结果的类型处理器。
-
要注意 MyBatis 不会通过窥探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是 INTEGER类型的字段, 以使其能够绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行时才清楚数据类型。
-
通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型,不过这种行为可以通过两种方法改变:
- 在类型处理器的配置元素(typeHandler 元素)上增加一个 javaType 属性(比如:javaType="String");
- 在类型处理器的类上(TypeHandler class)增加一个 @MappedTypes 注解来指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定,则注解方式将被忽略。
-
可以通过两种方式来指定被关联的 JDBC 类型:
- 在类型处理器的配置元素上增加一个 jdbcType 属性(比如:jdbcType="INTEGER");
-
在类型处理器的类上增加一个 @MappedJdbcTypes 注解来指定与其关联的 JDBC 类型列表。 如果在 jdbcType 属性中也同时指定,则注解方式将被忽略。
默认TypeHandlers
网友评论