最近几天自己在做用springboot将mqtt协议的物联网设备数据存入mangodb数据库中的小demo,突发奇想尝试了一下mysql数据库。记录一下我遇到的问题。数据格式如图,不同的设备body中属性可能会有所不同。
一开始是利用阿里的fastjson将body中的每个属性都解析出来,映射到实体类的对应属性,但由于设备body的不确定性,实体类属性无法一一对应。故本人将实体类设计为
public class DeviceMesToDatabase implements Serializable {
private String cmd;
private String code;
private String deviceId;
private Map body;
public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public Map getBody() {
return body;
}
public void setBody(Map body) {
this.body = body;
}
}
利用map存储body中的属性。
然而,映射到mysql数据库时,问题就来了。如何将map中的所有键值对存入mysql表中的body列?
解决方法:
一开始尝试
#{key}:#{value}
总是报错,badsqlException...
后来折腾了几个小时,发现问题:
mybatis中的#{property}在生成sql语句时,会自动添加单引号 ' ,因此会生成如下情况的sql语句:
insert into table_name (列1,列2,列3,body) values (值1,值2,值3,'{ 'key1:value1' 'key2:value2' 'key3:value3' 'key4:value4' }' )
由于值4中每个key-value都被单引号包围,造成了错误的sql语法,所以必然报错badsqlException....
解决方法?
看下面:
${key}:${value}
采用${property}不会给属性周围自动添加单引号,此时问题就解决了。
提示:#{}能防止sql注入,${}有sql注入的风险,请根据情况使用。
菜鸟的第一篇文章,写的不好请见谅。



