mybatis动态参数及动态插入

工作中要写这样一个线程,要实现从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}) ```
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值