mybatis:typeHandler自定义

1 配置文件添加typeHandler
2 写一个自定义的typeHandler,实现TypeHandler接口。或者继承BaseTypeHandler
3 添加自定义枚举


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

步骤:

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

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

 

@MappedTypes({String[].class})  

@MappedJdbcTypes({JdbcType.VARCHAR})  

public class StringArrayTypeHandler implements TypeHandler<String[]> {  }

   

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

 

测试全局配置EnumTypeHandler

 <!--类型处理器
    我们可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。
    • 步骤:
    • 1)、实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
    • 2)、指定其映射某个JDBC类型(可选操作)
    • 3)、在mybatis全局配置文件中注册

    <typeHandlers>
        <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/>
    </typeHandlers>
    -->
    <typeHandlers>
        <typeHandler handler="com.mybatis.typeHandler.MyEmpStatusTypeHandler" javaType="com.mybatis.entity.EmpStatus"/>
    </typeHandlers>

测试参数位置设置自定义TypeHandler

<insert id="addEmployee" parameterType="com.mybatis.entity.Employee" databaseId="oracle">
        <selectKey keyProperty="id" order="BEFORE" resultType="Integer">
            select seq_employee.nextval from  dual
            <!-- AFTER:
			 select seq_employee.currval from dual -->
        </selectKey>


        insert into tb_employee(id,last_name,email,gender,empStatus)
        values
        (#{id},#{lastName},#{email,jdbcType=NULL},#{gender,jdbcType=NULL},#{empStatus,typeHandler=com.mybatis.typeHandler.MyEmpStatusTypeHandler})

        <!-- AFTER:
		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)
		values(seq_employee.nextval,#{lastName},#{email}) -->
    </insert>

自定义的typeHanlder

package com.mybatis.typeHandler;

import com.mybatis.entity.EmpStatus;
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;

/**
 * Created by admin on 2019/7/25 17:16
 *
 * @Author: created by admin
 * @Date: created in 17:16 2019/7/25
 * @param: bindingResult
 * @param: result
 * @return:
 * @throws:
 * @Description:
 * @version:
 */

public class MyEmpStatusTypeHandler implements TypeHandler<EmpStatus> {
    @Override
    public void setParameter(PreparedStatement ps, int i, EmpStatus parameter, JdbcType jdbcType) throws SQLException {
        System.out.println("要保存的状态码:"+parameter.getCode());
        ps.setString(i, parameter.getCode());
    }

    @Override
    public EmpStatus getResult(ResultSet rs, String columnName) throws SQLException {
        String code = rs.getString(columnName);
        //根据数据库中的code值返回枚举对象
        System.out.println("从数据库中获取的状态码:"+code);
        EmpStatus status = EmpStatus.getEmpStatusByCode(code);

        return status;
    }

    @Override
    public EmpStatus getResult(ResultSet rs, int columnIndex) throws SQLException {
        String code = rs.getString(columnIndex);
        System.out.println("从数据库中获取的状态码:"+code);
        EmpStatus status = EmpStatus.getEmpStatusByCode(code);
        return status;
    }

    @Override
    public EmpStatus getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String code = cs.getString(columnIndex);
        System.out.println("从数据库中获取的状态码:"+code);
        EmpStatus status = EmpStatus.getEmpStatusByCode(code);
        return status;
    }
}

 

枚举类


public enum EmpStatus {
    LOGIN("100","登录成功"),LOGOUT("200","登录失败"),REMOVE("300","退出登录");

    private String code;
    private String msg;

    EmpStatus() {
    }

    EmpStatus(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }


    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public static EmpStatus getEmpStatusByCode(String code) {
        switch (code) {
            case "100":
                return LOGIN;
            case "200":
                return LOGOUT;
            case "300":
                return REMOVE;
            default:
               return LOGOUT;
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值