解决mybatis使用枚举的转换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年9月6日 16:21:28 星期日
一、第一种解决方法就是使用自带的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 星期日
相关推荐
本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...
在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...
在MyBatis中,枚举类型的自动转换是一个常见的需求,特别是在处理数据库字段与Java枚举类型之间转换时。本文将详细介绍如何在...在实际项目中,可以针对不同的枚举类型创建不同的类型处理器,以满足各种枚举转换需求。
现在,当你在Mapper接口中使用`Gender`枚举类型时,MyBatis会自动使用我们定义的`GenderTypeHandler`进行转换。例如: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE gender...
本项目示例"1.springboot+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景"着重展示了如何在Spring Boot应用中集成MyBatis,并利用MyBatis处理枚举类型的数据。 首先,我们来了解Spring Boot。...
在实际开发中,自定义枚举处理类可以解决很多实际问题,例如,在电子商务系统中,需要将订单状态枚举转换为int值,以便存储到数据库中。在这个系统中,可以定义一个自定义的枚举处理类,例如`OrderStatusTypeHandler...
总结总结通过以上步骤,我们已经成功地在MyBatis中优雅地使用了枚举类型。这种方式不仅保持了代码的可读性,同时也方便了数据库与枚举之间的数据交互。在实际项目中,我们可以创建一个枚举基类,让所有枚举继承该...
同样,在查询时,Mybatis-Plus也会将数据库中的值自动转换回对应的枚举常量,使得枚举在程序中的使用变得直观且方便。 为了使Mybatis-Plus能够识别枚举类型,我们需要在配置文件中指定枚举包扫描的路径,例如: ``...
在实际项目中,我们可能会遇到需要处理复杂类型转换的情况,比如枚举类型、自定义集合类型等。这时,自定义TypeHandler可以有效地解决这些问题,提高代码的可读性和可维护性。 总结来说,Mybatis的TypeHandler是...
这个注解主要用于解决枚举类型在序列化和反序列化过程中的问题,确保数据在数据库和Java对象之间能够正确地转换。 在MyBatis-Plus 3.1.0版本之后,如果你不需要使用原生的枚举类型,可以通过配置默认的枚举类型...
为了解决这个问题,我们需要自定义一个通用的枚举TypeHandler。这里,我们介绍一个名为`DisplayedEnum`的接口,它可以用来扩展枚举类,使得每个枚举项包含一个标签(label)和一个值(value)。这个接口提供了一些...
在更新操作中,同样可以轻松地将枚举转换为对应的数值: ```java User user = new User(); user.setStatus(StatusEnum.ACTIVE); userMapper.updateById(user); ``` 通过这种方式,枚举变量不仅使代码更加清晰,还...
当使用`EnumOrdinalTypeHandler`时,MyBatis会将枚举的序号(如0、1、2)存储到数据库中。虽然简单,但这种方式存在风险,因为如果枚举顺序发生变化,数据库中的值可能无法正确映射回枚举。 2. `EnumTypeHandler`:...
现在,当我们在实体类中使用`YesOrNo`枚举类型,并映射到整型字段时,MyBatis Plus会自动调用我们自定义的枚举处理器,实现枚举与数据库字段之间的转换,从而避免了因数据类型不匹配导致的异常。这种方法提高了代码...
MyBatis中文官方文档提供了对该框架的详细介绍,为初学者和使用者提供入门和深入应用的指导。 ### MyBatis中文官方文档知识点 #### 什么是MyBatis? MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层...
1. 自定义TypeHandler:当MyBatis内置的TypeHandler无法满足需求时,可以编写自定义TypeHandler,覆盖默认的类型转换逻辑,如处理自定义枚举类型、复杂对象等。 2. 自定义Executor:Executor是MyBatis的执行器,...
因此,这个拦截器可能不再被使用,但它作为一个备忘录,证明了曾经的一种解决方案。 总的来说,这个拦截器的实例展示了如何利用MyBatis的拦截器机制来增强业务逻辑,自动处理一些通用的操作,如维护审计跟踪信息。...
使用MyBatis的映射机制,可以将Java对象自动转换为SQL语句,从而实现数据的持久化存储和检索。 范围和生命周期 MyBatis的范围和生命周期是指MyBatis对象的生命周期和作用域。MyBatis的对象可以分为两种:...
在操作数据库方面,MyBatis允许用户使用预定义SQL语句,支持select、insert、update和delete操作,并且可以配置相应的参数和结果映射。MyBatis还支持缓存机制,包括一级缓存和二级缓存,以提高访问数据库的性能。 ...
4. 枚举类型映射:可以使用`<discriminator>`元素根据某个字段的值来决定使用哪个ResultMap,常用于处理枚举类型的字段。 5. TypeHandler:自定义数据类型的转换,比如日期、时间、自定义对象等,可以通过Type...