建议你们用新版的mybatis jar包或者mybatis.tk这个。java
实现接口:sql
package com.cnm.filter; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import org.apache.ibatis.type.TypeHandler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @MappedTypes({JSONObject.class}) @MappedJdbcTypes({JdbcType.VARCHAR}) public class FastJsonTypeHandler implements TypeHandler<JSONObject>{ @Override public JSONObject getResult(ResultSet rs, String columnName) throws SQLException { String string = rs.getString(columnName); JSONObject json = JSONObject.parseObject(string); return json; } @Override public JSONObject getResult(ResultSet rs, int columnIndex) throws SQLException { String string = rs.getString(columnIndex); JSONObject json = JSONObject.parseObject(string); return json; } //@param cs 当前的CallableStatement执行后的CallableStatement  public JSONObject getResult(CallableStatement cs, int columnIndex) throws SQLException { String string = cs.getString(columnIndex); JSONObject json = JSONObject.parseObject(string); return json; } /** * 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型 * @param ps 当前的PreparedStatement对象 * @param i 当前参数的位置 * @param parameter 当前参数的Java对象 * @param jdbcType 当前参数的数据库类型 * @throws SQLException */ public void setParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException { if(parameter == null){ ps.setString(i, null); return; } String json = JSON.toJSONString(parameter); ps.setString(i, json); } }
Mapper扫描不到的问题就看最前面写的吧。数据库
直接使用方法 在Mapper文件中配置:apache
<result column="json" property="json" jdbcType="VARCHAR" typeHandler="com.cnm.filter.FastJsonTypeHandler"/>
第二种是在使用的变量后面加json
#{json,typeHandler=com.cnm.filter.FastJsonTypeHandler}
常规配置方法:(旧jar 有bug)mybatis
<typeHandlers> <typeHandler handler="com.cnm.filter.FastJsonTypeHandler" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR"/> </typeHandlers>
配置文件修改后,就能够直接使用,此方法适合新版mybatis,旧的有问题,扫描不上。须要使用反射来进行从新注册。app
Mybatis 经常使用自带集成TypeHeadleride
register(Boolean.class, new BooleanTypeHandler()); register(boolean.class, new BooleanTypeHandler()); register(Byte.class, new ByteTypeHandler()); register(byte.class, new ByteTypeHandler()); register(Short.class, new ShortTypeHandler()); register(short.class, new ShortTypeHandler()); register(Integer.class, new IntegerTypeHandler()); register(int.class, new IntegerTypeHandler()); register(Long.class, new LongTypeHandler()); register(long.class, new LongTypeHandler()); register(Float.class, new FloatTypeHandler()); register(float.class, new FloatTypeHandler()); register(Double.class, new DoubleTypeHandler()); register(double.class, new DoubleTypeHandler()); register(String.class, new StringTypeHandler()); register(String.class, JdbcType.CHAR, new StringTypeHandler()); register(String.class, JdbcType.CLOB, new ClobTypeHandler()); register(String.class, JdbcType.VARCHAR, new StringTypeHandler()); register(String.class, JdbcType.LONGVARCHAR, new ClobTypeHandler()); register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler()); register(String.class, JdbcType.NCHAR, new NStringTypeHandler()); register(String.class, JdbcType.NCLOB, new NClobTypeHandler()); register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler()); register(BigInteger.class, new BigIntegerTypeHandler()); register(BigDecimal.class, new BigDecimalTypeHandler()); register(Byte[].class, new ByteObjectArrayTypeHandler()); register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler()); register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler()); register(byte[].class, new ByteArrayTypeHandler()); register(byte[].class, JdbcType.BLOB, new BlobTypeHandler()); register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler()); register(Object.class, UNKNOWN_TYPE_HANDLER); register(Object.class, JdbcType.OTHER, UNKNOWN_TYPE_HANDLER); register(Date.class, new DateTypeHandler()); register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler()); register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler()); register(java.sql.Date.class, new SqlDateTypeHandler()); register(java.sql.Time.class, new SqlTimeTypeHandler()); register(java.sql.Timestamp.class, new SqlTimestampTypeHandler()); register(Character.class, new CharacterTypeHandler()); register(char.class, new CharacterTypeHandler());