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. curl -windows下接口通讯

    1,下载curl -----url命令传输工具 2,配置curl环境变量 3,在cmd环境中使用   举例:curl -G http://xxxxxxx.com?+参数 使用:curl -G &quo ...

  2. Box布局

    import sys from PyQt4 import QtCore, QtGui class MainWindow(QtGui.QWidget): def __init__(self, paren ...

  3. Python 调用让系统自动调用默认程序打开文件?

    windows上可以使用os.startfile os.startfile(file) linux上可以使用xdg-open subprocess.call(["xdg-open" ...

  4. Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...

  5. 用call和ret实现子程序

    ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作.具体的原理如下: ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器) call s的操作相当于: ...

  6. python开发_python中str.format()

    格式化一个字符串的输出结果,我们在很多地方都可以看到,如:c/c++中都有见过 下面看看python中的字符串格式函数str.format(): 1 #使用str.format()函数 2 3 #使用 ...

  7. Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解

    视频目标跟踪问题分析         视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...

  8. Erlang epmd官方文档中文翻译

    本文含epmd简介及官方文档之翻译,文档地址 http://erlang.org/doc/man/epmd.html翻译时的版本 R19.1 中英文水平都不咋地,不通顺处海涵,就酱. 简介 Erlan ...

  9. 使用 webpack + react + redux + es6 开发组件化前端项目

    因为最近在工作中尝试了 webpack.react.redux.es6 技术栈,所以总结出了一套 boilerplate,以便下次做项目时可以快速开始,并进行持续优化.对应的项目地址:webpack- ...

  10. 【转载】Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...