1、类型处理器(TypeHandler)
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
通过类型处理器(TypeHandler),可以实现javaBean以某种方式存入数据库中,抑或是从数据库取出的数据如何映射为javaBean。
通过继承BaseTypeHandler类,我们可以定制这个类型处理器,已实现枚举类或是一个javaBean的存取和写入。
2、枚举类
示例:
@Getter
public enum SexEnum {
MALE(1,"男"),
FAMALE(0,"女");
private Integer sex;
private String sexName;
SexEnum(Integer sex,String sexName){
this.sex = sex;
this.sexName = sexName;
}
/*为了获取枚举中的值*/
private static Map<Integer, SexEnum> sexEnumMap = new HashMap<>();
static {
for (SexEnum sexEnum : SexEnum.values()) {
sexEnumMap.put(sexEnum.getSex(), sexEnum);
}
}
/**
*
* @Title: getSexEnumByKey
* @Description: 依据key获取枚举
* @param sex
* @return
*/
public static SexEnum getSexEnumBySex(Integer sex) {
return sexEnumMap.get(sex);
}
3、实体类
@Data
public class User {
private Long uid;
private String name;
/*mybatis如果需要使用枚举*/
private SexEnum sex;
private Integer age;
private String email;
private Integer is_deleted;
}
4、枚举类处理器
public class SexEnumHandler extends BaseTypeHandler<SexEnum> {
/**
* 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型
*/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, SexEnum sexEnum, JdbcType jdbcType) throws SQLException {
// baseTypeHandler已经帮我们做了parameter的null判断
// 第二个参数 : 存入到数据库中的值
System.out.println(sexEnum.getSex());
preparedStatement.setInt(i, sexEnum.getSex());
}
/**
* 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型
*/
@Override
public SexEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
// 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
int sex = resultSet.getInt(s);
if (resultSet.wasNull()) {
return null;
} else {
// 根据数据库中的sex值,定位SexEnum子类
return SexEnum.getSexEnumBySex(sex);
}
}
/**
* 用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型
*/
@Override
public SexEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
// 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
Integer sex = resultSet.getInt(i);
if (resultSet.wasNull()) {
return null;
} else {
// 根据数据库中的key值,定位SexEnum子类
return SexEnum.getSexEnumBySex(sex);
}
}
/**
* 用定义调用存储过程后,如何把数据库类型转换为对应的Java类型
*/
@Override
public SexEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
// 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型
Integer sex = callableStatement.getInt(i);
if (callableStatement.wasNull()) {
return null;
} else {
// 根据数据库中的key值,定位SexEnum子类
return SexEnum.getSexEnumBySex(sex);
}
}
}
5、配置枚举类
mybatis:
type-handlers-package: com.test.handler
评论区