• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

mybatis自动把参数加了双引号这件事

武飞扬头像
berry_to_202
帮助1

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

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

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

  1.  
    public class JsonTypeHandler extends BaseTypeHandler<Object> {
  2.  
     
  3.  
    @Override
  4.  
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
  5.  
     
  6.  
    ps.setString(i, JSON.toJSONString(parameter));
  7.  
    }
  8.  
     
  9.  
    @Override
  10.  
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
  11.  
     
  12.  
    return JSON.parseObject(rs.getString(columnName), Object.class);
  13.  
    }
  14.  
     
  15.  
    @Override
  16.  
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  17.  
     
  18.  
    return JSON.parseObject(rs.getString(columnIndex), Object.class);
  19.  
    }
  20.  
     
  21.  
    @Override
  22.  
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  23.  
     
  24.  
    return JSON.parseObject(cs.getString(columnIndex), Object.class);
  25.  
    }
  26.  
     
  27.  
    }
学新通

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

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

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

  1.  
    <resultMap id="rulesResultMap" type="rules">
  2.  
    <result column="ruler_status" property="ruleStatus"></result>
  3.  
    <result column="sender" typeHandler="com.happyyao.util.JsonTypeHandler"></result>
  4.  
    </resultMap>
  5.  
     
  6.  
    <insert id="addRules">
  7.  
    insert into rules(uuid, email, rule_status, sender, domain, receiver, subject, bltime, othermail, handle)
  8.  
    values (REPLACE(UUID(), "-", ""), #{email}, #{ruleStatus},
  9.  
    #{sender,typeHandler=com.happyyao.util.JsonTypeHandler},
  10.  
    #{domain,typeHandler=com.happyyao.util.JsonTypeHandler},
  11.  
    #{receiver,typeHandler=com.happyyao.util.JsonTypeHandler},
  12.  
    #{subject,typeHandler=com.happyyao.util.JsonTypeHandler},
  13.  
    #{bltime,typeHandler=com.happyyao.util.JsonTypeHandler},
  14.  
    #{othermail},
  15.  
    #{handle,typeHandler=com.happyyao.util.JsonTypeHandler})
  16.  
    </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,从而查不到数据?我学艺不精,对此尚无思路。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgghaha
系列文章
更多 icon
同类精品
更多 icon
继续加载