版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ab7253957/article/details/78870084
业务需求是对字符串数据进行加密后入库,使用类型处理器会有一个短板,即此类型的所有数据都会被自定义的类型处理器进行处理,如果是只对几个特殊字段进行加密,则这种方法是行不通的,本人尝试过自定义类型,可String不能被继承,再者JavaBean要被其他项目引用,自定义类型毕竟不合适,我们这里只介绍一下类型处理器的使用
1.自定义类型处理器实现TypeHandler接口,代码如下,这里的Strings是我自定义的字符串类型,不提倡如此使用
public class StringsTypeHandler implements TypeHandler<Strings> {
@Override
public void setParameter(PreparedStatement ps, int i, Strings parameter, JdbcType jdbcType) throws SQLException {
System.out.println(jdbcType);
if (parameter != null && StringUtils.isNotEmpty(parameter.toString())) {
//加密
String value = CodecUtil.encodeBASE64(parameter.toString());
ps.setString(i, value);
}
}
@Override
public Strings getResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
if (StringUtils.isNotEmpty(value)) {
//解密
value = CodecUtil.decodeBASE64(value);
}
return new Strings(value);
}
@Override
public Strings getResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
if (StringUtils.isNotEmpty(value)) {
//解密
value = CodecUtil.decodeBASE64(value);
}
return new Strings(value);
}
@Override
public Strings getResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
if (StringUtils.isNotEmpty(value)) {
//解密
value = CodecUtil.decodeBASE64(value);
}
return new Strings(value);
}
}
2.在mybatis-config文件中配置
<typeHandlers>
<typeHandler javaType="com.jrq.core.encrypt.Strings" handler="com.jrq.core.encrypt.StringsTypeHandler"/>
</typeHandlers>
Strings对应Java类型,StringsTypeHandler对应类型处理器
现在JavaBean里所有的Strings类型都会被StringsTypeHandler处理