文档章节

typeHandler接口实现FastJson中的JSONObject

加州肥猫
 加州肥猫
发布于 2017/09/05 15:40
字数 703
阅读 4.8K
收藏 1

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

typeHandler 扫描不到的坑: 可以看这个兄弟写的,http://blog.csdn.net/goldenfish1919/article/details/52806659 解决方法用了反射。还有一种方法可以解决。 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扫描不到的问题就看最前面写的吧。

直接使用方法 在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, 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());  

BUG问题所在地

加州肥猫

加州肥猫

粉丝 14
博文 11
码字总数 10740
作品 2
日本
程序员
私信 提问
加载中
请先登录后再评论。
Json详解以及fastjson使用教程

Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。在使用Java做Web开发时,不可避免的会遇到...

东风破2019
2019/10/11
29
0
FastJson中JSONObject用法及常用方法总结

最近一直有用到解析各种数据,主要是用FastJson进行数据解析,其中一个重要的类为JSONObject,今天有时间,所以进行总结一下: JSONobject是FastJson提供的对象,在api中是用一个私有的常量m...

osc_arj2xsvk
2019/12/24
22
0
fastjson——json工具库

fastjson alibaba fastjson是阿里巴巴公司开源维护的一个处理json格式数据的java工具库。 功能特性: 数据绑定databind (json string <--> java object, JSON <--> java object) 保持单一对......

osc_2qjd9tjg
2019/01/18
25
0
map to jsonstring 保持原始排序解决方案

背景 工作中需要将map中的映射转换为json字符串,并且需要保持映射在put时的顺序。 map数据: 转换后的json字符串: 最开始采用的是fastjson库,但是由于使用的是老版本1.1.9,不支持保持原始...

whysln
2019/05/16
15
0
json与java bean对象转换

第一步:引入fastjson的依赖jar包 注:如果引入此版本的依赖,导致项目不能启动(报错:找不到启动类);那么可以换一个版本的fastjson即可。 给出文字版: <!-- fastjson --> <dependency> <group...

osc_uv42f7cs
2019/03/25
1
0

没有更多内容

加载失败,请刷新页面

加载更多

还不会用 Kubernetes集群控制器?

作者 | 阿里云售后技术专家 声东 导读:当我们尝试去理解 K8s 集群工作原理的时候,控制器(Controller)肯定是一个难点。这是因为控制器有很多,具体实现大相径庭;且控制器的实现用到了一些...

kubernetes中文社区
2019/09/25
8
0
Django实战-天气接口封装

Django实战-添加应用 Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。 实现了用户自主添...

凯南-plus
2019/09/06
0
0
REST API思维导图

本文分享自微信公众号 - 测试游记(zx94_11)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

zx钟
2019/10/13
0
0
为什么你需要混沌工程以及 Chaos Mesh®

信心的毁灭与重建 在我最开始学习编程的时候,我一直觉得写程序是很简单的事情,程序总是按照我的想法串行的执行,给一个输入,总是有着符合预期的固定输出。那时候写代码,可能大的挑战在于...

TiDB
13分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部