Mybatis下基于注解的Enum类型直接存储与读写

本文介绍了如何在Mybatis中使用注解处理Enum类型,直接存储和读取。通过EnumTypeHandler和EnumOrdinalTypeHandler,可以将Enum按String或ordinal存储为varchar和int。示例包括Enum类、Entity类、Mapper类的配置以及Handler的注册,讲解了如何替换为EnumOrdinalTypeHandler以存储Enum的顺序值。

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

Mybatis下基于注解的Enum类型直接存储与读写

背景知识

做业务时,有些常见属性会存成Enum类型,便于代码复用,比如性别male,female,other,nolimit。当这些属性需要存储到DB中时,我们可能会为Enum指定code,name这样的属性,再将code按照int,name按照varchar存储。读写的时候再进行转换。

实际上,mybatis默认的handler中已经提供了不同的解决方案,便于我们直接读写。

mybatis默认提供了两种Enum类型的handler,EnumTypeHandlerEnumOrdinalTypeHandler

  • EnumTypeHandler是将Enum按照String处理,存储为varchar
  • EnumOrdinalTypeHandler是将Enum按照int处理,存储为int(smallint,tinyint也可)

示例代码

Enum类

    public enum Gender{
        male,
        female,
        other,
        umlimit
    }

Entity类

Entity中应该将对应的Filed直接设成Enum。

    @Table(name = "t_people_info")
    public class PeopleInfo{
        ...
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        @Column(name = "gender")
        private Gender gender;

        public Gender getGender(){return gender;}
        public void setGender(Gender gender){this.gender = gender;}
        ...
    }

Mapper类

    public interface PeopleInfoMapper{
        @Insert("INSERT INTO people_info (gender,,...) VALUES (#{gender,javaType=com.aerexu.test.Gender,jdbcType=VARCHAR},....) ")
        int insertPeopleInfo(@Param("gender") Gender gender,...);

        @Select("SELECT (id,gender,...) WHERE id=#{id}")
        @Results(value = {
            @Result(column = "id", property = "id", jdbcType = JdbcType.BIGINT, javaType = Long.class),
            @Result(column = "gender", property = "gender",jdbcType = JdbcType.VARCHAR, javaType = Gender.class)
        })
        PeopleInfo selectPeopleInfo(@Param("id") long id);
    }

Handler注册

声明和定义好相关的类和接口之后,需要将Handler和定义的Enum对应起来,需要在SqlSessionFactory中进行注册。

    @PostConstruct
    @Autowired
    private void specialTypeHandlerRegistry(SqlSessionFactory sqlSessionFactory) {
        TypeHandlerRegistry typeHandlerRegistry = sqlSessionFactory.getConfiguration().getTypeHandlerRegistry();
        typeHandlerRegistry.register(Gender.class, JdbcType.VARCHAR, EnumTypeHandler.class);
    }

替换为EnumOrdinalTypeHandler

如果想让Enum在数据库中存储的是数字而不是字符串,仅需将上述的JdbcType.VARCHAR替换为JdbcType.TINYINT,并将EnumTypeHandler.class替换为EnumOrdinalTypeHandler.class

Extra

Java中Enum类

Enum是默认提供了name()ordinal()两个方法的,分别对应了Enum示例的名字(声明的全小写)和顺序(从0开始计数)。Mybatis的Enum默认的handler分别对应这两种情形。

Mybatis的handler注册

Mybatis在读取数据进行javaType和jdbcType的转换时,是各个预先映射好的handler处理的。映射信息存储在TypeHandlerRegistry类的TYPE_HANDLER_MAP中,其定义为Map<Type, Map<JdbcType, TypeHandler<?>>>。可见,Typehandler是javaType和jdbcType唯一映射的。当有一些自己定义的javaType或者Typehandler时,mybatis并不会初始化映射关系,必须由代码主动注册。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值