工作中要写这样一个线程,要实现从mq拿出json存入mysql
json可以是:
String json1="{“deviceId”:“3353011412648071”,“sensorTypeId”:1,“data”:{“carstate”:“0”,“battery”:“10”,“sleeptime”:40,“heartbeat”:8}}";
这个json对应的数据库表:
json也可以是:
String json2="{"deviceId":"3353011412648072","sensorTypeId":2,"data":{"temp":40}";
解释一下json里key的含义:
deviceId:设备
sensorTypeId:设备类型
carstate/battery /sleeptime:指标
设备类型与设备是一对一,设备与指标是一对多
每个设备对应了一张设备指标信息表
指标信息表里的字段由下边这三项组成
-
device_id
-
creat_tinme
-
data里的key
json1对应的设备指标信息表:
json2对应的肯定是另一张设备指标信息表
设备类型表:
设备类型与设备id关联的关系在另外一张设备表里,这里不提
问题的关键来了,有的设备类型只有一个指标字段,也就是一个key
有的设备类型有多个指标字段,以前用json转换成java对象再存入,可现在java对象是动态的,可变动的怎么办呢?
怎么用一个sql实现存储多个不同的表
的不同数据呢?
首先我们分析一下,这个sql语句由三部分是动态的: -
动态的表名
-
动态的表字段
-
动态的value
-
对于表名来说,我可以在设备类型表里添加设备指标信息表的表名字段,存的就是设备指标信息表的表名.这样通过查询设备类型id就可以获得表名
-
参数可以和给你发送json的人商量好,json的key为表字段
我们通过拼接的方式,一次性把表字段传过去 -
value可以获取json里的key拼接,同理
这样用这三个属性,创建一个传入mapper的通用类
public class DeviceTargetInfoBo {
//设备指标信息表的表名
private String tableName;
//动态拼接的参数
private String params;
//动态拼接的value
private String targetValues;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public String getTargetValues() {
return targetValues;
}
public void setTargetValues(String targetValues) {
this.targetValues = targetValues;
}
}
```javascript
public void insertIntoMySql(String str) {
//new一个传入mapper的通用type类型
DeviceTargetInfoBo deviceTargetInfoBo = new DeviceTargetInfoBo();
//拼接values
StringBuffer stringBuffer1 = new StringBuffer();
//拼接key,(key和表字段名一致,即拼接表字段)
StringBuffer stringBuffer2 = new StringBuffer();
//为了使用JSONObject里的方法,将json字符串转换为JSONObject对象
JSONObject jsonObject1 = JSONObject.fromObject(str);
//获取sensorTypeId为了查询表名
String sensorTypeId = jsonObject1.getString("sensorTypeId");
//转成int
int i = Integer.parseInt(sensorTypeId);
//获得表名
String tableName = deviceReadMapper.queryDeviceTargrtInfoTableName(i);
//表名赋值给对象
deviceTargetInfoBo.setTableName(tableName);
String deviceId = jsonObject1.getString("deviceId");
stringBuffer1.append("\"");
stringBuffer1.append(deviceId);
stringBuffer1.append("\"");
stringBuffer2.append("device_id");
//获取data的string
String data = jsonObject1.getString("data");
//将data的string转为JSONObject对象
JSONObject jsonObject2 = JSONObject.fromObject(data);
//迭代器遍历
Iterator it = jsonObject2.keys();
while (it.hasNext()) {
String key = (String) it.next();
String value = jsonObject2.getString(key);
//添加value
stringBuffer1.append(",");
stringBuffer1.append("\"");
stringBuffer1.append(value);
stringBuffer1.append("\"");
//添加参数名
stringBuffer2.append(",");
stringBuffer2.append(key);
}
deviceTargetInfoBo.setTargetValues(stringBuffer1.toString());
deviceTargetInfoBo.setParams(stringBuffer2.toString());
Integer integer = businessWriteMapper.insertIntoMysql(deviceTargetInfoBo);
}
sql语句是这样:
里面有个关键,就是传入的参数用$拼接符,而不能用#占位符
#会对传入的数据加一个双引号,从而导致sql语法错误
$将传入的数据直接显示生成在sql中
INSERT INTO ${tableName} (creat_time,${params}) VALUES (NOW(),${targetValues}) ```