用途:POJO对象可以是任何类型,List,Map等等,转换为json字符串存储到数据库,查询出来的时候自动转换为相应的对象,而非人工操作转换,直接贴上代码如下:
package com.xyy.typehandler; import java.io.IOException; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonTypeHandler<T> extends BaseTypeHandler<T> { private final static Log log = LogFactory.getLog(JsonTypeHandler.class); private static ObjectMapper objectMapper; private Class<T> type; static { objectMapper = new ObjectMapper(); } public JsonTypeHandler(Class<T> type) { if (log.isTraceEnabled()) { log.trace("JsonTypeHandler(" + type + ")"); } if (type == null) { throw new IllegalArgumentException("Type argument cannot be null"); } this.type = type; } private T parse(String json) { try { if (json == null || json.length() == 0) { return null; } return objectMapper.readValue(json, type); } catch (IOException e) { throw new RuntimeException(e); } } private String toJsonString(Object obj) { try { return objectMapper.writeValueAsString(obj); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { return (T) parse(rs.getString(columnName)); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return (T) parse(rs.getString(columnIndex)); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return (T) parse(cs.getString(columnIndex)); } @Override public void setNonNullParameter(PreparedStatement ps, int columnIndex, T parameter, JdbcType jdbcType) throws SQLException { ps.setString(columnIndex, toJsonString(parameter)); } }