mybatis 自定义枚举转换类

最近在搭建maven多模块项目: http://git.oschina.net/alexgaoyh/MutiModule-parent

项目整体代码部分在上文链接的git中,下面的代码段落只是部分个人觉得比较重要的段落

在选择持久化DAO部分的时候,选择了mybatis,实体中变量的定义,想来来使用Enum代替常量的某些好处。所以才有下文的这些功能:

package com.alexgaoyh.MutiModule.domain;

import java.io.Serializable;

import com.alexgaoyh.MutiModule.domain.enumState.DeleteFlagState;

public class BaseEntity implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = 997102449095543774L;

	/**
	 * 编号,主键标示
	 */
	private Integer id;

	/**
	 * 是否删除状态
	 */
	private DeleteFlagState deleteFlagState = DeleteFlagState.NO;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public DeleteFlagState getDeleteFlagState() {
		return deleteFlagState;
	}

	public void setDeleteFlagState(DeleteFlagState deleteFlagState) {
		this.deleteFlagState = deleteFlagState;
	}
}
package com.alexgaoyh.MutiModule.persist.handler;

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 com.alexgaoyh.MutiModule.domain.enumState.DeleteFlagState;

/**
 * 自定义DeleteFlagState转换类 <br>
 * 存储属性:DeleteFlagState.getCode() <br>
 */
public class DeleteFlagStateHandler extends BaseTypeHandler<DeleteFlagState> {

    private Class<DeleteFlagState> type;

    private final DeleteFlagState[] enums;

    /**
     * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
     * @param type 配置文件中设置的转换类
     */
    public DeleteFlagStateHandler(Class<DeleteFlagState> type) {
        if (type == null)
            throw new IllegalArgumentException("Type argument cannot be null");
        this.type = type;
        this.enums = type.getEnumConstants();
        if (this.enums == null)
            throw new IllegalArgumentException(type.getSimpleName()
                    + " does not represent an enum type.");
    }

    @Override
    public DeleteFlagState getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = rs.getInt(columnName);

        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位DeleteFlagState子类
            return locateDeleteFlagState(i);
        }
    }

    @Override
    public DeleteFlagState getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = rs.getInt(columnIndex);
        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位DeleteFlagState子类
            return locateDeleteFlagState(i);
        }
    }

    @Override
    public DeleteFlagState getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = cs.getInt(columnIndex);
        if (cs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位DeleteFlagState子类
            return locateDeleteFlagState(i);
        }
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, DeleteFlagState parameter, JdbcType jdbcType)
            throws SQLException {
        // baseTypeHandler已经帮我们做了parameter的null判断
        ps.setInt(i, parameter.getCode());

    }

    /**
     * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
     * @param code 数据库中存储的自定义code属性
     * @return code对应的枚举类
     */
    private DeleteFlagState locateDeleteFlagState(int code) {
        for(DeleteFlagState status : enums) {
            if(status.getCode().equals(Integer.valueOf(code))) {
                return status;
            }
        }
        throw new IllegalArgumentException("未知的枚举类型:" + code + ",请核对" + type.getSimpleName());
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace 必须是DemoMapper接口的路径 -->
<mapper namespace="com.alexgaoyh.MutiModule.persist.demo.DemoMapper">

	<resultMap type="Demo" id="DemoResultMap">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<result column="deleteFlagState" property="deleteFlagState" typeHandler="com.alexgaoyh.MutiModule.persist.handler.DeleteFlagStateHandler"/>
	</resultMap>

	<insert id="insertDemo" parameterType="Demo">
		insert into Demo(deleteFlagState, name)
		values(
		#{deleteFlagState, typeHandler=com.alexgaoyh.MutiModule.persist.handler.DeleteFlagStateHandler},
		#{name})
	</insert>

	<select id="selectDemoById" resultMap="DemoResultMap" parameterType="java.lang.Integer">
		select * from Demo where id=#{id}
	</select>

</mapper>
时间: 2024-09-30 20:37:59

mybatis 自定义枚举转换类的相关文章

mybatis自定义枚举转换类

mybatis提供了 EnumTypeHandler和EnumOrdinalTypeHandler完成枚举类型的转换,两者的功能已经基本满足了日常的使用.但是可能有这 样的需求:由于某种原因,我们不想使用枚举的name和ordinal作为数据存储字段.mybatis的自定义转换类出现了. 示例 使用一段代码,将枚举类EnumStatus中的code属性存储到数据库对应字段statusCustom. 自定义转换类 package com.sg.util.typehandler; import ja

springboot mybatis自定义枚举enum转换

原文链接:https://blog.csdn.net/u014527058/article/details/62883573 一.概述 在利用Spring进行Web后台开发时,经常会遇到枚举类型的绑定问题.一般情况下,如果Spring接收到的参数值为字符串类型,Spring会根据枚举的值与传入的字符串进行对应.假设有如下枚举 清单1:枚举定义 public enum Gender { MALE, FEMALE; } 那么,只要客户端在发送请求时,将参数的值设为MALE或FEMALE即可.请求类似

Mybatis自定义分布式二级缓存实现与遇到的一些问题解决方案!

先说两句: 我们都知道Mybatis缓存分两类: 一级缓存(同一个Session会话内) & 二级缓存(基于HashMap实现的以 namespace为范围的缓存) 今天呢, 我们不谈一级缓存, 我们来谈一谈 二级缓存, 通过查看Mybatis源码发现, 他的二级缓存实现真的十分简单, 默认的实现类是 org.apache.ibatis.cache.impl.PerpetualCache 这里贴一下他的源码吧: /** * Copyright 2009-2015 the original aut

mybatis类型转换器 - 自定义全局转换enum

在数据模型.接口参数等场景部分属性参数为一些常量值,比如性别:男.女.若是定义成int或String类型,于是类型本身的范围太宽,要求使用者需要了解底层的业务方可知如何传值,那整体来看增加沟通成本,对接效率也低.面对此等业务,使用枚举简便许多.枚举enum像个固定常量类,也像一个数组. public enum Sex { Male(1,"男"), FeMale(2,"女"), ; private int index; private String descripti

java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类

枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例.这才能是枚举类. 自定义枚举类. 第一版:无参构造 1 public class Direction { 2 // 创建几个实例 3 public static final Direction FRONT = new Direction(); 4 public

MyBatis使用自定义TypeHandler转换类型的实现方法

From: http://www.manongjc.com/article/15577.html 这篇文章主要介绍了MyBatis使用自定义TypeHandler转换类型的实现方法,本文介绍使用TypeHandler 实现日期类型的转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异. 笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题.还好MyBa

validation统一表单验证(含自定义枚举验证)

一般我们对前端传输的参数做判断时,可能都是以以下方式进行判断,如果再加上字段的长度.正则等校验的话就会显得代码很累赘了. // 新增/修改通用参数非空校验 if (StringUtil.isBlank(menu.getParentId())) { throw new LsException(ResultEnum.PARAM_MISSING_ERROR, "父级菜单ID不能为空!"); } if (StringUtil.isBlank(menu.getMenuName())) { thr

利用 Project Lombok 自定义 AST 转换

转自 http://www.ibm.com/developerworks/cn/java/j-lombok/ 利用 Project Lombok 自定义 AST 转换 何时以及如何为自定义代码生成扩展 Lombok Alex Ruiz 在本文中介绍了 Project Lombok,探讨了它的一些独特的编程特色,包括注释驱动代码生成,以及简洁.紧凑.可读的代码.然后,他会提示大家关注 Lombok 更有价值的用途:利用自定义 AST(Abstract Syntax Tree,抽象语法树)转换来对其

(转)C# Enum,Int,String的互相转换 枚举转换

(转)C# Enum,Int,String的互相转换 枚举转换 Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基类型是除 Char 外的任何整型,所以枚举类型的值是整型值. Enum 提供一些实用的静态方法: (1)比较枚举类的实例的方法 (2)将实例的值转换为其字符串表示形式的方法 (3)将数字的字符串表示形式转换为此类的实例的方法 (4)创建