TypeHandler是类型转换器,在mybatis中用于实现java类型和JDBC类型的相互转换。
java类型->jdbc类型:mybatis使用prepareStatement来进行参数设置的时候,需要通过typeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用PrepareStatement不同的set方法实现的;
jdbc类型->java类型:在获取结果返回之后,也需要将返回的结果转换成我们需要的java类型,这时候是通过调用ResultSet对象不同类型的get方法实现的;
所以不同类型的typeHandler其实就是调用PrepareStatement和ResultSet的不同方法来进行类型的转换。
以下是json和string[]的互相转换的实例:
//MyBatis中逆向工程配置文件generatorConfig.xml中设置TypeHandler public class JsonStringArrayTypeHandler extends baseTypeHandler{ private static final ObjectMapper mapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, toJson(parameter)); } @Override public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.toObject(rs.getString(columnName)); } @Override public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.toObject(rs.getString(columnIndex)); } @Override public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.toObject(cs.getString(columnIndex)); } private String toJson(String[] params) { try { return mapper.writevalueAsString(params); } catch (Exception e) { e.printStackTrace(); } return "[]"; } private String[] toObject(String content) { if (content != null && !content.isEmpty()) { try { return (String[]) mapper.readValue(content, String[].class); } catch (Exception e) { throw new RuntimeException(e); } } else { return null; } } }



