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;
}
}