typeHandler接口实现FastJson中的JSONObject

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 ![输入图片说明](https://static.oschina.net/uploads/img/201709/05153912_SK1d.png "在这里输入图片标题") 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());

BUG问题所在地

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap