Mybatis中使用自定义的类型处理器处理枚举enum类型
知识点:在使用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类型的更多相关文章
- [转]Java中实现自定义的注解处理器
Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...
- 使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型字段
业务扩展字段在PostgreSQL数据库中经常会使用json格式的数据来存储,然而mybatis默认是没有实现json类型字段对应的TypeHandler,所以一般我们需要自定义mybatis的Typ ...
- 枚举类型与位域枚举Enum
一.概述 定义一个值类型,其中包含固定值集合.枚举类型变量可以是此集合中的任意一个或多个值.枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚 ...
- 浩哥解析MyBatis源码(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...
- 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- MyBatis源码解析(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...
- Mybatis中常用的SQL
1.BaseResultMap <resultMap id="BaseResultMap" type="com.stylefeng.guns.common.pers ...
- Mybatis中的大于等于和小于等于
mybatis中可以直接使用>或<:但是不能直接使用>=或<=; 第一种写法(1): 原符号 < <= > >= & ' " 替换符号 ...
随机推荐
- Struts2+Spring3+MyBatis3整合以及Spring注解开发
分类: Web(2) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做一个SpringMVC+spring+MyBatis的项目,突然想起以前自己要搭建一个Struts2+Sprin ...
- 多线程入门-第七章-线程的同步Synchronized
/* 异步编程模型:两个线程执行自己的,互不影响. 同步编程模型:t1和t2执行,t2必须等t1执行结束之后才能执行. 为什么要线程同步? 1.为了数据的安全,尽管应用程序的使用率降低,但是为了保证数 ...
- 多线程入门-第四章-线程的调度与控制之sleep
/* sleep,阻塞当前线程,腾出CPU,让给其他线程 单位是毫秒 静态方法 */ public class ThreadTest04 { public static void main(Strin ...
- Spring Boot 编写入门程序
1. SpringBoot 入门 快速创建独立运行的Spring项目以及与主流框架集成; 使用嵌入式的Servlet容器,应用无需打成WAR包; starters自动依赖与版本控制; 大量的自动配置, ...
- String Problem --- hdu3374(kmp、字典序最大与最小)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意很简单,输出的是最小字典序的编号,最小字典序个数,最大字典序编号,最大字典序个数. 可以想一 ...
- Blue Jeans---poj3080(kmp+暴力求子串)
题目链接:http://poj.org/problem?id=3080 题意就是求n个长度为60的串中求最长公共子序列(长度>=3):如果有多个输出字典序最小的: 我们可以暴力求出第一个串的所有 ...
- 转:docker的核心技术深度剖析
一.docker是什么 Docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Pa ...
- lua在线手册汇总
1. Lua官方参考手册 Lua 4.0 : http://www.lua.org/manual/4.0/Lua 5.0 : http://www.lua.org/manual/5.0/Lua 5.1 ...
- 常用的系统架构 web服务器之iis,apache,tomcat三者之间的比较
常用的系统架构是: Linux + Apache + PHP + MySQL Linux + Apache + Java (WebSphere) + Oracle Windows Server 200 ...
- iOS开发debug集锦
1.添加第三方库时,需要注意使用环境 duplicate symbol _llvm.embedded.module in: /Users/dengw/360Cloud/xcode_code/appli ...