typeHandler 扫描不到的坑: 可以看这个兄弟写的,http://blog.csdn.net/goldenfish1919/article/details/52806659 解决方法用了反射。还有一种方法可以解决。 mybatis.tk好像没问题。我的版本可能比较旧,设置后,没有反应,已经扫描到了mapper配置文件,但是typeHandler就是没毛反应。好了不说了 看如何自定义Jsonobject的typeHandler接口
建议大家用新版的mybatis jar包或者mybatis.tk这个。
这个是为了方便用EL直接取值,所以保存取出的类型都要JsonObject类型。但是mybatis 默认的是没有这种格式,不紫池啊。
实现接口:
1package com.cnm.filter; 2import java.sql.CallableStatement; 3import java.sql.PreparedStatement; 4import java.sql.ResultSet; 5import java.sql.SQLException; 6 7import org.apache.ibatis.type.JdbcType; 8import org.apache.ibatis.type.MappedJdbcTypes; 9import org.apache.ibatis.type.MappedTypes; 10import org.apache.ibatis.type.TypeHandler; 11 12import com.alibaba.fastjson.JSON; 13import com.alibaba.fastjson.JSONObject; 14 15@MappedTypes({JSONObject.class}) 16@MappedJdbcTypes({JdbcType.VARCHAR}) 17public class FastJsonTypeHandler implements TypeHandler<JSONObject>{ 18 19 @Override 20 public JSONObject getResult(ResultSet rs, String columnName) throws SQLException { 21 String string = rs.getString(columnName); 22 JSONObject json = JSONObject.parseObject(string); 23 return json; 24 } 25 26 @Override 27 public JSONObject getResult(ResultSet rs, int columnIndex) throws SQLException { 28 String string = rs.getString(columnIndex); 29 JSONObject json = JSONObject.parseObject(string); 30 return json; 31 } 32 33 //@param cs 当前的CallableStatement执行后的CallableStatement  34 public JSONObject getResult(CallableStatement cs, int columnIndex) throws SQLException { 35 String string = cs.getString(columnIndex); 36 JSONObject json = JSONObject.parseObject(string); 37 return json; 38 } 39 40 /** 41 * 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型 42 * @param ps 当前的PreparedStatement对象 43 * @param i 当前参数的位置 44 * @param parameter 当前参数的Java对象 45 * @param jdbcType 当前参数的数据库类型 46 * @throws SQLException 47 */ 48 public void setParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException { 49 if(parameter == null){ 50 ps.setString(i, null); 51 return; 52 } 53 String json = JSON.toJSONString(parameter); 54 ps.setString(i, json); 55 56 } 57 58} 59
Mapper扫描不到的问题就看最前面写的吧。
直接使用方法 在Mapper文件中配置:
<result column="json" property="json" jdbcType="VARCHAR" typeHandler="com.cnm.filter.FastJsonTypeHandler"/>
第二种是在使用的变量后面加
#{json,typeHandler=com.cnm.filter.FastJsonTypeHandler}
常规配置方法:(旧jar 有bug)
1<typeHandlers> 2 <typeHandler handler="com.cnm.filter.FastJsonTypeHandler" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR"/> 3 </typeHandlers>
配置文件修改后,就可以直接使用,此方法适合新版mybatis,旧的有问题,扫描不上。需要使用反射来进行重新注册。
Mybatis 常用自带集成TypeHeadler
1register(Boolean.class, new BooleanTypeHandler()); 2register(boolean.class, new BooleanTypeHandler()); 3register(Byte.class, new ByteTypeHandler()); 4register(byte.class, new ByteTypeHandler()); 5register(Short.class, new ShortTypeHandler()); 6register(short.class, new ShortTypeHandler()); 7register(Integer.class, new IntegerTypeHandler()); 8register(int.class, new IntegerTypeHandler()); 9register(Long.class, new LongTypeHandler()); 10register(long.class, new LongTypeHandler()); 11register(Float.class, new FloatTypeHandler()); 12register(float.class, new FloatTypeHandler()); 13register(Double.class, new DoubleTypeHandler()); 14register(double.class, new DoubleTypeHandler()); 15register(String.class, new StringTypeHandler()); 16register(String.class, JdbcType.CHAR, new StringTypeHandler()); 17register(String.class, JdbcType.CLOB, new ClobTypeHandler()); 18register(String.class, JdbcType.VARCHAR, new StringTypeHandler()); 19register(String.class, JdbcType.LONGVARCHAR, new ClobTypeHandler()); 20register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler()); 21register(String.class, JdbcType.NCHAR, new NStringTypeHandler()); 22register(String.class, JdbcType.NCLOB, new NClobTypeHandler()); 23register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler()); 24register(BigInteger.class, new BigIntegerTypeHandler()); 25register(BigDecimal.class, new BigDecimalTypeHandler()); 26register(Byte[].class, new ByteObjectArrayTypeHandler()); 27register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler()); 28register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler()); 29register(byte[].class, new ByteArrayTypeHandler()); 30register(byte[].class, JdbcType.BLOB, new BlobTypeHandler()); 31register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler()); 32register(Object.class, UNKNOWN_TYPE_HANDLER); 33register(Object.class, JdbcType.OTHER, UNKNOWN_TYPE_HANDLER); 34register(Date.class, new DateTypeHandler()); 35register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler()); 36register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler()); 37register(java.sql.Date.class, new SqlDateTypeHandler()); 38register(java.sql.Time.class, new SqlTimeTypeHandler()); 39register(java.sql.Timestamp.class, new SqlTimestampTypeHandler()); 40register(Character.class, new CharacterTypeHandler()); 41register(char.class, new CharacterTypeHandler());
