加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

typeHandler接口实现FastJson中的JSONObject

发布时间:2020-12-16 18:52:30 所属栏目:百科 来源:网络整理
导读:typeHandler 扫描不到的坑: 可以看这个兄弟写的,http://www.jb51.cc/article/p-mauvqnvx-od.html 解决方法用了反射。还有一种方法可以解决。 mybatis.tk好像没问题。我的版本可能比较旧,设置后,没有反应,已经扫描到了mapper配置文件,但是typeHandler就

typeHandler 扫描不到的坑: 可以看这个兄弟写的,http://www.52php.cn/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扫描不到的问题就看最前面写的吧。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读