知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型

应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类

状态码,直接赋值给对象,存入数据库

从数据中,查询状态码,利用自定义的类型处理器,得到对应的枚举类=》进而得到到的枚举类,状态对应的含义(如emp.getEmpsStatus().getMsg(),代码中有详细含义)

(1)实体类和枚举类

Employee.java:

public class Employee {
    
    private Integer id;
    private String lastName;
    private String email;
    private String gender;
    //员工状态
    private EmpsStatus empStatus=EmpsStatus.LOGINOUT;//默认给员工未登录状态

public EmpsStatus getEmpsStatus() {
        return empStatus;
    }
    public void setEmpsStatus(EmpsStatus empsStatus) {
        this.empStatus = empsStatus;
    }

EmpsStatus.java:

/*
 *
 * 保存数据库100,200,状态吗,不是默认的0,或者枚举名
 * */
public enum EmpsStatus {
    
    LOGIN(100,"用户登录"),LOGINOUT(200,"用户退出"),REMOVE(300,"用户不存在");
    
    private Integer code;
    private String msg;

private EmpsStatus(Integer code,String msg) {
        this.code=code;
        this.msg=msg;
    }

public Integer getCode() {
        return code;
    }

public void setCode(Integer code) {
        this.code = code;
    }

public String getMsg() {
        return msg;
    }

public void setMsg(String msg) {
        this.msg = msg;
    }
    
    //按照状态码返回枚举对象
    public static EmpsStatus getEmpStatusByCode(Integer code){
        switch (code) {
        case 100:
            return LOGIN;
        case 200:
            return LOGINOUT;
        case 300:
            return REMOVE;
        default:
            return LOGINOUT;
        }
    }

(2)自定义类型处理器MyEnumEmpStatusTypeHandler实现TypeHandler,接口

/*
 * 实现TypeHandler,或者继承BaseTypeHandler
 *
 * */
public class MyEnumEmpStatusTypeHandler implements TypeHandler<EmpsStatus>{//EmpsStatus为要处理的枚举类型

/*
     * 定义当前数据如何保存到数据库中
     * */
    @Override
    public void setParameter(PreparedStatement ps, int i, EmpsStatus parameter,
            JdbcType arg3) throws SQLException {
        // TODO Auto-generated method stub
        System.out.println("要保存的状态码"+parameter.getCode());
         ps.setString(i, parameter.getCode().toString());//设置状态码
    }
    
    
    @Override
    public EmpsStatus getResult(ResultSet rs, String columnName)
            throws SQLException {
        //需要根据从数据库拿到的枚举的状态码返回一个枚举对象
        int code=    rs.getInt(columnName);
        System.out.print("从数据库中获得的状态码"+code);
        EmpsStatus status=EmpsStatus.getEmpStatusByCode(code); //处理返回参数的枚举类型的状态码,根据状态码返回对应的枚举
        return status;
    }

@Override
    public EmpsStatus getResult(ResultSet rs, int columnIndex) throws SQLException {
        // TODO Auto-generated method stub
          int code=    rs.getInt(columnIndex);
            System.out.print("从数据库中获得的状态码"+code);
            EmpsStatus status=EmpsStatus.getEmpStatusByCode(code);
            return status;
    }

@Override
    public EmpsStatus getResult(CallableStatement cs, int columnIndex)//处理存储过程结果集
            throws SQLException {
            int code=    cs.getInt(columnIndex);
            System.out.print("从数据库中获得的状态码"+code);
            EmpsStatus status=EmpsStatus.getEmpStatusByCode(code);
            return status;
    }
}

(3)在配置文件mybatis-config.xml中配置自定义的类型处理器,下面两种实现方案都行

<configuration>

<typeHandlers>
     <!-- 1.配置我们自定义的TypeHandler -->
    <typeHandler handler="com.agesun.mybatis.typehandler.MyEnumEmpStatusTypeHandler" javaType="com.agesun.mybatis.bean.EmpsStatus"/>
     <!-- 2.也可以在处理某个字段的时候告诉Mybatis用什么类型处理器
                                         保存:#{empStatus,typeHandler=xxxx} //如values(..{empsStatus,typeHandler=com.agesun.mybatis.typehandler.MyEnumEmpStatusTypeHandler})全类名
                查询:
                    <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmp">
                         <id column="id" property="id"/>
                         <result column="empStatus" property="empStatus" typeHandler=""/>//如typeHandler="com.agesun.mybatis.typehandler.MyEnumEmpStatusTypeHandler"
                     </resultMap>
                注意:如果在参数位置修改TypeHandler,应该保证保存数据和查询数据用的TypeHandler是一样的。 -->
    </typeHandlers>

</configuration>

(4)测试类

@Test
    public void testEnum()throws IOException{
        SqlSessionFactory sqlSessionFactory= getSqlSessionFactory();
        SqlSession openSession= sqlSessionFactory.openSession();
        
        try{
           EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);
           Employee employee=new Employee("test_enum","enum@agesun.com","1");//该方法默认赋值退出状态,实际应用中,可以直接给employee,set一个状态码到数据库
           mapper.addEmp(employee);
           System.out.println("保存成功!"+employee.getId());
           
           Employee emp=mapper.getEmpById(employee.getId());
           System.out.println(emp.getLastName());
           System.out.println(emp.getEmpsStatus());//返回对应的枚举的类型
            /*openSession.commit();*/
        }finally{
            openSession.close();
        }
    }

源码:https://github.com/shuaishuaihand/enumdemo.git

Mybatis中使用自定义的类型处理器处理枚举enum类型的更多相关文章

  1. [转]Java中实现自定义的注解处理器

    Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...

  2. 使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型字段

    业务扩展字段在PostgreSQL数据库中经常会使用json格式的数据来存储,然而mybatis默认是没有实现json类型字段对应的TypeHandler,所以一般我们需要自定义mybatis的Typ ...

  3. 枚举类型与位域枚举Enum

    一.概述 定义一个值类型,其中包含固定值集合.枚举类型变量可以是此集合中的任意一个或多个值.枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚 ...

  4. 浩哥解析MyBatis源码(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...

  5. 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

  6. MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

  7. MyBatis源码解析(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...

  8. Mybatis中常用的SQL

    1.BaseResultMap <resultMap id="BaseResultMap" type="com.stylefeng.guns.common.pers ...

  9. Mybatis中的大于等于和小于等于

    mybatis中可以直接使用>或<:但是不能直接使用>=或<=; 第一种写法(1): 原符号 < <= > >= & ' " 替换符号 ...

随机推荐

  1. 【Python数据挖掘】决策树、随机森林、Bootsing、

    决策树的定义 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别. ...

  2. python [:-1] 与 [::-1]

    line = "abcde"line[:-1]结果为:'abcd' line = "abcde"line[::-1]结果为:'edcba' [:-1] b = ...

  3. Python并行编程(二):基于线程的并行

    1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...

  4. 6.Git代码回滚

    1.代码修改并提交 我们已经成功地添加并提交了一个helloWorld.txt文件,现在,是时候继续工作了. 于是,我们继续修改helloWorld.txt文件,改成如下内容: $ vi helloW ...

  5. 为CSDN博客添加打赏功能

    随着移动支付在国内的兴起,越来越多的付费内容越多如雨后春笋般的冒了出来.其中以<逻辑思维>.罗振宇.李笑来为主要代表作品和人物. 现在很多博客或者个人网站里面都有打赏功能,这算是对博主的劳 ...

  6. Mybatis框架学习总结-表的关联查询

    一对一关联 创建表和数据:创建一张教师表和班级表,这里假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIM ...

  7. 图解Python可以做些什么

    Python具有简单.易学.免费.开源.可移植.可扩展.可嵌入.面向对象等优点,它的面向对象甚至比java和C#.net更彻底. 作为一种通用语言,Python几乎可以用在任何领域和场合,角色几乎是无 ...

  8. spring MVC中的异常统一处理

    1.spring MVC中定义了一个标准的异常处理类SimpleMappingExceptionResolver 该类实现了接口HandlerExceptionResolver 2.看下SimpleM ...

  9. Hadoop2.7.3+spark2.1.0+hbase0.98分布式集群部署

    运行环境配置(10.79.115.111-114) 1.关闭防火墙与selinux 关闭防火墙: CentOS 7.x默认使用的是firewall作为防火墙. systemctl stop firew ...

  10. 模块讲解----shutil模块(copy、压缩、解压)

    作用与功能 主要用于文件的copy,压缩,解压 导入shuitl模块: import shutil copy方法 1.shutil.copyfileobj()  打开file1,并copy写入file ...