文档章节

typeHandler接口实现FastJson中的JSONObject

加州肥猫
 加州肥猫
发布于 2017/09/05 15:40
字数 703
阅读 82
收藏 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问题所在地

© 著作权归作者所有

共有 人打赏支持
加州肥猫

加州肥猫

粉丝 13
博文 13
码字总数 6048
作品 2
日本
程序员
私信 提问
action中怎么获取请求参数值,并返回json格式的数据

配置struts.xml文件(struts2) package extends属性写“json-default”,但是要先把struts2开发包中的struts2-json-plugin-2.2.3这个jar包导进自己的工程 添加action,name即action的名字,cla...

我要活出个人模狗样
2017/11/12
0
0
codefinger/codefinger-json

#codefinger-json 程序入口 程序入口全在org.codefinger.json包中。 其中JSONUtil是程序的主要入口,这里提供了JSON序列化和反序列化的静态方法。 支持的数据类型 所有基本数据类型以及其包装...

codefinger
2017/09/13
0
0
房产证样本 不动产证 不动产权证 2018年房产证样本

前段时间在做一个生活缴费项目,需要调用一个第三方缴费平台的接口,这个平台是基于http请求,但是返回的内容是xml字符串。当时是想把xml字符串直接转换为对象,但是各个接口返回的内容都不同...

java小吊
2018/08/22
0
0
String转成JSON的实现

String转成JSON 这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换 欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135 本群提供免费的学习指导 架构资料 以及免...

编程SHA
2018/11/21
0
0
对象转map 空值过滤 符号拼接

对象属性转换为map 1、空值保留(强制转换 fastJson) JSONObject jonsObject = (JSONObject)JSONObject.toJSON("类对象"); 2、空值过滤(非强制转换 fastJson) JSONObject jsonObject = JSON.p......

最佳的时间就是现在
2018/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

看过上百部片子的这个人教你视频标签算法解析

本文由云+社区发表 随着内容时代的来临,多媒体信息,特别是视频信息的分析和理解需求,如图像分类、图像打标签、视频处理等等,变得越发迫切。目前图像分类已经发展了多年,在一定条件下已经...

腾讯云加社区
17分钟前
0
0
2. 红黑树

定义:红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树(Binary Search Tree)。 要理解红黑树,先要了解什么是二叉查找树。在上一章中,我们学习了什么是二叉树,以及二叉树...

火拳-艾斯
18分钟前
0
0
input的button类型,点击页面跳转

一、input type=button 不做任何操作 例如: <input type="button" class="btn btn-primary" style="width: 30%" value="返回" onclick="window.location.href='/users/list'"></input> onc......

Sunki
24分钟前
0
0
踩坑:js 小数运算出现精度问题

背景 在学习小程序商城源码时发现了这个问题,单价可能出现小数,小数之间运算结果会莫名其妙多出一大串数字,比如下面这样👇。 在此之前我是知道 js 中著名的 0.1 + 0.2 != 0.3 的问题的,...

dkvirus
29分钟前
0
0
zookeeper和HBASE总结

zookeeper快速上手 zookeeper的基本功能和应用场景 zookeeper的整体运行机制 zookeeper的数据存储机制 数据存储形式 zookeeper中对用户的数据采用kv形式存储 只是zk有点特别: key:是以路径...

瑞查德-Jack
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部