数据库中某个字段的列类型是json类型。
java类中某个属性是String类型。
在项目工程里加入下面这个:
/**
*这个类的第一个方法是对预处理语句(PreparedStatement)设置参数,之后的三个函数都是从ResultSet或*者用于执行存储过程的CallableStatement语句中获取String类型的数值,用于向Sring类型的
*Java字段赋值。
*这个Handler继承的BaseTypeHandler是个泛型类,其他的TypeHandler也是通过继承这个抽*象类,实现其中的抽象方法,实现类型转换的工作。
*
*参考链接:https://www.imooc.com/article/18514
*
*
/
public class JsonStringToStringTypeHandler extends BaseTypeHandler<String> {
private Gson gson = new Gson();
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int columnIndex, String parameter, JdbcType jdbcType)
throws SQLException {
preparedStatement.setString(columnIndex, gson.toJson(parameter));
}
@Override
public String getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
return deserialize(resultSet.getString(columnName));
}
@Override
public String getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
return deserialize(resultSet.getString(columnIndex));
}
@Override
public String getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
return deserialize(callableStatement.getString(columnIndex));
}
private String deserialize(final String json) {
return gson.fromJson(json, String.class);
}
}
然后在xml中加入:
<foreach collection="xxxxList" item="item" open="(" separator="or" close=")">
JSON_CONTAINS(数据库json类型字段的名,
#{传进来的参数, typeHandler=com.xx.xxx.JsonStringToStringTypeHandler},'$')
</foreach>
也可以配置成:
<typeHandlers>
<typeHandler handler="com.xxxx.xxx.xxxxTypeHandler"/>
</typeHandlers>