关于mybatis自动给参数加了双引号这件事

        此文仅仅是记录一件自己学习过程中干的蠢事。从网上了解到mysql可以存储json格式的数据,于是便高高兴兴试了一下(没试过json数组),之后便引发了题目所说的困扰(看标题所说的请直接跳到最后)。(这里没有原理)

        1.首先,想要往mysql中存储json格式的数据,需要在mysql将字段类型设为'json'

        2.然后需要编写一个转换器typehandle继承mybatis提供的BaseTypeHandler<Object>,如下所示

public class JsonTypeHandler extends BaseTypeHandler<Object> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {

        ps.setString(i, JSON.toJSONString(parameter));
    }

    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {

        return JSON.parseObject(rs.getString(columnName), Object.class);
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

        return JSON.parseObject(rs.getString(columnIndex), Object.class);
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

        return JSON.parseObject(cs.getString(columnIndex), Object.class);
    }

}

        3.然后在mybatis-config.xml配置文件中注册格式转换器

<!--JSON格式转换器-->
<typeHandlers>
    <typeHandler handler="com.happyyao.util.JsonTypeHandler"/>
</typeHandlers>

         4.最后再在映射文件中加入映射的字段

<resultMap id="rulesResultMap" type="rules">
        <result column="ruler_status" property="ruleStatus"></result>
        <result column="sender" typeHandler="com.happyyao.util.JsonTypeHandler"></result>
</resultMap>

<insert id="addRules">
        insert into rules(uuid, email, rule_status, sender, domain, receiver, subject, bltime, othermail, handle)
        values (REPLACE(UUID(), "-", ""), #{email}, #{ruleStatus},
                #{sender,typeHandler=com.happyyao.util.JsonTypeHandler},
                #{domain,typeHandler=com.happyyao.util.JsonTypeHandler},
                #{receiver,typeHandler=com.happyyao.util.JsonTypeHandler},
                #{subject,typeHandler=com.happyyao.util.JsonTypeHandler},
                #{bltime,typeHandler=com.happyyao.util.JsonTypeHandler},
                #{othermail},
                #{handle,typeHandler=com.happyyao.util.JsonTypeHandler})
</insert>

        大功告成!大概吧。。。这个时候应该是可以正常插入json类型的数据了(sender,domain等都是对象)。

        此时,我开始从数据库拿这些数据了。。。好吧,我失败了,我没能成功解决将数据库拿到的json数据转换为对象这个问题。拿到的都是<<BLOB>>


        于是我换了个思路,索性直接存json字符串,是的,将需要存的对象转换成String,数据库中字段类型换成了String。

         这样的话,在插入之前,手动将Object转换为json字符串,读取的时候,在读取之后再手动将String字符串转换为Object(可能看起来很麻烦,其实只是写两个方法然后重复调用罢了,我认为这种方法比直接在数据库存JSON方便多了,建议如果想存json,还是在mysql存String然后自己处理吧。),至此,从形式上来看,数据库存json的想法大概是实现了。数据也可以正常拿到并返回到前端,真好。

        好像忘了什么。。。没错,我发现了一个问题,在我执行sql语句的时候,我发现传递的参数出了问题,就是题目说的,参数默认加上了双引号。如下所示:

 

        数据库中也加上了双引号,网上并没有找到相关说明,这困扰了我一整天。直到刚才,我注意了一件事,就是最一开始我在mybatis配置文件添加的的”类型转换器“忘了删掉了。

        说到这里,你大概已经明白了,如果你用了JSON类型转换器,个人建议不要直接在mysql将字段类型设置成json,设置成varchar,然后删掉类型转换器,自己进行数据转换(object to String,String to object),这样MyBatis就不会自动给参数加上" "了。

        如果你一定要直接在mysql设置‘json’类型,且遇到了传递的数据加上了不想要的双引号,我的想法是在数据库用触发器,用replace函数将双引号替换成空。或许会导致查询时查的是"xxx"而不是xxx,从而查不到数据?我学艺不精,对此尚无思路。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值