Mybatis — 自定义类型转换
前言
在进行数据库增删改查
的时候,因为实体类类型
和数据库类型
不兼容,或者说Mybatis自带的类型转换
不够用了,这时候就要自己手动操作了,最常见的就是素组
的的操作,根据原有的进行扩展,这样就不用定义一个数组属性,就写一次转换方法。
接口
原生接口org.apache.ibatis.type.TypeHandler<T>
public interface TypeHandler<T> {
/**
用来设置查询参数
*/
void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
/**
用来将查询结果转换成指定实体类,依旧是返回结果的列名
*/
T getResult(ResultSet rs, String columnName) throws SQLException;
/**
用来将查询结果转换成指定实体类,依旧是返回结果列的顺序号
*/
T getResult(ResultSet rs, int columnIndex) throws SQLException;
/**
用来将查询结果转换成指定实体类,依旧是返回结果列的顺序号,
只是使用了不同的返回接收接口,写过原生jdbc的应该有印象
*/
T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
也可以使用继承的方式扩展,我这里是直接继承 org.apache.ibatis.type.TypeReference<T>
,这个可以省很多事情
public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {
protected Configuration configuration;
public void setConfiguration(Configuration c) {
this.configuration = c;
}
public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
if (jdbcType == null) {
throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
}
try {
ps.setNull(i, jdbcType.TYPE_CODE);
} catch (SQLException e) {
throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " +
"Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " +
"Cause: " + e, e);
}
} else {
setNonNullParameter(ps, i, parameter, jdbcType);
}
}