mybatis-枚举TypeHandler用法

本文详细介绍了在MyBatis中使用EnumOrdinalTypeHandler和EnumTypeHandler处理枚举类型的两种方式,包括配置方法、实体类定义及数据库字段映射,并通过示例展示了如何将枚举类型正确转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)EnumOrdinalTypeHandler

mybatis-config.xml

<typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.mzs.entity.SexEnum"/>
</typeHandlers>

javaType得指定枚举类(我特好奇,使用枚举类的时候,mybatis为什么不能自动匹配到枚举typehandler)


枚举类(getter and setter 读者需要自己填写)

public enum SexEnum {
    male(0, "男"),
    female(1, "女");

    private int id;
    private String name;

    SexEnum(int id, String name) {
        this.id = id;
        this.name = name;
    }

实体类(同样的,getter and setter 省略了)

public class Users {

    private Integer id;
    private String username;
    private String password;
    private Date hireDate;
    private SexEnum sex;
}

 


mysql数据库

mysql> select * from users;
+----+----------+----------+---------------+------+
| id | username | password | hireDate      | sex  |
+----+----------+----------+---------------+------+
|  1 | tom      | tom      | 1537605481252 | 0    |
|  2 | selina   |             | 1537605481252 | 1    |
|  3 | peanut   | zk       | 1537605481252 | 0    |
+----+----------+----------+---------------+------+
3 rows in set (0.01 sec)


UsersMapper.xml部分代码(同名的接口,读者自行补充)

<resultMap id="usersMapper" type="users">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="hireDate" property="hireDate"/>
        <result column="sex" property="sex"/>
    </resultMap>

    <select id="getUser" parameterType="int" resultMap="usersMapper">
        select id, username, password, hireDate, sex FROM users where id = #{id}
    </select>

(注:也可以在resultmap result标签下填写

typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"

这样mybatis-config.xml中的typehandler就可以省略了。)


测试类(com.mzs.test.TestDemo)

        Logger logger = Logger.getLogger("com.mzs.test.TestDemo");
        String resource = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UsersMapper1 usersMapper1 = sqlSession.getMapper(UsersMapper1.class);
        Users user = usersMapper1.getUser(1);
        logger.info(user.getSex().getName());

结果输出信息: 男


(二)EnumTypeHandler

mybatis-config.xml

<typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="com.mzs.entity.SexEnum"/>
</typeHandlers>

mysql数据库(注意:sex字段的值发生了变化)

mysql> select * from users;
+----+----------+----------+---------------+------+
| id | username | password | hireDate      | sex  |
+----+----------+----------+---------------+------+
|  1 | tom      | tom      | 1537605481252 | male   |
|  2 | selina   |             | 1537605481252 | female    |
|  3 | peanut   | zk       | 1537605481252 | male    |
+----+----------+----------+---------------+------+
3 rows in set (0.01 sec)

其他地方不用改动。

结果输出信息: 男

### MyBatis-Plus 中枚举类型的处理及使用 #### 配置默认枚举处理器 为了使 MyBatis-Plus 能够自动识别并处理枚举类型,默认情况下可以在 `application.yml` 或者其他配置文件中指定默认的枚举处理器: ```yaml mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler ``` 这使得框架能够按照预设的方式将 Java 的枚举对象映射到数据库中的相应值[^1]。 #### 使用 @EnumValue 注解简化操作 除了通过全局配置外,还可以利用 `@EnumValue` 注解直接作用于 POJO 类内的枚举字段上。此注解允许开发者更灵活地控制如何将枚举实例转化为存储在数据库里的具体数值表示形式。例如,在实体类中定义如下属性即可实现这一功能: ```java import com.baomidou.mybatisplus.annotation.EnumValue; // ... public class UserInfo { @ApiModelProperty(value = "性别") @EnumValue private SexEnum sex; } ``` 当执行插入或更新语句时,MyBatis-Plus 将依据该注解指示的方法获取对应的整数或其他基本数据类型作为实际存入数据库的内容[^2]。 #### 自动化枚举支持配置 对于项目中存在的大量不同业务逻辑下的枚举类来说,手动为每一个都编写 TypeHandler 显得繁琐而低效。因此,MyBatis-Plus 提供了一种更为便捷的做法——只需声明要扫描的目标包路径,则系统会自动完成剩余工作: ```yaml mybatis-plus: type-enums-package: com.example.enums,com.anotherpackage.enums ``` 上述配置意味着任何位于这些目录及其子目录下定义过的枚举都会被纳入考虑范围之内,并为其生成相应的适配器以便顺利参与到 SQL 执行过程中去[^3]。 #### 测试验证 最后可以通过简单的单元测试来检验整个流程是否正常运作。下面给出一段基于 JUnit 编写的简单例子用来展示向表里新增一条记录的过程: ```java @Test void testInsertUserInfo() { UserInfo userInfo = new UserInfo(); userInfo.setAge(22); userInfo.setName("张三"); userInfo.setSex(SexEnum.MALE); int result = userInfoMapper.insert(userInfo); assertEquals(1, result); // 断言影响行数应等于1 System.out.println("Inserted user info: " + userInfo); } ``` 这段代码创建了一个新的用户信息对象并将之保存到了持久层中,同时打印出了刚插入的数据详情以供后续调试分析所用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值