mybatis自动把参数加了双引号这件事
此文仅仅是记录一件自己学习过程中干的蠢事。从网上了解到mysql可以存储json格式的数据,于是便高高兴兴试了一下(没试过json数组),之后便引发了题目所说的困扰(看标题所说的请直接跳到最后)。(这里没有原理)
1.首先,想要往mysql中存储json格式的数据,需要在mysql将字段类型设为'json'
2.然后需要编写一个转换器typehandle继承mybatis提供的BaseTypeHandler<Object>,如下所示
-
public class JsonTypeHandler extends BaseTypeHandler<Object> {
-
-
-
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
-
-
ps.setString(i, JSON.toJSONString(parameter));
-
}
-
-
-
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
-
-
return JSON.parseObject(rs.getString(columnName), Object.class);
-
}
-
-
-
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-
-
return JSON.parseObject(rs.getString(columnIndex), Object.class);
-
}
-
-
-
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,从而查不到数据?我学艺不精,对此尚无思路。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgghaha
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13