使用myBatis从数据库读取JSON

时间:2018-09-19 01:33:18

标签: java json mybatis

我在数据库中有一列,我想将其另存为JSON并取回。

我的方法是:

我将其另存为ClobTypeHandler,并尝试将其另存为ClobTypeHandler

我正在使用Mybatis,但是出现以下错误。

Could not set property 'idType' of 'class package.abc' with value '{"idNum":"123","text":"ENCkk-KZJTmN8Mr5jEims0rssRow8xaAnkOtl0RQHDth1ByVtshI7zQebtcogOvYM-gNo15DwwPmduaufk03CteqRL03cRyrG4%3B","key":"}P]H73}AF}TGB$OIDCYVIIB+VW{4TR)I?U}_`_ZXP[UY$BJNXV{U~/@!F%+SVMFYT/2IAXIOPB"}' Cause: java.lang.IllegalArgumentException: argument type mismatch

下面是Java层和数据库详细信息。

class abc{

    private JsonNode idType;

    public String getIdType() {
         return idType != null ? idType.toString():null;
    }
    public void setIdType(JsonNode idType) {
        this.idType = idType;
    }
}

mapper.xml(插入数据库)

INSERT INTO CUSTOMER
    (<include refid="common_customer_insert_columns"></include>,id_type)        
 VALUES
    (<include refid="common_customer_insert_fields"></include>,<include refid="cc_customer_insert_fields"></include>,
        <choose> <when test="abc.idType !=null">#{abc.idType,typeHandler= org.apache.ibatis.type.ClobTypeHandler}</when>
                <otherwise>''</otherwise></choose>);

mapper.xml(从数据库中读取)

<resultMap>
    <result column="id_type" property="abc.idType" 
        typeHandler="org.apache.ibatis.type.ClobTypeHandler" />
</resultMap>

我尝试保存和检索的示例JSON值:

"idType": {  
       "idNum": "123",  
       "text": "ENh-KZJTmN8Mr5jEims0rssRow8xaADth1ByVtshI7zQebtcogOvYM-gNo15DwwPmduaufk03CteqRLaVwF0b3cRyrG4%3D",  
       "key":"}P]H73}AF}TGB$OICQ*DCYVIIB+VW{4TR)I?U}_`_ZXP[UY$BJNXV{@!F%+SVMFYT/2IAXIOPB"  
      }  

2 个答案:

答案 0 :(得分:0)

您可以不使用POJO来做到这一点:

ObjectMapper mapper = new ObjectMapper();
JsonNode idType = mapper.readTree(<json-string>);

答案 1 :(得分:0)

react-native upgrade 扩展了ClobTypeHandler,因此它允许以BaseTypeHandler<String>的形式从数据库列设置和检索值。当您像这样使用String时:

ClobTypeHandler

底层的mybatis期望#{abc.idType,typeHandler= org.apache.ibatis.type.ClobTypeHandler} 返回abc.getIdType,而这样做。到目前为止一切顺利。

从数据库中检索值时,使用的映射为:

String

在这种情况下,<result column="id_type" property="abc.idType" typeHandler="org.apache.ibatis.type.ClobTypeHandler" /> 尝试使用ClobTypeHandler设置器设置idType属性,并期望它接受setIdType。但是setter参数为String,因此您会收到消息,指出类型不兼容。

要解决此更改,类型设置器将在其中进行从JsonNodeString的转换:

JsonNode

请注意:您can use是静态的public void setIdType(String idTypeString) { ObjectMapper mapper = new ObjectMapper(); this.idType = mapper.readTree(isTypeString); } ,以避免在每次调用时创建它。

更好的方法是为类型ObjectMapper创建your own TypeHandler。它将在内部进行JsonNode <=> String转换,因此您JsonNode不会被这种(不相关的)逻辑所污染。