MyBatis自定义TypeHandler

系统TypeHandler

  • MyBatis为Java类型和相应的JDBC类型提供了系统默认的typeHandler,并且已经注册好:
public TypeHandlerRegistry() {
    register(Boolean.class, new BooleanTypeHandler());
    register(boolean.class, new BooleanTypeHandler());
    register(JdbcType.BOOLEAN, new BooleanTypeHandler());
    ......
    register(Character.class, new CharacterTypeHandler());
    register(char.class, new CharacterTypeHandler());
}

自定义TypeHandler

  • 当系统注册的typeHandler不满足我们的需求时(如使用枚举的时候),可以通过实现org.apache.ibatis.type.TypeHandler接口来进行扩展,以达到我们自己控制类属性与数据库字段映射的目的,具体实现如下:
public class SexEnumTypeHandler implements TypeHandler<Sex> {
    @Override
    public void setParameter(PreparedStatement ps, int idx, Sex sex, JdbcType jdbcType) throws SQLException {
        ps.setInt(idx, sex.getCode());
    }
    @Override
    public Sex getResult(ResultSet rs, String columnName) throws SQLException {
        int code = rs.getInt(columnName);
        return Sex.getSex(code);
    }
    @Override
    public Sex getResult(ResultSet rs, int columnIndex) throws SQLException {
        int code = rs.getInt(columnIndex);
        return Sex.getSex(code);
    }
    @Override
    public Sex getResult(CallableStatement cs, int columnIndex) throws SQLException {
        int code = cs.getInt(columnIndex);
        return Sex.getSex(code);
    }
}

其中Sex是一个自定义的枚举:

public enum Sex {
    UNKNOWN(-1, "未知"),
    MALE(0, "男"),
    FEMALE(1, "女"),
    ;
    private int code;
    private String name;
    private Sex(int code, String name) {
        this.code = code;
        this.name = name;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
  • 定义好之后,在相应的mapper文件中指定即可:
<result column="sex" property="sex" typeHandler="xxx.xxx.SexEnumTypeHandler" jdbcType="INTEGER" />
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • 步骤1:实现TypeHandler接口 步骤2:在Mybatis配置中注册该TypeHandler 步骤3:在映射...
    wall2wall阅读 7,426评论 0 1
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,650评论 1 114
  • 3.4 典型应用:排序## 模板方法模式的一个非常典型的应用,就是实现排序的功能。至于有些朋友认为排序是策略模式的...
    七寸知架构阅读 1,311评论 2 54
  • 看见这两字,我的視线就很难挪开。也许是对现在生活的不满,也许是年少的遗憾,总觉得一眼到头的日子不是现在的我想要的,...
    静如止水_565a阅读 203评论 0 0