package com.example.demo.handler;
import com.example.demo.common.BaseIntEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.*;
/**
* @Author lyr
* @create 2020/12/19 20:48
*/
@MappedJdbcTypes(JdbcType.INTEGER)
@MappedTypes(BaseIntEnum.class)
// @Component
public class BaseEnumTypeHandler<E extends BaseIntEnum> extends BaseTypeHandler<E> {
/**
* 枚举数组的 类
*/
private final Class<E> enumClazz;
/**
* 枚举数组
*/
private final E[] values;
/**
* 遇到空对象是否设置默认值
*/
private E defaultEnum;
private E codeOf(int code) {
for (E e : values) {
if (e.getValue() == code) {
return e;
}
}
return null;
}
public BaseEnumTypeHandler(Class<E> enumClazz) {
if (enumClazz == null) {
throw new IllegalArgumentException("base enum TypeHandler enum class cannot be null !@!!!");
}
this.enumClazz = enumClazz;
values = enumClazz.getEnumConstants();
if (values!=null && values.length>0) {
defaultEnum = (E)values[0].getValueWhenObjectFieldNull();
// System.out.println(defaultEnum);
}
}
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
// preparedStatement.set
preparedStatement.setInt(i, e.getValue());
}
@Override
public void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (parameter==null)
parameter = defaultEnum;
super.setParameter(ps, i, parameter, jdbcType);
}
/**
* 可以空的对象
*
* @param resultSet
* @param s
* @return
* @throws SQLException
*/
@Override
public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
int code = resultSet.getInt(s);
return resultSet.wasNull() ? defaultEnum : codeOf(code);
}
@Override
public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
int code = resultSet.getInt(i);
return resultSet.wasNull() ? defaultEnum : codeOf(code);
}
@Override
public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
int code = callableStatement.getInt(i);
return callableStatement.wasNull() ? defaultEnum : codeOf(code);
}
}
通用枚举接口
package com.example.demo.common;
/**
* @Author lyr
* @create 2020/12/19 20:37
*/
public interface BaseIntEnum<E extends Enum<E>> {
/**
* 存入数据库的值
* @return
*/
int getValue();
/**
* 当遇到 field 为 null 对象时候,是否设置默认值
* @return
*/
E getValueWhenObjectFieldNull();
/**
* @return 打印的名字
*/
String getDisplayName();
}
例子:
package com.example.demo.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
/**
* @Author lyr
* @create 2020/12/19 20:37
*/
@AllArgsConstructor
@Getter
@ToString
public enum SexIntEnum implements BaseIntEnum<SexIntEnum> {
MAN(1,"男"),
GIRL(0,"女生"),
UNKNOWN(-1,"人妖");
private Integer code;
private String message;
/**
* 存入数据库的值
*
* @return
*/
@Override
public int getValue() {
return code;
}
/**
* 当遇到 null 对象时候,是否设置默认值
*
* @return
*/
@Override
public SexIntEnum getValueWhenObjectFieldNull() {
return UNKNOWN;
}
/**
* @return 打印的名字
*/
@Override
public String getDisplayName() {
return toString();
}
}
配置
<table tableName="t_student" domainObjectName="Student" >
<generatedKey column="student_id" sqlStatement="Mysql" identity="true" />
<columnOverride column="sex" javaType="com.example.demo.common.SexIntEnum" typeHandler="com.example.demo.handler.BaseEnumTypeHandler"/>
</table>
yml demo
mybatis:
mapper-locations: classpath:/mapper/**/*.xml
type-aliases-package: com.example.demo.pojo
configuration:
map-underscore-to-camel-case: true
type-handlers-package: com.example.demo.handler.BaseEnumTypeHandler
Junit demo
@Resource
private StudentMapper studentMapper;
@Test
void iiiii() {
studentMapper.insert(new Student());
}