平时咱们写程序实体类内或多或少都会有枚举类型属性,方便嘛。但是mybatis里怎么处理他们的增删改查呢?
要求:
插入的时候,会用枚举的定义插入数据库,我们希望在数据库中看到的是数字或者其他东西;
查询的时候,数据库的值可以自动转换为我们对应的枚举值。
举例,我有一个这样的枚举类型:
Java Code复制内容到剪贴板
- package cn.com.shuyangyang.domain;
-
- public enum UserStatus {
-
-
- DISABLED(0),
-
- AVAILABLE(1);
-
- private int status;
-
- UserStatus(int status){
- this.status = status;
- }
-
- public int getStatus() {
- return status;
- }
-
- }
我们插入数据库中,数据库应该为我们保存0或者1
我们可以使用mybatis自带的枚举类型EnumOrdinalTypeHandler
举例如下:
Java Code复制内容到剪贴板
- <insert id="addUser" parameterType="User">
- INSERT INTO t_user(USER_ID,USER_NAME,LOGIN_NAME,
- LOGIN_PASSWORD,USER_STATUS,CREATE_TIME,UPDATE_TIME)
- VALUES(
- #{user_id},
- #{user_name},
- #{login_name},
- #{login_password},
- #{user_status, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},
- #{create_time},
- #{update_time}
- )
- </insert>
我们的UserStatus插入的时候是UserStatus.AVAILABLE
执行完毕后,看结果:

看,是不是结果是我们期望的那样。
但是问题来了?
我们查询的时候报错了:Error querying database. Cause: java.lang.IllegalArgumentException: No enum constant cn.com.shuyangyang.mybatis.UserStatus.1
我们可以自定义这样的一个EnumStatusHandler:
mapper.xml里这样配置:
XML/HTML Code复制内容到剪贴板
- <resultMap type="User" id="userResult">
- ……省略其他属性配置
- <result column="USER_STATUS" property="user_status" typeHandler="cn.com.shuyangyang.mybatis.EnumStatusHandler"/>
- ……省略其他属性配置
- </resultMap>
现在来看看结果:
[User [user_id=782cba19-559f-41c3-a1b0-25fcac4cf118, user_name=系统管理员, login_name=admin, login_password=admin,user_status=AVAILABLE, create_time=Mon Jan 26 21:17:09 CST 2015, update_time=Mon Jan 26 21:17:09 CST 2015]]
完美结果。
MyBatis对于Java对象里的枚举类型处理
原文:http://www.cnblogs.com/jeffen/p/6380724.html