MyBatis内部提供了两个转化枚举类型的typeHandler给我们使用。

  • org.apache.ibatis.type.EnumTypeHandler 是使用枚举字符串名称作为参数传递的
  • org.apache.ibatis.type.EnumOrdinalTypeHandler 是使用整数下标作为参数传递的

数据库脚CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`gender` int() DEFAULT NULL, --对应Gender枚举类
`hobby` varchar() DEFAULT NULL, --对用Hobby枚举类
`member` int(11) DEFAULT NULL, --对应Member枚举类
`userAge` int(11) DEFAULT NULL,
`userAddress` varchar(200) DEFAULT NULL,
`reg_time` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

创建三个枚举类Gender、Hobby、Member

package com.yihaomen.mybatis.enums;

public enum  Gender {

    MALE(1, "男性"), FEMALE(2, "女性");
private int code;
private String name; Gender(int code, String name) {
this.code = code;
this.name = name;
} public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static Gender getGender(int code) {
for(Gender gender : Gender.values()) {
if(gender.getCode() == code) {
return gender;
}
}
return null;
} }
package com.yihaomen.mybatis.enums;

public enum Hobby {
FOOTBALL(1,"足球"), BASKETBALL(2, "篮球");
private int code;
private String name; Hobby(int code, String name) {
this.code = code;
this.name = name;
} public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} public String getName() {
return name;
} public static Hobby getHobby(int code) {
for(Hobby h : Hobby.values()) {
if(h.getCode() == code) {
return h;
}
}
return null;
} public void setName(String name) {
this.name = name;
}
}
package com.yihaomen.mybatis.enums;

public enum Member {
FATHER(1,"爸爸"), MOTHER(2,"妈妈");
private int code;
private String name; Member(int code, String name) {
this.code = code;
this.name = name;
} public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static Member getMember(int code) {
for(Member member : Member.values()) {
if(member.getCode() == code) {
return member;
}
}
return null;
}
}

写model层

package com.yihaomen.mybatis.model;

import com.yihaomen.mybatis.enums.Gender;
import com.yihaomen.mybatis.enums.Hobby; import java.util.Date; public class User {
private int id;
private String userName;
private String userAge;
private Gender gender;
private Member member;
private Hobby hobby;
private String userAddress;
private Date regTime; setters()&getters()...
}

自定义typeHandler

package com.yihaomen.mybatis.type;

import com.yihaomen.mybatis.enums.Member;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class MyMemberTypeHandler implements TypeHandler<Member> {
public void setParameter(PreparedStatement ps, int i, Member parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getCode());
} public Member getResult(ResultSet rs, String columnName) throws SQLException {
int code = rs.getInt(columnName);
return Member.getMember(code);
} public Member getResult(ResultSet rs, int columnIndex) throws SQLException {
int code = rs.getInt(columnIndex);
return Member.getMember(code);
} public Member getResult(CallableStatement cs, int columnIndex) throws SQLException {
int code = cs.getInt(columnIndex);
return Member.getMember(code);
}
}

  

写DAO层

User.xml

<?xml version="1.0" encoding="UTF-8" ?>
<resultMap id="resultListUser" type="User">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="userAge" property="userAge" />
<!---->
<result column="gender" property="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
<result column="hobby" property="hobby" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
     <result column="member" property="member" typeHandler="com.yihaomen.mybatis.type.MyMemberTypeHandler"/><!--自定义枚举typeHandler-->
<result column="userAddress" property="userAddress" /> <result column="reg_time" property="regTime" javaType="java.util.Date" jdbcType="VARCHAR" typeHandler="com.yihaomen.mybatis.type.MyDateTypeHandler"/> </resultMap> <select id="selectUserById2" parameterType="long" resultMap="resultListUser"> select userName, gender, hobby from user where id = #{id}</select> <insert id="addUser2" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(userName, userAge, gender, hobby, userAddress, reg_time) VALUES(#{userName},#{userAge},#{gender},#{hobby},#{userAddress}, #{regTime,javaType=Date,jdbcType=VARCHAR,typeHandler=com.yihaomen.mybatis.type.MyDateTypeHandler}) </insert>

UserMapper

package com.yihaomen.mybatis.dao;

import com.yihaomen.mybatis.model.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import java.util.List; @Repository
public interface UserMapper {
public List<User> selectUserById2(Long id);
public int addUser2(User user);
}

在configuration.xml注册typeHandler

<typeHandlers>
<typeHandler handler="com.yihaomen.mybatis.type.MyDateTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
javaType="com.yihaomen.mybatis.enums.Gender" />
<typeHandler handler="org.apache.ibatis.type.EnumTypeHandler"
javaType="com.yihaomen.mybatis.enums.Hobby"/>
     <typeHandler handler="com.yihaomen.mybatis.type.MyMemberTypeHandler"
     javaType="com.yihaomen.mybatis.enums.Member"/>
</typeHandlers>

测试一下:

package user;

import com.yihaomen.mybatis.dao.UserMapper;
import com.yihaomen.mybatis.enums.Gender;
import com.yihaomen.mybatis.enums.Hobby;
import com.yihaomen.mybatis.enums.Member;
import com.yihaomen.mybatis.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import java.util.Date;
import java.util.List; /**
*   
*  @ProjectName: springmvc-mybatis 
*  @Description:
*/
public class TestEnumUser extends BaseTest{
public static void main(String[] args) {
// testAddEnum();
testGetEnumUser();
} /**
* 添加
*/
public static void testAddEnum() {
SqlSession sqlSession = null;
try {
SqlSessionFactory sqlSessionFactory = getSession();
sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUserName("小明");
user.setGender(Gender.MALE);
user.setHobby(Hobby.FOOTBALL);
user.setMember(Member.FATHER);
user.setRegTime(new Date());
user.setUserAddress("地球");
user.setUserAge("22");
int result = mapper.addUser2(user);
System.out.println(result);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
} /**
* select
*/
public static void testGetEnumUser() {
SqlSession sqlSession = null;
try {
SqlSessionFactory sqlSessionFactory = getSession();
sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUserById2(11L);
for(User u : users) {
System.out.println(u.getGender());
System.out.println(u.getHobby());
System.out.println(u.getMember());
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
}
}
 

https://gitee.com/huayicompany/springmvc-mybatis.git

参考文献:

[1] 杨开振 著,《深入浅出MyBatis技术原理与实战》, 电子工业出版社,2016.09

mybatis-枚举类型的typeHandler&自定义枚举类型typeHandler的更多相关文章

  1. java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类

    枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...

  2. 自定义枚举 --- Swagger文档展示

    在其它两篇文章中,已经解决的自定义枚举在MyBatis以及Rest接口的转换,但是在Springfox中还存在问题,不能使用code来作为api.本文通过扩展Springfox,实现了对自定义枚举的良 ...

  3. 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)

    1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...

  4. ROS教程4 ROS自定义srv类型及使用

    创建srv文件 在上一节单独为自定义的消息和服务的包 test_msgs 里面 创建 srv文件夹 进入创建 testsrv.srv 文件 ,内容为: (srv文件和msg文件类似,唯一不同的是它包含 ...

  5. Salesforce 自定义元数据类型

    自定义元数据类型的优点 Salesforce中的设定都是以元数据(Metadata)存在的.在Salesforce中,用户可以新建自定义对象.自定义字段等,这些数据结构都以元数据的形式存储在系统中.当 ...

  6. Mybatis中使用自定义的类型处理器处理枚举enum类型

    知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ...

  7. Mybatis实战之自定义TypeHandler处理枚举

    在Mybatis中,处理枚举类的TypeHandler有两个: EnumTypeHandler: 用于保存枚举名 EnumOrdinalTypeHandler: 用于保存枚举的序号. 在实际项目中,以 ...

  8. MyBatis对于Java对象里的枚举类型处理

    平时咱们写程序实体类内或多或少都会有枚举类型属性,方便嘛.但是mybatis里怎么处理他们的增删改查呢? 要求: 插入的时候,会用枚举的定义插入数据库,我们希望在数据库中看到的是数字或者其他东西: 查 ...

  9. 自定义枚举类型的常用操作-附源码(xjl456852原创)

    自定义枚举类型中,假如我们有name和desc这样的属性,并在这个基础上定义了多个对象. 那么就可能用到通过name获取desc,或者通过desc获取name.通过name或者desc获取对应的枚举对 ...

随机推荐

  1. angular4.0微信oAuth第三方认证的正确方式

    当我们的项目运行在微信端时,用到oAuth第三方认证.问题来了,在ng4中微信认证应该放在哪里呢? 开始项目的时候,我将oAuth认证放在了每个页面模版中,发现返回历史页的时候,需要返回两次. 这个问 ...

  2. HTML知识点总结之<a>标签

    HTML是什么? HTML(Hyper Text Markup Language)超文本标记语言,用来描述网页的一种语言.超文本是指网页不止有文本,还可以有图片,链接,视频,音频等非文本元素.标记语言 ...

  3. (5编译使用最新opencv)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html 2环境架设http://www.c ...

  4. 由浅入深SCF无服务器云函数实践

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...

  5. python 列表(list)常用操作

    a = [1,2,3,4,1,1,1,1] 删除操作 删除元素1 a.remove(1) 删除第二个元素 del a[1] 默认删除最后一个,给脚标就会删除指定脚标元素 pop() 方法 a.pop( ...

  6. 五分钟学习React(二):我的第一个Hello World

    我的第一个React应用 接着我们上一期所讲的内容,通过create-react-app脚手架创建的应用,它是基于ES6的语法生成的.我们清空src目录下的文件,并分别创建index.js和index ...

  7. 关于React中状态保存的研究

    在使用react搭配react-router做应用的时候,你可能遇到这样的问题,当我从第一个页面过渡到第二个页面,然后返回之后,发现之前的页面的状态全部不见了,即回到了初始的状态. 这点在页面存在多个 ...

  8. LevelDB的源码阅读(四) Compaction操作

    leveldb的数据存储采用LSM的思想,将随机写入变为顺序写入,记录写入操作日志,一旦日志被以追加写的形式写入硬盘,就返回写入成功,由后台线程将写入日志作用于原有的磁盘文件生成新的磁盘数据.Leve ...

  9. SSH Secure Shell Client最新版,解决Win10不兼容问题

    SSH的工具很多,像XShell,SecureCRT等等. 不过我一直用的是:SSH Secure Shell Client 主要的原因就是: 软件本身带文件浏览的功能,可以通过拖拽去实现文件上传和下 ...

  10. Vue 组件之 Router

    Vue 组件之 Router Vue 开发单页应用的时候,免不了使用Vue组件.在单页应用上如何进行组件切换? 结构如下图所示: 主页面包含Foo组件与Bar组件,在主页面中可以进行Foo与 Bar的 ...