我定义一些实体时,有时我们在定义枚举是会用到枚举,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>
相关推荐
本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...
MyBatis处理枚举类的简单方法 MyBatis是一个流行的持久层框架,提供了很多便捷的方法来处理数据库交互,然而,在处理枚举类时,MyBatis提供的两个枚举处理类:`EnumOrdinalTypeHandler`和`EnumTypeHandler`,却存在...
通过以上步骤,我们已经成功地实现了Spring Boot MyBatis中的枚举映射。现在,当我们在实体类中使用`YesOrNo`枚举类型,并映射到整型字段时,MyBatis Plus会自动调用我们自定义的枚举处理器,实现枚举与数据库字段...
MyBatis默认并不支持直接将数据库中的字符串值映射到枚举类型上,因此我们需要自定义一个TypeHandler。 以下是一个简单的自定义枚举类型转换器示例: ```java import org.apache.ibatis.type.BaseTypeHandler; ...
在MyBatis的配置中注册这个类型处理器,确保在处理枚举类型的字段时能正确映射。 3. **前后端分离项目的统一返回JSON格式**: 在前后端分离的架构中,后端作为API服务器,需要提供统一的JSON格式响应,以便前端...
同时,为了方便查找,我们可以维护一个静态的HashMap,存储枚举值与枚举实例的映射。 ```java public enum PersonType { STUDENT("1", "学生"), TEACHER("2", "教师"); private String value; private String ...
在处理枚举类型时,Mybatis-Plus提供了通用枚举(Generic Enum)的功能,使得枚举在数据库交互中的使用更加优雅。 在数据库设计中,我们常常会遇到一些具有固定选项的字段,如性别、状态等,这些字段通常可以使用...
### 前后端业务枚举映射问题解决方案 #### 背景介绍 在现代软件开发中,前后端分离已成为一种广泛采用的架构模式。在这种模式下,前端负责用户界面与用户体验,而后端则专注于业务逻辑处理及数据管理。在实际业务...
6. 使用枚举在Mapper接口及XML映射文件中,现在可以放心地使用我们的枚举类型了。例如,在Mapper接口中: ```java public interface ComputerMapper { void updateState(@Param("id") int id, @Param("state") ...
本文将深入探讨MyBatis中的TypeHandler,特别是`EnumOrdinalTypeHandler`和`EnumTypeHandler`,以及如何自定义TypeHandler来处理枚举类与数据库字典的映射。我们将通过三个具体的使用案例进行讲解。 首先,让我们...
映射器是MyBatis中最重要的组件之一,它包含了SQL语句和映射规则。通常将映射器定义在Mapper接口中,并通过XML文件或注解的方式实现。 #### SQL片段(sql) SQL片段是一种重用SQL语句的方式,可以在多个地方定义...
在MyBatis中,ResultMap是核心配置之一,它提供了高级映射功能,使得我们可以更加灵活地处理数据库查询结果到Java对象的转换。本篇将深入探讨MyBatis中的ResultMap,包括其重要性、使用方式以及一些高级特性。 ...
本项目实现mybatis中enum到int映射的通用处理机制,及扩展mybatis-generator 自动生成分页功能的插件 #通过EnumValueTypeHandler、IEnum、MybatisSqlSessionFactoryBean三个类实现enum与int在java与db之间的自动转换...
MyBatis的枚举类型处理器,用于处理Java枚举类型与数据库表之间的映射关系。 object, MyBatis的对象是指Java对象,用于表示业务逻辑中的实体对象。MyBatis的对象可以与数据库表之间建立映射关系,从而实现数据的...
在MyBatis-Plus中,`@EnumValue`是一个用于处理枚举类型的注解,它使得枚举可以与数据库中的字段进行映射。这个注解主要用于解决枚举类型在序列化和反序列化过程中的问题,确保数据在数据库和Java对象之间能够正确地...
8. **类型处理器**:MyBatis包含了丰富的类型处理器,可以自动处理各种数据类型与JDBC类型的转换,如日期、时间、枚举等。 9. **配置与环境**:MyBatis的配置文件可以定义数据源、事务管理器和环境等,方便在不同的...
- HandlingEnums:特别说明了如何处理枚举类型的映射。 - objectFactory:配置一个对象工厂实例,MyBatis用它来创建结果对象。 - plugins:可以自定义插件来改变MyBatis内部的行为。 - environments:配置数据库环境...
MyBatis可以映射Enum枚举类,通过resultType或typeHandler配置。动态SQL是MyBatis的一大特色,可以实现条件拼接,如if、choose、when、otherwise等标签。MyBatis的分页插件如PageHelper,通过拦截器实现。MyBatis的...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在MyBatis中,全局配置文件(通常命名为`mybatis-config.xml`)扮演着核心角色,它为整个MyBatis框架提供了基础设置,定义了数据库连接...
1. 自定义TypeHandler:当MyBatis内置的TypeHandler无法满足需求时,可以编写自定义TypeHandler,覆盖默认的类型转换逻辑,如处理自定义枚举类型、复杂对象等。 2. 自定义Executor:Executor是MyBatis的执行器,...