巴拉巴拉
小魔仙

MyBatis——typeHandler,自定义类型转换器

是否经历过这种事情:

  • 数据库中的字段是一个一位数的INTEGER数值型,0表示false,1表示true。
  • Java程序当中,我们设置的字段为 boolean,并非int,但是我们也不想改变get和set方法结构来破坏我们Java程序的一致性。

这时候TypeHandler就出现了。

1.我这里写一个简单的TypeHandler,BooleanTypeHandler,用来转换true\false变为1\0

package cn.ictt.plugin;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;


public class BooleanTypeHandler extends BaseTypeHandler<Boolean> {

    @Override
    public Boolean getNullableResult(ResultSet rs, String arg1) throws SQLException {
        return 1 == rs.getInt(arg1);
    }

    @Override
    public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return 1 == rs.getInt(columnIndex);
    }

    @Override
    public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return 1 == cs.getInt(columnIndex);
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter ? 1 : 0);
    }

}

2.将这个BooleanTypeHandler注册到MyBatis的配置文件当中

<typeHandlers>
    <typeHandler handler="com.againfly.plugin.BooleanTypeHandler" javaType="boolean" />
</typeHandlers>

-- 在这里顺便插一句话,在mybatis-config.xml配置文件当中,我们可以配置例如settings,typeAliases,typeHandlers,plugins等等

但是这些配置是有先后顺序的,比如typeHandlers必须放在typeAliases后面,不然就会报错。

这里列出MyBatis先后配置顺序:

  • properties
  • settings
  • typeAliases
  • typeHandlers
  • objectFactory
  • objectWrapperFactory
  • plugins
  • environments?
  • databaseIdProvider
  • mappers

3.配合resultMap进行typeHandler的使用:

<resultMap type="com.againfly.entity.XXXX" id="xMap">
    <result property="read" column="qx_read" javaType="Boolean" jdbcType="INTEGER" typeHandler="com.againfly.plugin.BooleanTypeHandler"/>
</resultMap>

 

===================分割===================

补充,我们上面写的消息转换器,他继承了BaseTypeHandler<T>,实际上,他实现了TypeHandler<T>接口

我们写的消息转换器也可以直接实现TypeHandler接口即可。TypeHandler同样有四个方法,正好与BaseTypeHandler相对应,只是BaseTypeHandler帮我们处理了空值的情况,如果我们直接继承使用BaseTypeHandler就可以避免这个情况了。如果有针对空值操作的朋友可以直接实现TypeHandler<T>接口即可,而不需要继承BaseTypeHandler<T>

 

===================分割===================

mybatis的驼峰转换

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:mybatis/*/*.xml" />
    <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
</bean>
<configuration>
    <settings> 
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>

 

赞(0) 打赏
如果文章对你有帮助,欢迎你来评价反馈。AgainFly » MyBatis——typeHandler,自定义类型转换器
标签:

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • Q Q(选填)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏