`
阅读更多

解决mybatis使用枚举的转换

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

蕃薯耀 2015年9月6日 16:21:28 星期日

http://fanshuyao.iteye.com/

 

一、第一种解决方法就是使用自带的typeHandler

org.apache.ibatis.type.EnumOrdinalTypeHandler

 

结果返回的例子:

 

<resultMap id="huserResultMap" type="com.chinagas.authorization.model.HUsers" >

    <result column="genders" property="genders" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
  </resultMap>

 

更新数据的例子:

 

<update id="updateBasicInfoByHuser" parameterType="com.chinagas.authorization.model.HUsers" >
    update H_USERS
    set 
      REAL_NAME = #{realName},
      GENDERS = #{genders,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
      ADDRESS = #{address},
      NICKNAME = #{nickname}
    where USER_ID = #{userId}
  </update>

 

二、第二种是使用自定义的转换器

 

1、枚举

public enum GenderEnum {
	MALE{
		@Override
		public String getValue(){
			return "男";
		}
	},
	FEMALE{
		@Override
		public String getValue() {
			return "女";
		}
	},
	OTHER{
		@Override
		public String getValue() {
			return "未知";
		}
	};
	
	public int getKey(){
		return this.ordinal();
	}
	public abstract String getValue();
}

 

 

2、自定义的枚举处理转换器

 

public class GenderHandler extends BaseTypeHandler<GenderEnum> {

	private Class<GenderEnum> type;  
    
    private final GenderEnum[] enums;
    
    /** 
     * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现 
     * @param type 配置文件中设置的转换类 
     */  
    public GenderHandler(Class<GenderEnum> 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 GenderEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
		// 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型  
        int i = rs.getInt(columnName);  
        if (rs.wasNull()) {  
            return null;  
        } else {  
            // 根据数据库中的code值,定位EnumStatus子类  
            return locateGender(i);  
        }  
	}

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

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

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, GenderEnum parameter,
			JdbcType arg3) throws SQLException {
		ps.setInt(i, parameter.getKey()); 
		
	}
	
	/** 
     * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷 
     * @param code 数据库中存储的自定义code属性 
     * @return code对应的枚举类 
     */  
    private GenderEnum locateGender(int code) {  
        for(GenderEnum gender : enums) {  
            if(gender.getKey()==(Integer.valueOf(code))) {  
                return gender;  
            }  
        }  
        throw new IllegalArgumentException("未知的枚举类型:" + code + ",请核对" + type.getSimpleName());  
    } 

}

 

3、类似于第一种,需要在处理枚举类型上加上

typeHandler=com.xxx.xxx.xxx.GenderHandler

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

蕃薯耀 2015年9月6日 16:21:28 星期日

http://fanshuyao.iteye.com/

1
2
分享到:
评论

相关推荐

    mybatis入门实战之枚举类型

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

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

    在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...

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

    在MyBatis中,枚举类型的自动转换是一个常见的需求,特别是在处理数据库字段与Java枚举类型之间转换时。本文将详细介绍如何在...在实际项目中,可以针对不同的枚举类型创建不同的类型处理器,以满足各种枚举转换需求。

    springboot--mybatis枚举自动转换实现.rar

    现在,当你在Mapper接口中使用`Gender`枚举类型时,MyBatis会自动使用我们定义的`GenderTypeHandler`进行转换。例如: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE gender...

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

    本项目示例"1.springboot+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景"着重展示了如何在Spring Boot应用中集成MyBatis,并利用MyBatis处理枚举类型的数据。 首先,我们来了解Spring Boot。...

    mybatis处理枚举类的简单方法

    在实际开发中,自定义枚举处理类可以解决很多实际问题,例如,在电子商务系统中,需要将订单状态枚举转换为int值,以便存储到数据库中。在这个系统中,可以定义一个自定义的枚举处理类,例如`OrderStatusTypeHandler...

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

    总结总结通过以上步骤,我们已经成功地在MyBatis中优雅地使用了枚举类型。这种方式不仅保持了代码的可读性,同时也方便了数据库与枚举之间的数据交互。在实际项目中,我们可以创建一个枚举基类,让所有枚举继承该...

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

    同样,在查询时,Mybatis-Plus也会将数据库中的值自动转换回对应的枚举常量,使得枚举在程序中的使用变得直观且方便。 为了使Mybatis-Plus能够识别枚举类型,我们需要在配置文件中指定枚举包扫描的路径,例如: ``...

    Mybatis类型转换介绍 TypeHandler

    在实际项目中,我们可能会遇到需要处理复杂类型转换的情况,比如枚举类型、自定义集合类型等。这时,自定义TypeHandler可以有效地解决这些问题,提高代码的可读性和可维护性。 总结来说,Mybatis的TypeHandler是...

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

    这个注解主要用于解决枚举类型在序列化和反序列化过程中的问题,确保数据在数据库和Java对象之间能够正确地转换。 在MyBatis-Plus 3.1.0版本之后,如果你不需要使用原生的枚举类型,可以通过配置默认的枚举类型...

    Mybatis中自定义TypeHandler处理枚举详解

    为了解决这个问题,我们需要自定义一个通用的枚举TypeHandler。这里,我们介绍一个名为`DisplayedEnum`的接口,它可以用来扩展枚举类,使得每个枚举项包含一个标签(label)和一个值(value)。这个接口提供了一些...

    Mybatis plus无介绍快使用,枚举变量的使用(七)

    在更新操作中,同样可以轻松地将枚举转换为对应的数值: ```java User user = new User(); user.setStatus(StatusEnum.ACTIVE); userMapper.updateById(user); ``` 通过这种方式,枚举变量不仅使代码更加清晰,还...

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

    当使用`EnumOrdinalTypeHandler`时,MyBatis会将枚举的序号(如0、1、2)存储到数据库中。虽然简单,但这种方式存在风险,因为如果枚举顺序发生变化,数据库中的值可能无法正确映射回枚举。 2. `EnumTypeHandler`:...

    spring boot mybatis枚举映射示例代码

    现在,当我们在实体类中使用`YesOrNo`枚举类型,并映射到整型字段时,MyBatis Plus会自动调用我们自定义的枚举处理器,实现枚举与数据库字段之间的转换,从而避免了因数据类型不匹配导致的异常。这种方法提高了代码...

    MyBatis3.2.2中文官方文档

    MyBatis中文官方文档提供了对该框架的详细介绍,为初学者和使用者提供入门和深入应用的指导。 ### MyBatis中文官方文档知识点 #### 什么是MyBatis? MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层...

    自定义mybatis流程分析.rar

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

    MyBatis拦截器:给参数对象属性赋值的实例

    因此,这个拦截器可能不再被使用,但它作为一个备忘录,证明了曾经的一种解决方案。 总的来说,这个拦截器的实例展示了如何利用MyBatis的拦截器机制来增强业务逻辑,自动处理一些通用的操作,如维护审计跟踪信息。...

    MyBatis(ibatis)学习文档.docx

    使用MyBatis的映射机制,可以将Java对象自动转换为SQL语句,从而实现数据的持久化存储和检索。 范围和生命周期 MyBatis的范围和生命周期是指MyBatis对象的生命周期和作用域。MyBatis的对象可以分为两种:...

    mybatis 3.2.2 中文用户指南

    在操作数据库方面,MyBatis允许用户使用预定义SQL语句,支持select、insert、update和delete操作,并且可以配置相应的参数和结果映射。MyBatis还支持缓存机制,包括一级缓存和二级缓存,以提高访问数据库的性能。 ...

    mybatis3--4.resultMap高级映射

    4. 枚举类型映射:可以使用`&lt;discriminator&gt;`元素根据某个字段的值来决定使用哪个ResultMap,常用于处理枚举类型的字段。 5. TypeHandler:自定义数据类型的转换,比如日期、时间、自定义对象等,可以通过Type...

Global site tag (gtag.js) - Google Analytics