mybatis自定义类型转换器 TypeHandler

 

1.0

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

 

2.0默认的TypeHandlers

下表描述了一些默认的类型处理器。

TypeHandler类         java类型                   数据库类型    

BooleanTypeHandler	java.lang.Boolean, boolean	数据库兼容的 BOOLEAN
ByteTypeHandler	java.lang.Byte, byte	数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler	java.lang.Short, short	数据库兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandler	java.lang.Integer, int	数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler	java.lang.Long, long	数据库兼容的 NUMERIC 或 BIGINT
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 类型,存储枚举的序数值(而不是名称)。
SqlxmlTypeHandler	java.lang.String	SQLXML
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 或 LONGVARCHAR
JapaneseDateTypeHandler	java.time.chrono.JapaneseDate	DATE

 

3.0自定义TypeHandler

你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。比如:

import org.apache.ibatis.type.*;

import java.sql.*;

/**
 * 必须继承BaseTypeHandler 或者实现 TypeHandler接口
 * 加了下面连个注解之后就不用在xml里面写jdbctyoe 和 javatype了
 */
@MappedJdbcTypes({JdbcType.TINYINT})
@MappedTypes({java.lang.String.class})
public class MyTypeHandler extends BaseTypeHandler {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object param, JdbcType jdbcType) throws SQLException {
        System.out.println("**********************入参转换************************************");
        Boolean parameter = (Boolean) param;
        preparedStatement.setInt(i, parameter ? 1 : 0);

    }

    @Override
    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
        System.out.println("********************结果转换******************************");
        //把数字转为boolean
        return resultSet.getInt(s) == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return null;
    }

    @Override
    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return null;
    }


}

4.0使用方式

 4.1全局定义

mybatis-config中

<typeHandlers>
    <typeHandler handler="com.hhz.util.MyTypeHandler"/>
</typeHandlers>

4.2局部xml中

<resultMap id="BaseResultMap" type="com.hhz.entity.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex" typeHandler="com.hhz.util.MyTypeHandler"/>
    </resultMap>

 <select id="list" resultMap="BaseResultMap">
        select *  from user
    </select>

5.0测试

 @Test
    public void listTest(){
        UserMapper dao = sqlSession.getMapper(UserMapper.class);
        List<User> list = dao.list();
        System.out.println(list);
    }


打印日志:
[DEBUG] ==>  Preparing: select * from user 
[DEBUG] ==> Parameters: 
********************结果转换******************************
********************结果转换******************************
********************结果转换******************************
********************结果转换******************************
[DEBUG] <==      Total: 4
[User{id=1, username='花花', age=20, sex='false'}, User{id=2, username='点点', age=30, sex='true'}, User{id=3, username='yuanyuan', age=25, sex='true'}, User{id=5, username='品牌', age=35, sex='false'}]

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值