JDBC批量插入sql-踩坑笔记
引言
使用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-踩坑笔记相关推荐
- JAVA使用JDBC批量插入SQL
数据库连接使用proxool连接JDBC 代码 JAVA类 package com.czr.proxool;import org.logicalcobwebs.proxool.ProxoolExcep ...
- 转:Mybatis与JDBC批量插入数据库哪个更快
转自 http://www.cnblogs.com/fnz0/p/5713102.html, https://www.cnblogs.com/wxw7blog/p/8706797.html [转]: ...
- jdbc批量插入、批量删除、批量更新
谨记:字符串拼接的时候一定要用引号引起来. 技巧:当jdbc处理sql语句时提示错误,可以将执行的sql语句打印出来,然后再在数据库中执行,从而解决错误. 一.JDBC的批量插入 JDBC批量插入主要 ...
- EDUSOHO踩坑笔记之六:edusoho架构及模块分析
EDUSOHO踩坑笔记之六:edusoho架构及模块分析 从目录结构.入口文件.配置.控制器.服务层.模型.模块组成等几个角度,进行架构的描述.本文档是以8.0的版本为基准的说明,与其他版本会有些区别 ...
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 参考文章: (1)Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 (2)https://www.cnblogs. ...
- iphone se 一代 不完美越狱 14.6 视频壁纸教程(踩坑笔记)
iphone se 一代 不完美越狱 14.6 加 视频壁纸教程-踩坑笔记 越狱流程 1.爱思助手制作启动u盘 坑点: 2.越狱好后 视频壁纸软件 1.源 2.软件安装 越狱流程 1.爱思助手制作启动 ...
- Linux内核踩坑笔记
systemtap embedded C踩坑笔记戳这: https://blog.csdn.net/qq_41961459/article/details/103093912 task_struct的 ...
- 利用convert【ImageMagick】把pdf批量转换为图片踩坑(gs报错和清晰度问题)
利用convert[ImageMagick]把pdf批量转换为图片踩坑 前言 坑1 gs报错 解决方案: 坑2 导出的文件太模糊 解决方案 参数介绍: 总结 最后附上完整的命令 前言 最近做一个pdf ...
- 阿里云部署Tiny Tiny RSS踩坑笔记
阿里云部署Tiny Tiny RSS踩坑笔记 前言 入坑了RSS,之前的配置是阿里云部署RSSHub,配合Inoreader进行文章阅读,详情见RSS入坑指南.阿里云部署RSSHub踩坑笔记.在202 ...
最新文章
- Ubuntu下配置JAVA环境
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 6...
- String,StringBuffer,StringBuilder
- CSS中的position定位
- ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记
- .NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记
- jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应
- NPOI从数据库中导出数据到Excel
- Sass含中文目录编译报错
- 数据结构课程设计- (二) 栈与队列(迷宫问题)
- 怎么用python输出百分比_Python 如何输出百分比
- 三星i865刷android,三星亮剑,120Hz+1.08亿+高通骁龙865,这才是安卓机皇
- 2015新款 MacBook 用心的测评与试用. 最轻薄的Mac上市
- 几个FFmpeg 视频参数 fps、tbr、tbn、tbc
- 用c 语言做课程表系统代码,[计算机]C语言课程表源代码.doc
- PowerBI-时间智能函数-LAST系列
- 美的 Dell 国信证券面经整理
- 带你了解IEEE1394接口技术
- NFT价值及白皮书获取
- Python HTTP代理的优缺点?芝麻代理豌豆代理熊猫代理讯代理?