typeHandler 扫描不到的坑: 可以看这个兄弟写的,http://www.jb51.cc/article/p-mauvqnvx-od.html 解决方法用了反射。还有一种方法可以解决。 mybatis.tk好像没问题。我的版本可能比较旧,设置后,没有反应,已经扫描到了mapper配置文件,但是typeHandler就是没毛反应。好了不说了 看如何自定义Jsonobject的typeHandler接口
建议大家用新版的mybatis jar包或者mybatis.tk这个。
这个是为了方便用EL直接取值,所以保存取出的类型都要JsonObject类型。但是mybatis 默认的是没有这种格式,不紫池啊。
实现接口:
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 ![输入图片说明](https://static.oschina.net/uploads/img/201709/05153912_SK1d.png "在这里输入图片标题") 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扫描不到的问题就看最前面写的吧。
<result column="json" property="json" jdbcType="VARCHAR" typeHandler="com.cnm.filter.FastJsonTypeHandler"/>
第二种是在使用的变量后面加
#{json,typeHandler=com.cnm.filter.FastJsonTypeHandler}
常规配置方法:(旧jar 有bug)
<typeHandlers> <typeHandler handler="com.cnm.filter.FastJsonTypeHandler" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR"/> </typeHandlers>
配置文件修改后,就可以直接使用,此方法适合新版mybatis,旧的有问题,扫描不上。需要使用反射来进行重新注册。
Mybatis 常用自带集成TypeHeadler
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,JdbcType.CLOB,new ClobTypeHandler()); register(String.class,JdbcType.VARCHAR,JdbcType.LONGVARCHAR,JdbcType.NVARCHAR,new NStringTypeHandler()); register(String.class,JdbcType.NCHAR,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,new BlobTypeHandler()); register(byte[].class,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());