一、简介

我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是枚举,在DB存储时我们想存的枚举的代号,从DB拿出来时想直接映射成目标枚举类型,也即代号字段与Java枚举类的相互类型转换。

当然,你可以为每个枚举写一个MyEnumTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐。

有了泛型,一个通用的TypeHandler直接搞定。

二、源码

2.1 EnumTypeHandler类

package com.adu.spring_test.mybatis.typehandler;

import java.sql.CallableStatement;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.adu.spring_test.mybatis.util.CodeEnumUtil;

import org.apache.ibatis.type.BaseTypeHandler;

import org.apache.ibatis.type.JdbcType;

import com.adu.spring_test.mybatis.enums.CodeBaseEnum;

/**

* mapper里字段到枚举类的映射。

* 用法一:

* 入库:#{enumDataField, typeHandler=com.adu.spring_test.mybatis.typehandler.EnumTypeHandler}

* 出库:

*

*

*

*

* 用法二:

* 1)在mybatis-config.xml中指定handler:

*

*

*

* 2)在MyClassMapper.xml里直接select/update/insert。

*/

public class EnumTypeHandler & CodeBaseEnum> extends BaseTypeHandler {

private Class clazz;

public EnumTypeHandler(Class enumType) {

if (enumType == null)

throw new IllegalArgumentException("Type argument cannot be null");

this.clazz = enumType;

}

@Override

public void setNonNullParameter(PreparedStatement ps, int i, CodeBaseEnum parameter, JdbcType jdbcType)

throws SQLException {

ps.setInt(i, parameter.code());

}

@Override

public E getNullableResult(ResultSet rs, String columnName) throws SQLException {

return CodeEnumUtil.codeOf(clazz, rs.getInt(columnName));

}

@Override

public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

return CodeEnumUtil.codeOf(clazz, rs.getInt(columnIndex));

}

@Override

public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

return CodeEnumUtil.codeOf(clazz, cs.getInt(columnIndex));

}

}

2.2 CodeBaseEnum类

package com.adu.spring_test.mybatis.enums;

public interface CodeBaseEnum {

int code();

}

2.3 CodeEnumUtil类

package com.adu.spring_test.mybatis.util;

import com.adu.spring_test.mybatis.enums.CodeBaseEnum;

public class CodeEnumUtil {

/**

* @param enumClass

* @param code

* @param

* @return

*/

public static & CodeBaseEnum> E codeOf(Class enumClass, int code) {

E[] enumConstants = enumClass.getEnumConstants();

for (E e : enumConstants) {

if (e.code() == code)

return e;

}

return null;

}

}

mysql 字符串枚举类型转换_MyBatis里字段到枚举类型的转换/映射相关推荐

  1. c mysql 二进制图片,想把二进制数据插入到MYSQL库里,字段为MediumBLOB类型.(存的图片)解决思路...

    当前位置:我的异常网» VB » 想把二进制数据插入到MYSQL库里,字段为MediumBLOB类 想把二进制数据插入到MYSQL库里,字段为MediumBLOB类型.(存的图片)解决思路 www.m ...

  2. Java学习(4)—— 布尔类型、基本数据类型转换、基本数据类型和String类型的转换

    布尔类型 也叫Boolean类型,boolean只允许取true和false. boolean占一个字节. 适用于逻辑运算,流程控制语句. 有默认类型,是false.但是应该声明为成员变量或是静态变量 ...

  3. mysql查询枚举类型转换_zendframework获取数据库中枚举类enum的数据并将其转换成数组...

    在model中建立这样的模型,在其中写入获取枚举类的方法 请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 class Student extends Zend_ ...

  4. mysql字符串转拼音_MySQL中文字段转拼音

    准备:数据库中一下一个表结构 现在要实现对字段 display_name第一个字符转成拼音,即实现字段 pinyin中的效果,可以直接这样 SELECT display_name, ELT(INTER ...

  5. MySQL:修改表名和字段名和类型

    -- 修改表名 rename table old_table to new_table;-- 或者 alter table old_table rename as new_table;-- 修改列名称 ...

  6. mySQL字符串字段区别_MySQL类型之(字符串列类型区分、数据类型区分)

    1.首先CHAR, VARCHAR, TEXT和BINARY, VARBINARY, BLOB的区别: CHAR, VARCHAR, TEXT称为:      非二进制字符串; BINARY, VAR ...

  7. mysql 定义XML字段_MyBatis之基于XML的属性与列名映射

    上一博客主要是对单表的增删改查,比较简单,而且每个属性与table表的列都是一一对应名字也一样,今天主要学习属性与table表列名不一致的处理,主要有两种一是属性与列名不一致,二是枚举的情况,这里暂时 ...

  8. mysql 将字符串转换数字类型的_MySQL 字符串类型用数字可以查出来 MySQL字符串类型会转换成数字 MySQL隐式类型转换...

    一.发现问题 1.在一次MySQL查询中,某字段为 varchar 字符串类型,传入参数值为 int 数字类型,发现查询的结果和预期的不一致. 如: 某两列 name='11' , name = '1 ...

  9. Mysql字符串字段判断是否包含某个字符串的3种方法

    方法一: SELECT * FROM users WHERE emails like "%b@email.com%"; 方法二: 利用MySQL 字符串函数 find_in_set ...

最新文章

  1. 运行NER/formal_bert_lstm_crf.py“ 报错ModuleNotFoundError: No module named ‘keras_contrib‘
  2. 模仿Retrofit封装一个使用更简单的网络请求框架
  3. 帮助你构建自适应布局的30款优秀 jQuery 插件(下篇)
  4. Linux Kbuild文档 1
  5. oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法
  6. 树莓派摄像头基础配置及测试
  7. 阿里晓斌:如何做好技术 Team Leader?
  8. python 装饰器应用
  9. PHP第十次实验总结,The Clean Architecture in PHP 读书笔记(十)
  10. python解析html的库_python自带的用于解析HTML的库HtmlParser
  11. Python程序的执行过程
  12. 如何成都报计算机考试,成都学院2017上半年计算机考试报名通知
  13. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_3_Stream流中的常用方法_filter...
  14. 如何通过百度翻译实现整站网页翻译
  15. cadence ~ PCB排版 必要流程
  16. 输入输出隔离的半/全双工RS-485/RS-422接口隔离芯片电路
  17. OptiFDTD应用:纳米盘型谐振腔等离子体波导滤波器
  18. PMSG孕马血清促性腺激素适用的应用方案
  19. 饥荒启动服务器显示error,Win10电脑运行饥荒游戏提示error during initialization解决方法...
  20. 2022黑马Python学习笔记

热门文章

  1. GraphQL实战经验和性能问题的解决方案
  2. Github 下载项目的某一分支版本
  3. 开发中用到过的技术链接
  4. 排序算法Java实现(快速排序)
  5. Guacamole 介绍以及架构
  6. LeetCode(938)——二叉搜索树的范围和(JavaScript)
  7. Ant-design-vue定制主题色
  8. 小程序本地图片偶尔加载不出来_小程序优化的20中策略
  9. 为什么别的手机都能接收wifi,而红米手机却收不到?
  10. 小学在班里排第几名家长才比较放心?