`
leixbo
  • 浏览: 33989 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MyBatis 之枚举映射

    博客分类:
  • Java
阅读更多

我定义一些实体时,有时我们在定义枚举是会用到枚举,Mybatis提供了EnumTypeHandler和EnumOrdinalTypeHandler完成枚举类型的转换,两者的功能已经基本满足了日常的使用。但是有可能我们不想使用枚举的name和ordinal作为数据存储字段,因此我们需要自己定义转换类。

 

以下是我在项目中用到的一个比较通用的枚举处理方式

 

1、枚举的抽象接口

因为比较通用,所以抽取出来了

public interface GenericEnum {

		int getCode();

		String getName();
	}

 

2、枚举类

public enum CommStatus implements GenericEnum {
		DELETED(-1, "Deleted"), ENABLE(1, "Enable"), UNABLE(0, "Unable");

		private int code;

		private String name;

		CommStatus(int code, String name) {
			this.code = code;
			this.name = name;
		}

		public int getCode() {
			return this.code;
		}

		public String getName() {
			return this.name;
		}

		public static CommStatus valueOfEnum(int code) {
			CommStatus[] iss = values();
			for (CommStatus cs : iss) {
				if (cs.getCode() == code) {
					return cs;
				}
			}
			return null;
		}
	}

 

 

3、枚举转换类

数据库保存code的转换类

/**
 * @author leibo
 * 
 *         2014-2-12 上午10:27:23
 */
public class GenericEnumCodeHandler extends BaseTypeHandler<GenericEnum> {

	private final GenericEnum[] enums;

	/**
	 * 
	 * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
	 * 
	 * @param type
	 *            配置文件中设置的转换类
	 */

	public GenericEnumCodeHandler(Class<GenericEnum> type) {
		if (type == null)
			throw new IllegalArgumentException("Type argument cannot be null");
		this.enums = type.getEnumConstants();
		if (this.enums == null)
			throw new IllegalArgumentException(type.getSimpleName()
					+ " does not represent an enum type.");
	}

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

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

	}

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

	}

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

	/**
	 * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
	 * 
	 * @param code
	 *            数据库中存储的自定义code属性
	 * @return code对应的枚举类
	 */
	private GenericEnum locateEnumStatus(int code) {
		for (GenericEnum status : enums) {
			if (status.getCode() == code) {
				return status;
			}
		}
		return null;
	}

}

 

数据库保存Name的转换类

/**
 * @author leibo
 * 
 *         2014-2-12 上午10:27:23
 */
public class GenericEnumNameHandler extends BaseTypeHandler<GenericEnum> {

	private final GenericEnum[] enums;

	/**
	 * 
	 * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
	 * 
	 * @param type
	 *            配置文件中设置的转换类
	 */

	public GenericEnumNameHandler(Class<GenericEnum> type) {
		if (type == null)
			throw new IllegalArgumentException("Type argument cannot be null");
		this.enums = type.getEnumConstants();
		if (this.enums == null)
			throw new IllegalArgumentException(type.getSimpleName()
					+ " does not represent an enum type.");
	}

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

	@Override
	public GenericEnum getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		String name = rs.getString(columnName);
		if (rs.wasNull()) {
			return null;
		} else {
			return locateEnumStatus(name);
		}

	}

	@Override
	public GenericEnum getNullableResult(ResultSet rs, int columnIndex)
			throws SQLException {
		String name = rs.getString(columnIndex);
		if (rs.wasNull()) {
			return null;
		} else {
			return locateEnumStatus(name);
		}

	}

	@Override
	public GenericEnum getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		String name = cs.getString(columnIndex);
		if (cs.wasNull()) {
			return null;
		} else {
			return locateEnumStatus(name);
		}
	}

	private GenericEnum locateEnumStatus(String name) {
		for (GenericEnum status : enums) {
			if (status.getName().equals(name)) {
				return status;
			}
		}
		return null;
	}

}

 

4、Mybatis配置文件

貌似也可以通过其他方式进行转换器的配置,但我感觉直接在用到的SQL中配置转换器更直观

<?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">
<mapper namespace="com.xxx.xxx.persistence.mapper.cc.FilterItemMapper">

	<resultMap type="FilterItem" id="FilterItemMap">
		<result property="id" column="id" />
		<result property="pv" column="pv"
			typeHandler="com.xxx.xxx.persistence.mapper.cc.handler.GenericEnumNameHandler" />
		<result property="status" column="status"
			typeHandler="com.xxx.xxx.persistence.mapper.cc.handler.GenericEnumCodeHandler" />
		<result property="menuId" column="menu_id" />
		<result property="versionRegular" column="version_regular" />
		<result property="unionRegular" column="union_regular" />
		<result property="regularRelation" column="regular_relation"
			typeHandler="com.xxx.xxx.persistence.mapper.cc.handler.GenericEnumCodeHandler" />
		<result property="effectiveStartTime" column="effective_starttime" />
		<result property="effectiveEndTime" column="effective_endtime" />
	</resultMap>

	<insert id="insert" parameterType="FilterItem" useGeneratedKeys="true"
		keyProperty="id">
		insert into
		t_cc_filter_menu
		(pv,status,menu_id,version_regular,union_regular,regular_relation,effective_starttime,effective_endtime)
		values
		(#{pv,typeHandler=com.xxx.xxx.persistence.mapper.cc.handler.GenericEnumNameHandler},#{status,typeHandler=com.xxx.xxx.persistence.mapper.cc.handler.GenericEnumCodeHandler},#{menuId},#{versionRegular},#{unionRegular},
		 #{regularRelation,typeHandler=com.xxx.xxx.persistence.mapper.cc.handler.GenericEnumCodeHandler},#{effectiveStartTime},#{effectiveEndTime})
	</insert>

	<select id="queryById" parameterType="int" resultMap="FilterItemMap">
		select
		id,pv,status,menu_id,version_regular,union_regular,regular_relation,effective_starttime,effective_endtime
		from t_cc_filter_menu
		where id = #{id}
	</select>
</mapper>

 

 

 

 

分享到:
评论
1 楼 weituotian 2017-01-15  
valueOfEnum怎么用?

相关推荐

    mybatis入门实战之枚举类型

    本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...

    mybatis处理枚举类的简单方法

    MyBatis处理枚举类的简单方法 MyBatis是一个流行的持久层框架,提供了很多便捷的方法来处理数据库交互,然而,在处理枚举类时,MyBatis提供的两个枚举处理类:`EnumOrdinalTypeHandler`和`EnumTypeHandler`,却存在...

    spring boot mybatis枚举映射示例代码

    通过以上步骤,我们已经成功地实现了Spring Boot MyBatis中的枚举映射。现在,当我们在实体类中使用`YesOrNo`枚举类型,并映射到整型字段时,MyBatis Plus会自动调用我们自定义的枚举处理器,实现枚举与数据库字段...

    1.springbood+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景

    MyBatis默认并不支持直接将数据库中的字符串值映射到枚举类型上,因此我们需要自定义一个TypeHandler。 以下是一个简单的自定义枚举类型转换器示例: ```java import org.apache.ibatis.type.BaseTypeHandler; ...

    boot+mybatis、mybatis中枚举转换器、前后端分离项目统一返回格式、boot集成quraz框架实现定时任务

    在MyBatis的配置中注册这个类型处理器,确保在处理枚举类型的字段时能正确映射。 3. **前后端分离项目的统一返回JSON格式**: 在前后端分离的架构中,后端作为API服务器,需要提供统一的JSON格式响应,以便前端...

    mybatis中实现枚举自动转换方法详解

    同时,为了方便查找,我们可以维护一个静态的HashMap,存储枚举值与枚举实例的映射。 ```java public enum PersonType { STUDENT("1", "学生"), TEACHER("2", "教师"); private String value; private String ...

    Mybatis-Plus通用枚举的使用详解

    在处理枚举类型时,Mybatis-Plus提供了通用枚举(Generic Enum)的功能,使得枚举在数据库交互中的使用更加优雅。 在数据库设计中,我们常常会遇到一些具有固定选项的字段,如性别、状态等,这些字段通常可以使用...

    前后端业务枚举映射问题解决方案.docx

    ### 前后端业务枚举映射问题解决方案 #### 背景介绍 在现代软件开发中,前后端分离已成为一种广泛采用的架构模式。在这种模式下,前端负责用户界面与用户体验,而后端则专注于业务逻辑处理及数据管理。在实际业务...

    MyBatis中如何优雅的使用枚举详解

    6. 使用枚举在Mapper接口及XML映射文件中,现在可以放心地使用我们的枚举类型了。例如,在Mapper接口中: ```java public interface ComputerMapper { void updateState(@Param("id") int id, @Param("state") ...

    mybatis入门之typeHanlder的三种使用案例

    本文将深入探讨MyBatis中的TypeHandler,特别是`EnumOrdinalTypeHandler`和`EnumTypeHandler`,以及如何自定义TypeHandler来处理枚举类与数据库字典的映射。我们将通过三个具体的使用案例进行讲解。 首先,让我们...

    MyBatis3.2.2中文官方文档

    映射器是MyBatis中最重要的组件之一,它包含了SQL语句和映射规则。通常将映射器定义在Mapper接口中,并通过XML文件或注解的方式实现。 #### SQL片段(sql) SQL片段是一种重用SQL语句的方式,可以在多个地方定义...

    mybatis3--4.resultMap高级映射

    在MyBatis中,ResultMap是核心配置之一,它提供了高级映射功能,使得我们可以更加灵活地处理数据库查询结果到Java对象的转换。本篇将深入探讨MyBatis中的ResultMap,包括其重要性、使用方式以及一些高级特性。 ...

    mybatis-common-enum-handler-and-pageable:本项目实现mybatis中enum到int映射的通用处理机制,及扩展mybatis-generator 自动生成分页功能的插件

    本项目实现mybatis中enum到int映射的通用处理机制,及扩展mybatis-generator 自动生成分页功能的插件 #通过EnumValueTypeHandler、IEnum、MybatisSqlSessionFactoryBean三个类实现enum与int在java与db之间的自动转换...

    MyBatis(ibatis)学习文档.docx

    MyBatis的枚举类型处理器,用于处理Java枚举类型与数据库表之间的映射关系。 object, MyBatis的对象是指Java对象,用于表示业务逻辑中的实体对象。MyBatis的对象可以与数据库表之间建立映射关系,从而实现数据的...

    mybatis-plus使用@EnumValue处理枚举类型的示例代码

    在MyBatis-Plus中,`@EnumValue`是一个用于处理枚举类型的注解,它使得枚举可以与数据库中的字段进行映射。这个注解主要用于解决枚举类型在序列化和反序列化过程中的问题,确保数据在数据库和Java对象之间能够正确地...

    MyBatis中文文档

    8. **类型处理器**:MyBatis包含了丰富的类型处理器,可以自动处理各种数据类型与JDBC类型的转换,如日期、时间、枚举等。 9. **配置与环境**:MyBatis的配置文件可以定义数据源、事务管理器和环境等,方便在不同的...

    mybatis 3.2.2 中文用户指南

    - HandlingEnums:特别说明了如何处理枚举类型的映射。 - objectFactory:配置一个对象工厂实例,MyBatis用它来创建结果对象。 - plugins:可以自定义插件来改变MyBatis内部的行为。 - environments:配置数据库环境...

    MyBatis面试题(2020最新版).pdf

    MyBatis可以映射Enum枚举类,通过resultType或typeHandler配置。动态SQL是MyBatis的一大特色,可以实现条件拼接,如if、choose、when、otherwise等标签。MyBatis的分页插件如PageHelper,通过拦截器实现。MyBatis的...

    MyBatis-2 全局配置文件

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在MyBatis中,全局配置文件(通常命名为`mybatis-config.xml`)扮演着核心角色,它为整个MyBatis框架提供了基础设置,定义了数据库连接...

    自定义mybatis流程分析.rar

    1. 自定义TypeHandler:当MyBatis内置的TypeHandler无法满足需求时,可以编写自定义TypeHandler,覆盖默认的类型转换逻辑,如处理自定义枚举类型、复杂对象等。 2. 自定义Executor:Executor是MyBatis的执行器,...

Global site tag (gtag.js) - Google Analytics