MyBatis的BaseTypeHandler用法
有时候我们库里面存的是以逗号分隔的字符串,但返回出去需要成为一个list,若在业务代码中每次都去单独处理会很繁琐,那么我们就可以用BaseTypeHandler统一处理,当然我们也可以用来做一些字段的加密解密过程。
- 自定义处理器,将表里逗号分隔的字符串转为 Entity 的字符串数组;将Entity 的字符串数组转为表里逗号分隔的字符串
public class StringListTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.join(",", parameter));
}
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String str = rs.getString(columnName);
if (rs.wasNull() || StringUtils.isEmpty(str))
return Collections.emptyList();
return Arrays.asList(str.split(","));
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String str = rs.getString(columnIndex);
if (rs.wasNull() || StringUtils.isEmpty(str))
return Collections.emptyList();
return Arrays.asList(str.split(","));
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String str = cs.getString(columnIndex);
if (cs.wasNull() || StringUtils.isEmpty(str))
return Collections.emptyList();
return Arrays.asList(str.split(","));
}
}
- 自定义处理器,将表里逗号分隔的字符串转为 Entity 的字符串数组;将Entity 的字符串数组转为表里逗号分隔的字符串
public class StringMapTypeHandler extends BaseTypeHandler<Map<String, String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map<String, String> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, FastJsonConvertUtil.convertObjectToJSON(parameter));
}
@Override
public Map<String, String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String str = rs.getString(columnName);
if (rs.wasNull() || StringUtils.isEmpty(str))
return Collections.emptyMap();
return FastJsonConvertUtil.convertJSONToObject(str, Map.class);
}
@Override
public Map<String, String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String str = rs.getString(columnIndex);
if (rs.wasNull() || StringUtils.isEmpty(str))
return Collections.emptyMap();
return FastJsonConvertUtil.convertJSONToObject(str, Map.class);
}
@Override
public Map<String, String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String str = cs.getString(columnIndex);
if (cs.wasNull() || StringUtils.isEmpty(str))
return Collections.emptyMap();
return FastJsonConvertUtil.convertJSONToObject(str, Map.class);
}
}
- 然后在properties配置文件中配置handler所在的包路径
mybatis.type-handlers-package=cn.wangoon.fd.tracking.management.console.mybatis.type.handler
- 在mapper里的使用,加上@Results注解。(注意我这里用的是注解方式,xml方式有所不同)
@Select("<script> " +
"select appId,appName,ips,members,owner from t_application " +
"<where>" +
"<if test=\"applicationMeta.appId != null\" > and appId = #{applicationMeta.appId} </if>" +
"<if test=\"applicationMeta.appName != null and applicationMeta.appName !=''\" > and appName = #{applicationMeta.appName} </if>" +
"<if test=\"applicationMeta.owner != null and applicationMeta.owner !=''\" > and owner = #{applicationMeta.owner} </if>" +
"</where> order by createTime desc limit #{curIndex},#{pageSize}" +
"</script> ")
@Results({
@Result(property = "ips", column = "ips", jdbcType = JdbcType.VARCHAR, typeHandler = StringListTypeHandler.class),
@Result(property = "members", column = "members", jdbcType = JdbcType.VARCHAR, typeHandler = StringListTypeHandler.class),
})
List<ApplicationMeta> query(@Param("applicationMeta") ApplicationMeta applicationMeta, @Param("curIndex") int curIndex, @Param("pageSize") int pageSize);