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. Google mobile test

    1. 现已更新至3.0+版本: 2. 应对版本频繁的迭代更新,进行[版本监控.持续更新.反馈,开发的单元测试] 1. 多关注金字塔的底层: 2. [集成测试, Espresso, EarlGrey] ...

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

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

  3. XML(一)XML大揭秘

    前言 每天都要学习很多新的知识,比你厉害的程序员比你还努力,那你混的下这口饭吗?所以不抱怨,坚持!接下来给大家分享的是xml.可能很多做开发的都遇到过xml, 比如maven,各种框架的配置文件都有, ...

  4. Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

    弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了 ...

  5. Linux下gdb的安装及使用入门

    1.安装gdb. 在root用户权限下: root@iZ2zeeailqvwws5dcuivdbZ:~# apt-get update ...... ...... ...... root@iZ2zee ...

  6. Spring框架学习笔记(6)——bean的继承与依赖

    一.bean的继承 Spring通过bean标签的parent属性来实现bean的继承,这个继承的概念只存在于配置层面,也就是说bean只会继承其父bean的属性值. 父bean可以通过abstrac ...

  7. UEP-confirm和alert弹窗

    function stuDel(){ var ds = ajaxgrid.getCheckedRecords(); if(ds.length==0){ $.alert("提示信息" ...

  8. python网络编程基础

    一.客户端/服务器架构 网络中到处都应有了C/S架构,我们学习socket就是为了完成C/S架构的开发. 二.scoket与网络协议 如果想要实现网络通信我们需要对tcpip,http等很多网络知识有 ...

  9. POJ 1422 Air Raid

    题目链接: http://poj.org/problem?id=1422 Description Consider a town where all the streets are one-way a ...

  10. Spark算子--SortByKey

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/076a31e7caab1316b07990c02ac65e9c.html  SortByKey--Transf ...