场景描述
我们在实际场景中经常会遇到需要将枚举值存储到数据库中,或是将从数据库中查询到的值对应到枚举类上的情况。
比如表process
大致定义如下:
-- ----------------------------
-- Table structure for process
-- ----------------------------
DROP TABLE IF EXISTS `process`;
CREATE TABLE `process` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
对应实体类Process
,大致定义如下:
public class Process{
private int id;
private String name;
private ProcessStatus status;
// 省略 getter setter toString 等
}
其中,枚举类ProcessStatus
,大致定义如下:
public enum ProcessStatus {
RUNNING(100, "running"),
BLOCKED(101, "blocked"),
STOPPED(102, "stopped");
private int code;
private String desc;
ProcessStatus(int code, String desc) {
this.code = code;
this.desc = desc;
}
// ...
}
如果此时我们想在存储Process
类时直接将ProcessStatus
对应成某种值,或者在查询时直接将数据库status
字段值对应成为ProcessStatus
类,而不需要用硬编码的方式做更多的转换,我们可以考虑采用 MyBatis 提供的typeHandler
。
MyBatis 内置的枚举处理器
为了处理上述遇到的问题,MyBatis 内置了两种 typeHandler,分别是org.apache.ibatis.type.EnumTypeHandler
和org.apache.ibatis.type.EnumOrdinalTypeHandler
。
EnumTypeHandler
作为默认的枚举 typeHandler,EnumTypeHandler
将使用枚举实例名称来和对应的枚举类之间做转换。
比如process
表有记录:
id | name | status |
---|---|---|
1 | first | RUNNING |