问题描述
实体中的属性使用枚举和boolean会增加代码的可读性,但是实体和数据库的映射上不能很自然地支持,这样导致由于数据库的原因使得实体中属性使用基本类型来代替枚举和boolean。
实体中属性实例如下
private Integer status;// 0:草稿,1:合格 2:优秀 3:退回
private Byte open;//0;关闭 1:打开
在页面,java代码,和sql到处使用数字,使得代码可读性极差,代码越多,时间越长越没法维护。
<#if trainGroup.type==1>
<a href="javascript:" class="zi-lv" onclick="createAllGroup()" >教研组</a>
<#else>
<a href="javascript:" class="zi-lv" onclick="createAllCoop()" >协作组</a>
</#if>
param.setStatus(2); //优秀
或者使用常量(不能保证大家都使用常量,直接使用数字也没有错)param.setStatus(CONST.GOOD); //优秀
select ....
from T_DT_TRAIN_GROUP t .....m.STATUS = 2
使用枚举后的代码如下
<#if trainGroup.type=='JIAOYAN'>
<a href="javascript:" class="zi-lv" onclick="createAllGroup()" >教研组</a>
<#else>
<a href="javascript:" class="zi-lv" onclick="createAllCoop()" >协作组</a>
</#if>
param.setStatus(Status.GOOD);//只能使用枚举,否则编译通不过
select ....
from T_DT_TRAIN_GROUP t .....m.STATUS =${@cn.com.Status@GOOD.getValue()}
解决办法
在mybatis中实体属性与表字段之间的映射使用TypeHandler机制,mybatis本身提供了两种枚举类型的转换 EnumTypeHandler和EnumOrdinalTypeHandler。
EnumTypeHandler:将枚举值转化成字符串,字符串取枚举值的名称,使用枚举的.name()方法。EnumTypeHandler已经被内置了,只需要将实体属性改成枚举即可,不需要做任何TypeHandler配置,下面是mybatis获得TypeHandler的源码,如果没有匹配上任何TypeHandler,并且属性是枚举类型就使用EnumTypeHandler。
private <T> TypeHandler<T> getTypeHandler(Type type, JdbcType jdbcType) {
Map<JdbcType, TypeHandler<?>> jdbcHandlerMap = TYPE_HANDLER_MAP.get(type);
TypeHandler<?> handler = null;
if (jdbcHandlerMap != null) {
handler = jdbcHandlerMap.get(jdbcType);
if (handler == null) {
handler = jdbcHandlerMap.get(null);
}
}
if (handler == null && type != null && type instanceof Class && Enum.class.isAssignableFrom((Class<?>) type)) {
handler = new EnumTypeHandler((Class<?>) type);
}
@SuppressWarnings("unchecked")
// type drives generics here
TypeHandler<T> returned = (TypeHandler<T>) handler;
return returned;
}
这种方式最简洁,不需要做任何配置,但是要求表字段中存储的是枚举的名称。
EnumOrdinalTypeHandler:将枚举值转换数字,使用的是枚举的.ordinal()方法。如果要使用这种方式必须给每一个枚举类配置一次EnumOrdinalTypeHandler,如下给两个枚举配置同一个
EnumOrdinalTypeHandler,没有配置的枚举会走默认的EnumTypeHandler。
<typeHandlers>
<!-- <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
javaType="cn.com.teacher.cistus.dt.entity.TestMenu" /> -->
<typeHandler
handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
javaType="cn.com.teacher.cistus.dt.enums.EnumTrainGroupType" />
<typeHandler
handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
javaType="cn.com.teacher.cistus.dt.enums.EnumPortalConfigType" />
</typeHandlers>
sql mapper中如何使用枚举
public class TrainGroup extends AbstractEntity
private EnumTrainGroupType type;//0教研组 1协作组
映射和查询条件中不用任何特殊处理即可使用枚举。
<resultMap id="BaseResultMap" type="cn.com.teacher.cistus.dt.entity.TrainGroup" >
<result column="TYPE" property="type" jdbcType="INTEGER" />
。。。
<if test="type != null" >
TYPE = #{type,jdbcType=INTEGER},
</if>
sql中使用枚举常量
如下示例直接在sql中使用枚举,这样提高了代码的可读性,并且枚举值写错了会报错提示的。type=${@cn.com.teacher.cistus.
dt.enums.EnumTrainGroupType@JIAOYAN.ordinal()}
枚举常量的获取使用了ongl表达式的功能,${@cn.co。。GroupType@JIAOYAN.ordinal()}是原生的ongl执行静态代码的写法。
枚举值按指定值映射
mybatis本身只提供了上面两种枚举映射方式,如果想映射自定义的值,比如
JIAOYAN(10,"教研组"),XIEZUO(20,"协作组");映射成 10 ,20.
public class EnumValueTypeHandler <E extends Enum & IDBEnum> extends BaseTypeHandler<E>{
private Class<E> type;
// private final E[] enums;
public EnumValueTypeHandler(Class<E> type) {
this.type = type;
E[] enums = type.getEnumConstants();
if (enums == null) {
throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
}
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getValue());
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
int i = rs.getInt(columnName);
if (rs.wasNull()) {
return null;
} else {
try {
return DBEnumUtils.getEnumInstance(type,i);
} catch (Exception ex) {
throw new IllegalArgumentException("Cannot convert " + i + " to " + type.getSimpleName() + " by ordinal value.", ex);
}
}
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int i = rs.getInt(columnIndex);
if (rs.wasNull()) {
return null;
} else {
try {
return DBEnumUtils.getEnumInstance(type,i);
} catch (Exception ex) {
throw new IllegalArgumentException("Cannot convert " + i + " to " + type.getSimpleName() + " by ordinal value.", ex);
}
}
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int i = cs.getInt(columnIndex);
if (cs.wasNull()) {
return null;
} else {
try {
return DBEnumUtils.getEnumInstance(type,i);
} catch (Exception ex) {
throw new IllegalArgumentException("Cannot convert " + i + " to " + type.getSimpleName() + " by ordinal value.", ex);
}
}
}
}
public enum EnumTrainGroupType implements IDBEnum{
JIAOYAN(10,"教研组"),XIEZUO(20,"协作组");
private int value;
private String name;
EnumTrainGroupType(int value,String name){
this.value=value;
this.name=name;
}
@Override
public int getValue() {
return value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setValue(int value) {
this.value = value;
}
}
相关推荐
在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作与对象之间的映射过程。本文将深入探讨在MyBatis中如何...在实践中,熟练掌握枚举和TypeHandler的使用,将有助于提高代码的可维护性和可读性。
总结总结通过以上步骤,我们已经成功地在MyBatis中优雅地使用了枚举类型。这种方式不仅保持了代码的可读性,同时也方便了数据库与枚举之间的数据交互。在实际项目中,我们可以创建一个枚举基类,让所有枚举继承该...
MyBatis 枚举全面使用指南 抓下来打包成了HTML文件, 方便离线观看
在MyBatis中,枚举类型的自动转换是一个常见的需求,特别是在处理数据库字段与Java枚举类型之间转换时。本文将详细介绍如何在MyBatis中实现枚举的自动转换,以便在查询结果返回时能直接得到对应的枚举实例,无需额外...
5. **SQL映射**:在MyBatis中,你可以编写动态SQL,这使得SQL语句可以根据条件动态生成,极大地提高了代码的可读性和灵活性。 6. **参数映射**:MyBatis支持多种类型的参数映射,包括基本类型、复杂类型(如自定义...
在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...
在本项目中,我们关注的是如何使用 MyBatis 自动生成 Bean、Mapper 和 Service 代码,这样可以减少手动编写这些基础组件的时间,让开发者更专注于业务逻辑。 1. **Bean(实体类)生成**: 在 MyBatis 中,Bean 类...
MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习代码MyBatis的学习...
在提供的压缩包中,包含两个关键文件: 1. `mybatis-generator-core-1.4.0-SNAPSHOT.jar`:这是MyBatis代码生成器的核心库。这个JAR文件包含了所有必要的类和资源,用于根据数据库表结构自动生成代码。MyBatis ...
在实际开发中,MyBatis Code Generator插件还可以与其他工具集成,比如IDEA、Eclipse等集成开发环境,通过插件的形式提供图形化的配置界面,使得生成代码更加便捷。此外,你还可以通过调整generatorConfig.xml中的...
通过自定义TypeHandler,我们可以让枚举类型在数据库与Java对象之间无缝切换,大大提高了代码的可读性和维护性。这种方式不仅适用于`Gender`枚举,也可以扩展到其他任何你需要转换的枚举类型。在实际项目中,可以将...
本项目示例"1.springboot+mybatis项目demo2.mybatis自定义枚举类型的转换器以及各种使用场景"着重展示了如何在Spring Boot应用中集成MyBatis,并利用MyBatis处理枚举类型的数据。 首先,我们来了解Spring Boot。...
本教程将深入探讨在Mybatis Plus中如何有效地使用枚举变量,提升代码的可读性和可维护性。 在Java编程中,枚举类型(enum)是一种强大的工具,它允许我们定义一组预定义的常量,这些常量通常代表某种固定的、有限的...
在处理枚举类型时,Mybatis-Plus提供了通用枚举(Generic Enum)的功能,使得枚举在数据库交互中的使用更加优雅。 在数据库设计中,我们常常会遇到一些具有固定选项的字段,如性别、状态等,这些字段通常可以使用...
- 尽量避免在SQL中使用复杂的日期运算,而是将计算逻辑放在Java代码中,提高代码可读性和可维护性。 - 使用Joda-Time或Java 8的`java.time`包来处理日期,以获得更好的API和更精确的日期处理能力。 - 遵循数据库...
总结来说,`@EnumValue`注解是MyBatis-Plus提供的一种处理枚举类型与数据库字段映射的方法,它简化了枚举在Java对象与数据库之间转换的过程,提高了代码的可读性和维护性。在实际开发中,合理使用`@EnumValue`可以...
如果希望在命令行中执行,可以使用maven插件或者编写一个脚本,调用`mvn mybatis-generator:generate`命令来执行代码生成。 通过以上步骤,MyBatis Generator会根据配置文件中的设置自动生成对应的Java实体类、...
MyBatis 的安装和使用非常简单,只需要将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中: ``` <groupId>org.mybatis ...
标题“hibernate与mybatis一起使用取长补短”暗示了在一个项目中同时采用这两种框架,旨在充分利用它们各自的优点,以提升项目的性能和灵活性。 Hibernate是一款强大的ORM框架,它提供了完整的对象模型支持,包括...