zoukankan      html  css  js  c++  java
  • 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


        
       

  • 相关阅读:
    box-sizing
    js词法作用域
    焦点轮播图
    绑定事件统一方法
    自动展示收起广告功能
    使用js实现瀑布流
    回到顶部效果
    电商网站的放大镜功能
    CSS清除浮动
    CSS的水平居中和垂直居中方式
  • 原文地址:https://www.cnblogs.com/shuaifing/p/9330913.html
Copyright © 2011-2022 走看看