引言

使用JDBC连接mysql进行批量插入数据时出现bug,卡了两天还是没头绪,路过的兄弟如果有什么经验还请指点一番。抱拳抱拳!

控制台提示sql语法有错误:

正文

首先JDBC连接mysql封装了一个工具类,开始工作都做好了,并且了解了JDBC批量插入sql需使用 == PreparedStatement==,可以防止sql注入,且可以预处理减少sql执行时间,提高效率。

下面我将整个方法代码展示

    @Scheduled(cron = "30 04 * * * ?")//@Scheduled(cron = "30 5 2/2 * * ?")public void siteDust() throws SQLException, CommonServiceException, IOException, URISyntaxException {Connection conn = null;PreparedStatement pstmt = null;String sql2 = "INSERT INTO `suyu_site_dust_info` (?) VALUES (?) ";String timestamp = DateUtil.getNowTime("yyyy-MM-dd HH:mm:ss");Map<String ,String> headers = new HashMap<>();headers.put("appKey", "1001000000000000314");// 获得表结构conn = JdbcUtil.getConnection("self_db");DatabaseMetaData metaData = conn.getMetaData();ResultSet rs = metaData.getColumns(null, null, "suyu_site_dust_info", null);// 发送请求String url = "http://172.22.156.177/gateway/api/1/gdycdwsj?start_time=%s&end_time=%s";String format = String.format(url,timestamp,timestamp);// 拿到数据String resData ="";Map res = new HashMap();try {resData = clientConfiguration.sendGet(format,headers);}catch (Exception e){resData = clientConfiguration.sendGet(format,headers);}res = FastJsonUtil.stringToCollect(resData);// 数据处理Object data = res.get("data");Map dataMap = FastJsonUtil.stringToCollect(data.toString());Object dataMap2 = dataMap.get("data");Map dataMap3 = FastJsonUtil.stringToCollect(dataMap2.toString());Object result = dataMap3.get("result");List<Map> dataListMap = FastJsonUtil.toList(result.toString(), Map.class);try {StringBuilder sql = new StringBuilder();conn.setAutoCommit(false);long start = System.currentTimeMillis() / 1000;for (int i = 0; i <  dataListMap.size(); i++) {Map myData = dataListMap.get(i);// 创建主键Object key2 = myData.get("devsite_name");myData.put("keyinfo", timestamp + "&" + key2.toString());Map<String, Object> nameToVal = new HashMap<>();Map<String, Object> remarkToName = new HashMap<>();rs.beforeFirst();while (rs.next()) {String column_name = rs.getString("COLUMN_NAME");String remarks = rs.getString("REMARKS");Object val = null;if (myData.containsKey(column_name)) {val = myData.get(column_name);}if (StringUtils.hasText(remarks)) {remarkToName.put(remarks, column_name);}nameToVal.put(column_name, ObjectUtils.isEmpty(val) ? "" : val);}Set<Map.Entry<String, Object>> entries = nameToVal.entrySet();StringBuilder colName = new StringBuilder();StringBuilder colValue = new StringBuilder();for (Map.Entry m : entries) {String key = m.getKey().toString();String value = m.getValue().toString();colName.append(key).append(",");colValue.append("'").append(StringUtils.hasText(value) ? value : "").append("'").append(",");}String substring = colName.substring(0, colName.lastIndexOf(","));String substring1 = colValue.substring(0, colValue.lastIndexOf(","));sql.append("insert into suyu_site_dust_info (").append(substring).append(")").append("values (").append(substring1).append(");");pstmt = conn.prepareStatement(sql.toString());
//                pstmt = conn.prepareStatement(sql2);
//                pstmt.setString(1,substring);
//                pstmt.setString(2,substring1);pstmt.addBatch();
//                //每10条就处理一次
//                if((i+1) % 10 == 0) {
//                    // 执行批量操作
//                    pstmt.executeBatch();
//                    // 清空batch
//                    pstmt.clearBatch();
//                }}// 执行批量操作pstmt.executeBatch();
//            pstmt.execute(sql.toString());// 清空batchpstmt.clearBatch();//提交事务conn.commit();long end = System.currentTimeMillis() / 1000;System.out.println("花费时间为:" + (end - start) + "s");}catch (Exception e) {System.out.println(e.getMessage());conn.rollback();} finally {JdbcUtil.close(conn, pstmt,null);}}
思路
第一种

百度得知PreparedStatement + 批量插入
对sql要求不可以在句末加 “;” 所以最后我得到的sql是这样的:

idea控制台报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘insert into suyu_site_dust_info (address,devsite_name,keyinfo,data,town_name,lat’ at line 1

多个sql之间没有 “;” 我在navicat中全选然后执行也是报语法错误:

但是一条一条插入是没问题的:

第二种

我在sql语句后加上分号 ;

sql.append("insert into suyu_site_dust_info (").append(substring).append(")").append("values (").append(substring1).append(");");

IDEA控制台也是报mysql语法错误

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘insert into suyu_site_dust_info (address,devsite_name,keyinfo,data,town_name,lat’ at line 1

但奇怪的是将==pstmt.executeBatch();==里面的sql拿出来到navicat中执行是可以全部一次插入成功的。

最后

这个bug找了两天了,我i想到的方法都试过了都没有效果,属实头秃了,路过的大佬多看两眼把,救救救救救救救救救救救救救救!

JDBC批量插入sql-踩坑笔记相关推荐

  1. JAVA使用JDBC批量插入SQL

    数据库连接使用proxool连接JDBC 代码 JAVA类 package com.czr.proxool;import org.logicalcobwebs.proxool.ProxoolExcep ...

  2. 转:Mybatis与JDBC批量插入数据库哪个更快

    转自 http://www.cnblogs.com/fnz0/p/5713102.html, https://www.cnblogs.com/wxw7blog/p/8706797.html [转]: ...

  3. jdbc批量插入、批量删除、批量更新

    谨记:字符串拼接的时候一定要用引号引起来. 技巧:当jdbc处理sql语句时提示错误,可以将执行的sql语句打印出来,然后再在数据库中执行,从而解决错误. 一.JDBC的批量插入 JDBC批量插入主要 ...

  4. EDUSOHO踩坑笔记之六:edusoho架构及模块分析

    EDUSOHO踩坑笔记之六:edusoho架构及模块分析 从目录结构.入口文件.配置.控制器.服务层.模型.模块组成等几个角度,进行架构的描述.本文档是以8.0的版本为基准的说明,与其他版本会有些区别 ...

  5. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案

    Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 参考文章: (1)Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 (2)https://www.cnblogs. ...

  6. iphone se 一代 不完美越狱 14.6 视频壁纸教程(踩坑笔记)

    iphone se 一代 不完美越狱 14.6 加 视频壁纸教程-踩坑笔记 越狱流程 1.爱思助手制作启动u盘 坑点: 2.越狱好后 视频壁纸软件 1.源 2.软件安装 越狱流程 1.爱思助手制作启动 ...

  7. Linux内核踩坑笔记

    systemtap embedded C踩坑笔记戳这: https://blog.csdn.net/qq_41961459/article/details/103093912 task_struct的 ...

  8. 利用convert【ImageMagick】把pdf批量转换为图片踩坑(gs报错和清晰度问题)

    利用convert[ImageMagick]把pdf批量转换为图片踩坑 前言 坑1 gs报错 解决方案: 坑2 导出的文件太模糊 解决方案 参数介绍: 总结 最后附上完整的命令 前言 最近做一个pdf ...

  9. 阿里云部署Tiny Tiny RSS踩坑笔记

    阿里云部署Tiny Tiny RSS踩坑笔记 前言 入坑了RSS,之前的配置是阿里云部署RSSHub,配合Inoreader进行文章阅读,详情见RSS入坑指南.阿里云部署RSSHub踩坑笔记.在202 ...

最新文章

  1. Ubuntu下配置JAVA环境
  2. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 6...
  3. String,StringBuffer,StringBuilder
  4. CSS中的position定位
  5. ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记
  6. .NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记
  7. jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应
  8. NPOI从数据库中导出数据到Excel
  9. Sass含中文目录编译报错
  10. 数据结构课程设计- (二) 栈与队列(迷宫问题)
  11. 怎么用python输出百分比_Python 如何输出百分比
  12. 三星i865刷android,三星亮剑,120Hz+1.08亿+高通骁龙865,这才是安卓机皇
  13. 2015新款 MacBook 用心的测评与试用. 最轻薄的Mac上市
  14. 几个FFmpeg 视频参数 fps、tbr、tbn、tbc
  15. 用c 语言做课程表系统代码,[计算机]C语言课程表源代码.doc
  16. PowerBI-时间智能函数-LAST系列
  17. 美的 Dell 国信证券面经整理
  18. 带你了解IEEE1394接口技术
  19. NFT价值及白皮书获取
  20. Python HTTP代理的优缺点?芝麻代理豌豆代理熊猫代理讯代理?

热门文章

  1. GBK 代码集字符定义表
  2. Win10添加、删除鼠标右击的选项(快捷方法)
  3. Linux LibTools
  4. 浪潮服务器上RAID配置实战及RAID相关知识
  5. threejs(webgl)-shader入门教程(1)
  6. 下一代共识机制探究——基于DAG的BFT共识
  7. 嵌入式设计,硬件和软件哪个重要?
  8. 南京移动开发者沙龙(创业邦+果合)
  9. 利用appimage工具对开发好的项目进行打包
  10. 2022年国内外主流的10款Bug跟踪管理软件