MyBatis系列之TypeHandler的使用

MyBatis中TypeHandler的使用

题外话(阅读源码所得):
在使用MyBatis的过程中,如果同时使用xml映射与Annotation,启动会报错,报错原因:

MyBatis首先加载的xml映射文件,然后解析xml映射文件,根据方法名称为keyMappedStatement为值,构建为Map

操作枚举
定义枚举
package com.garlic.enums;

/**
 * 账户状态
 *
 * @author sam.liu
 * @create 2017-11-28 10:59
 * @contact 563750241
 * @email 563750241@qq.com
 */
public enum Locked {

    NORMAL("正常", 0), LOCKED("锁定", 1);

    private String name;
    private Integer tag;

    private Locked(String name, Integer tag) {
        this.name = name;
        this.tag = tag;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getTag() {
        return tag;
    }

    public void setTag(Integer tag) {
        this.tag = tag;
    }
}
Mapper.xml的使用

ResultMap中的配置

<result column="locked" jdbcType="TINYINT" property="locked"
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
            javaType="com.garlic.enums.Locked" />

Spring Boot中,除了以上处理之外,不需要做任何配置,而在普通的Spring工程中,则需要增加以下配置:

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
    javaType="java.math.RoundingMode"/>
</typeHandlers>
自定义TypeHandler
package com.garlic.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.*;

/**
 * 日期格式化Handler
 *
 * @author sam.liu
 * @create 2017-11-28 13:35
 * @contact 563750241
 * @email 563750241@qq.com
 */
@MappedJdbcTypes(JdbcType.BIGINT)
public class DateFormatterHandler extends BaseTypeHandler<Long> {

    private static final Logger logger = LoggerFactory.getLogger(DateFormatterHandler.class);

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException {
        //TODO: 此处可以将parameter的值进行处理之后再写入数据库,比如格式化为日期字符串
        logger.info("columnIndex: {} parameter: {}", i, parameter);
        ps.setLong(i, parameter);
    }

    @Override
    public Long getNullableResult(ResultSet rs, String columnName) throws SQLException {
        //TODO: 此次可以将rs.getLong(columnName)值转换为时间戳再进行输出
        logger.info("columnName: {}", columnName);
        return rs.getLong(columnName);
    }

    @Override
    public Long getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        //TODO: 此次可以将rs.getLong(columnName)值转换为时间戳再进行输出
        logger.info("columnIndex: {}", columnIndex);
        return rs.getLong(columnIndex);
    }

    @Override
    public Long getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        //TODO: 此次可以将rs.getLong(columnName)值转换为时间戳再进行输出
        logger.info("columnIndex: {}", columnIndex);
        return cs.getLong(columnIndex);
    }
}

自定义成功TypeHandler之后,只需要按照普通的TypeHandler的使用方式使用即可。

MyBatis 字典转换 TypeHandler 是一种用于处理数据库字段和 Java 实体属性之间的转换的机制。它允许开发人员在数据库存储枚举值或其他常量,并在 MyBatis 查询时将其转换为相应的 Java 对象。 通常,在数据库设计,我们会将某些字段的取值限制为预定义的有限选项,通常以整数或字符串形式存储在数据库。然而,在 Java 代码,我们更倾向于使用枚举类型或其他自定义对象来表示这些选项。 为了解决数据库字段和 Java 对象之间的转换问题,MyBatis 提供了 TypeHandler 接口。该接口定义了将字段值转换为 Java 对象和将 Java 对象转换为字段值的方法。开发人员可以根据自己的需求实现该接口并注册自己的 TypeHandler。 当 MyBatis 执行查询时,如果遇到了定义了 TypeHandler 的字段,它将使用相应的 TypeHandler 对象来处理字段的转换。类型转换可以是双向的,也就是说可以将 Java 对象转换为数据库字段,以及将数据库字段转换为 Java 对象。 字典转换的一个典型应用场景是将数据库的整数值转换为对应的枚举类型。通过实现自定义的 TypeHandler,开发人员可以将数据库表的整数字段映射为相应的枚举对象,从而在程序更方便地使用枚举值。这种转换可以在查询结果映射时自动进行,也可以在参数设置时手动进行。 总之,MyBatis 字典转换 TypeHandler 是一项非常实用的功能,它允许我们在数据库和 Java 对象之间进行灵活的转换,使程序开发更加方便和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值