Mybatis下基于注解的Enum类型直接存储与读写
来源:互联网 发布:linux apt get search 编辑:程序博客网 时间:2024/05/21 17:22
Mybatis下基于注解的Enum类型直接存储与读写
背景知识
做业务时,有些常见属性会存成Enum类型,便于代码复用,比如性别male,female,other,nolimit。当这些属性需要存储到DB中时,我们可能会为Enum指定code,name这样的属性,再将code按照int,name按照varchar存储。读写的时候再进行转换。
实际上,mybatis默认的handler中已经提供了不同的解决方案,便于我们直接读写。
mybatis默认提供了两种Enum类型的handler,EnumTypeHandler
和EnumOrdinalTypeHandler
。
- 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并不会初始化映射关系,必须由代码主动注册。
- Mybatis下基于注解的Enum类型直接存储与读写
- Mybatis的Enum类型转换器
- Mybatis基于enum的开发
- 基于注解的mybatis
- 基于注解的mybatis
- 基于注解的mybatis
- 基于注解的mybatis
- springmvc+mybatis下基于注解的Atomikos分布式事务配置
- mybatis处理enum类型
- java基于poi的excel表格处理(自定义注解、针对List与enum进行处理)
- J2EE项目使用自定义注解实现基于SpringMVC + Mybatis + Mysql的读写分离
- java enum与int类型的转换
- 基于mybatis+spring的读写分离
- 基于注解的mybatis和spring整合
- 基于注解配置简单的SpringMVC+Mybatis
- 基于注解的mybatis和spring整合
- 基于注解的Mybatis mapper 接口注意事项
- 基于注解的mybatis和spring整合
- zookeeper系列学习——(1)zookeeper的简单介绍
- 欢迎使用CSDN-markdown编辑器
- python常见库的安装(填lxml库安装的坑)
- 11A查闰年
- 流传的故事
- Mybatis下基于注解的Enum类型直接存储与读写
- java代码实现ping命令(支持linux系统)
- 开发记录————web uploader
- 如何选择合适IPC方式
- 使用QDir::entryList获取文件列表,返回为空
- Patching Array
- 利用C#语言实现小闹钟
- (MyEclipse)java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver/com.mysql.jdbc.Driver
- mvn deploy命令上传包