mybatisPlus xml映射枚举字段
时间: 2025-06-28 17:14:47 浏览: 5
### MyBatis Plus 中通过 XML 映射枚举字段
在 MyBatis-Plus 中处理枚举类型时,可以通过自定义 TypeHandler 来实现枚举与数据库字段之间的转换。这种方式不仅简化了开发过程,还提高了代码的可读性和维护性[^1]。
#### 自定义 EnumTypeHandler 示例
为了使枚举能够被正确映射到数据库字段并从中获取,通常需要创建一个继承 `BaseTypeHandler` 的类来处理特定枚举类型的序列化和反序列化:
```java
import com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CustomEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
private final Class<E> type;
private final E[] enums;
public CustomEnumTypeHandler(Class<E> 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 void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.name());
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
String name = rs.getString(columnName);
return name == null ? null : Enum.valueOf(type, name);
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String name = rs.getString(columnIndex);
return name == null ? null : Enum.valueOf(type, name);
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String name = cs.getString(columnIndex);
return name == null ? null : Enum.valueOf(type, name);
}
}
```
此处理器会将枚举的名字作为字符串存储于数据库中,并能在查询时将其还原为对应的枚举实例[^4]。
#### Mapper XML 文件配置
接着,在相应的 mapper XML 文件里指定该 handler 被应用于哪个属性上:
```xml
<resultMap id="BaseResultMap" type="com.example.model.User">
<!-- 其他 column-to-field mappings -->
<result property="status" column="status" typeHandler="com.example.handler.CustomEnumTypeHandler"/>
</resultMap>
<!-- 或者对于 insert/update 操作 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (
status,
...
) VALUES (
#{status,typeHandler=com.example.handler.CustomEnumTypeHandler},
...
)
</insert>
```
上述配置展示了如何利用 `<result>` 和 `#{}` 表达式中的 `typeHandler` 属性关联自定义的 `CustomEnumTypeHandler` 到具体的实体属性上[^2]。
#### 实体类定义
最后,确保 Java 实体类中有相应枚举类型的声明:
```java
package com.example.model;
public class User {
private StatusEnum status; // 假设有一个名为StatusEnum的枚举
// getter and setter methods...
}
// 定义枚举类型
enum StatusEnum { ACTIVE, INACTIVE }
```
这样就完成了从数据库字段到 Java 枚举对象以及反之的操作流程设置。
阅读全文
相关推荐


















