mybatis自定义typehandler(枚举实战)

我们可以通过自定义TypeHandler的形式来在设置参数或者取出结果集的时候自定义参数封装策略。

步骤:

1、实现TypeHandler接口或者继承BaseTypeHandler

2、使用@MappedTypes定义处理的java类型 使用@MappedJdbcTypes定义jdbcType类型

3、在自定义结果集标签或者参数处理的时候声明使用自定义 TypeHandler进行处理 或者在全局配置TypeHandler要处理的javaType

事例,部门状态的枚举类

一个代表部门状态的枚举类:

/**
 * 希望数据库保存的是100,200这些状态码,而不是默认0,1或者枚举的名
 *
 */
public enum EmpStatus {
    LOGIN(100,"用户登录"),LOGOUT(200,"用户登出"),REMOVE(300,"用户不存在");
    
    
    private Integer code;
    private String msg;
    private EmpStatus(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 EmpStatus getEmpStatusByCode(Integer code){
        switch (code) {
            case 100:
                return LOGIN;
            case 200:
                return LOGOUT;  
            case 300:
                return REMOVE;
            default:
                return LOGOUT;
        }
    }
    
    
}

自定义TypeHandler

/**
 * 1、实现TypeHandler接口。或者继承BaseTypeHandler
 *
 */
public class MyEnumEmpStatusTypeHandler implements TypeHandler<EmpStatus> {
​
    /**
     * 定义当前数据如何保存到数据库中
     */
    @Override
    public void setParameter(PreparedStatement ps, int i, EmpStatus parameter,
            JdbcType jdbcType) throws SQLException {
        // TODO Auto-generated method stub
        System.out.println("要保存的状态码:"+parameter.getCode());
        ps.setString(i, parameter.getCode().toString());
    }
​
    @Override
    public EmpStatus getResult(ResultSet rs, String columnName)
            throws SQLException {
        // TODO Auto-generated method stub
        //需要根据从数据库中拿到的枚举的状态码返回一个枚举对象
        int code = rs.getInt(columnName);
        System.out.println("从数据库中获取的状态码:"+code);
        EmpStatus status = EmpStatus.getEmpStatusByCode(code);
        return status;
    }
​
    @Override
    public EmpStatus getResult(ResultSet rs, int columnIndex)
            throws SQLException {
        // TODO Auto-generated method stub
        int code = rs.getInt(columnIndex);
        System.out.println("从数据库中获取的状态码:"+code);
        EmpStatus status = EmpStatus.getEmpStatusByCode(code);
        return status;
    }
​
    @Override
    public EmpStatus getResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        // TODO Auto-generated method stub
        int code = cs.getInt(columnIndex);
        System.out.println("从数据库中获取的状态码:"+code);
        EmpStatus status = EmpStatus.getEmpStatusByCode(code);
        return status;
    }
​
}
​

mybatis注册/使用自定义TypeHandler

建议使用自定义。

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

使用默认的

​
    <typeHandlers>
        <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.atguigu.mybatis.bean.EmpStatus"/>
    </typeHandlers>    
    // 或者
    
    <typeHandlers>
        <typeHandler handler="org.apache.ibatis.type.EnumTypeHandler" javaType="com.atguigu.mybatis.bean.EmpStatus"/>
    </typeHandlers>    

默认的自动为 枚举的名称:eg:LOGIN

使用:

    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
        select id,last_name lastName,email,gender,empStatus from tbl_employee where id = #{id}
    </select>
        
        
        <!--public Long addEmp(Employee employee);  -->
    <insert id="addEmp" useGeneratedKeys="true" keyProperty="id">
        insert into tbl_employee(last_name,email,gender,empStatus) 
        values(#{lastName},#{email},#{gender},#{empStatus})
    </insert>    
​
public class Employee {
    
    private Integer id;
    private String lastName;
    private String email;
    private String gender;
    //员工状态
    private EmpStatus empStatus=EmpStatus.LOGOUT;
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

航迹者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值