之前发布了一篇《MyBatis配置之typeHandler类型处理器》的文章,讲解了在使用MyBatis时如何自定义typeHandler。但是在MyBatis中枚举类型的typeHandler则有自己特殊的规则。
在MyBatis中提供了两个转化枚举类型的typeHandler给用户使用。
- org.apache.ibatis.type.EnumTypeHandler
- org.apache.ibatis.type.EnumOrdinalTypeHandler
其中,EnumTypeHandler是使用枚举字符串名称作为参数传递的,EnumOrdinalTypeHandler是使用整数下标作为参数传递的。如果枚举和数据库字典项保持一致,就可以使用它们。然而这两个枚举类型应用却不是那么广泛,更多的情况下是使用自定义的typeHandler处理枚举类型。
本篇文章中就以性别为例,讲解一下怎样使用枚举类typeHandler。
定义一个性别枚举类
public enum Sex {
MALE(1,"男"),FEMALE(2,"女");
private int id;
private String name;
private Sex(int id,String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Sstring getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Sex getSex(int id) {
if(id == 1) {
return MALE;
} else if(id == 2) {
return FEMALE;
}
return null;
}
}
在没有配置的情况下,MyBatis默认使用EnumOrdinalTypeHandler枚举类型处理器。为了能让EnumOrdinalTypeHandler能够处理我们自定义的枚举类,需要在MyBatis做如下配置。
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.demo.enums.Sex" />
</typeHandlers>
这样MyBatis就可以识别我们自定义的枚举类了。当然这还不够,还需要在对应的mapper映射文件中进行响应的配置。我们自定义的枚举类是在用户信息实体类中使用,所以需要在用户实体类对应的mapper映射文件中进行配置。
<?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.demo.mapper.UserMapper">
<resultMap type="com.demo.entity.UserEntity" id="userMap">
<id column="id" property="id" javaType="long" jdbcType="BIGINT" />
<result column="user_name" property="userName" />
<result column="cnname" property="cnname" />
<result column="birthday" property="birthday" />
<result column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler" />
<result column="email" property="email" />
<result column="mobile" property="mobile" />
<result column="note" property="note" />
</resultMap>
<select id="getUser" parameterType="long" resultMap="userMap">
select id,user_name,cnname,birthday,sex,email,mobile,note from t_user where id=#{id}
</select>
<insert parameterType="com.demo.entity.UserEntity" id="insertUser">
insert into t_user(user_name,cnname,birthday,sex,email,mobile,note) values(#{userName},#{cnname},#{birthday},#{sex,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},#{email},#{mobile},#{note})
</insert>
</mapper>
UserMapper.java
public interface UserMapper {
public User getUser(Long id);
public int insertUser(UserEntity userEntity);
}
接下来就可以测试了
TestMyTypeHandler.java
public class TestMyTypeHandler {
public static void main(String[] args) {
SqlSession sqlSession=null;
try {
sqlSession = SqlSessionFactoryUtil.openSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserEntity userEntity = new UserEntity();
userEntity.setUserName("liubei");
userEntity.setCnname("刘备");
userEntity.setMobile("18888888888888");
userEntity.setSex(Sex.MALE);
userEntity.setEmail("liubei@163.com");
userEntity.setNote("测试枚举类型转换器");
userEntity.setBirthday(new Date());
userMapper.insertUser(userEntity);
UserEntity userEntity2 = userMapper.getUser(1L);
System.out.println(userEntity2.getSex());
sqlSession.commit();
} catch(Exception ex) {
System.err.println(ex.getMessage());
sqlSession.rollback();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
}
}
原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/mybatis-enumordinaltypehandler.html