====

不禁感叹:框架就是框架!!!不需要再手动处理很多业务以外的 各种繁琐处理。

【这也是为什么 生产环境 基本只使用 框架的原因!】

===批量插入SQL如何写的【重点!】

版本1:

【old】<insert id="insertListSelective" parameterType="List">insert into category (category.name,category.type, pid,wid,status) VALUES<foreach collection="list" item="item" index="index" separator="," >/*批量插入【看看mybatis能不能处理插入特殊字符问题。】*/<!–<trim prefix="(" suffix=")" suffixOverrides=",">–><trim prefix="(" suffix=")" ><if test="item.name != null">#{item.name,jdbcType=VARCHAR},</if><if test="item.type != null">#{item.type,jdbcType=INTEGER},</if><if test="item.pid != null">#{item.pid,jdbcType=BIGINT},</if><if test="item.wid != null">#{item.wid,jdbcType=BIGINT},</if>/*if判断里面 也 必须加“item.”,否则报错:ibatis.binding.BindingException: Parameter 'status' not found. Available parameters are [collection, list]*/<if test="item.status != null">#{item.status,jdbcType=BIGINT}</if></trim></foreach></insert>

各种报错:因为担心mybatis不能处理插入特殊字符,SQL报错。想着用trim标签,看能不能好一些。

结果【小看了mybatis,能够处理特殊字符插入,完全不需要 if标签。】

①用了trim标签反而报错:

总是提示:参数“Xxx”找不到。

错误信息:

 nested exception is org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [categoryDOList, param1]

②去掉if标签:最终版。【没有if,null数据也会插入,原样数据保留。mybatis 的sql并不是一定要用if标签的,要灵活应用】

 <!--new--><insert id="insertListSelective" parameterType="List">insert into category (category.name,category.type, pid,wid,status) VALUES<foreach collection="list" item="item" index="index"  separator="," >/*批量插入【看看mybatis能不能处理插入特殊字符问题。】*/<!--<trim prefix="(" suffix=")" suffixOverrides=",">--><trim prefix="(" suffix=")" >#{item.name,jdbcType=VARCHAR},#{item.type,jdbcType=INTEGER},#{item.pid,jdbcType=BIGINT},#{item.wid,jdbcType=BIGINT},#{item.status,jdbcType=BIGINT}</trim></foreach></insert>

====又遇到:

PacketTooBigException: Packet for query is too large (1,555,811 > 1,048,576)

解决:

在做查询数据库操作时,报了以上错误,原因是MySQL的max_allowed_packet设置过小引起的,我一开始设置的是1M,后来改为了20Mmysql根据配置文件会限制server接受的数据包大小。有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。
在mysql命令行中执行命令1.查看当前配置show VARIABLES like '%max_allowed_packet%';
1
2.修改配置set global max_allowed_packet = 2*1024*1024*10;
1
把max_allowed_packet的值修改的大点、修改完成后mysql不需要重新启动服务,但是项目可能要重新启动。

③基本难点都解决了。解决jdAPI拿到的数据量太大。

【照着上面设置了 mysql最大的SQL长度,还是容不下】

于是。在业务逻辑,处理,每1000个记录插入一次。

package com.ybl.jdAPI.kuaiChe.category.service.impl;import com.jd.open.api.sdk.DefaultJdClient;
import com.jd.open.api.sdk.JdClient;
import com.jd.open.api.sdk.domain.jzt_kc.KuaicheUserTagJosService.DspResult;
import com.jd.open.api.sdk.domain.jzt_kc.KuaicheUserTagJosService.DspUserTagQuery;
import com.jd.open.api.sdk.request.jzt_kc.DspKcUsertagGetRequest;
import com.jd.open.api.sdk.response.jzt_kc.DspKcUsertagGetResponse;
import com.ybl.jdAPI.kuaiChe.category.bean.CategoryDO;
import com.ybl.jdAPI.kuaiChe.category.mapper.CategoryDOMapper;
import com.ybl.jdAPI.kuaiChe.category.service.CategoryService;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;/*** Created by Administrator on 2018/4/24/024.*/
@Service
public class CategoryServiceImpl implements CategoryService {//    private  ObjectMapper MAPPER = new ObjectMapper();@AutowiredObjectMapper MAPPER;@AutowiredCategoryDOMapper categoryDOMapper;//就这样的。不是错误。@Overridepublic int insertListSelective() {//SDK 访问jd数据,保存数据库。=====》mybatis方式保存 【存特俗字符到数据库 ,会不会简单点?】String SERVER_URL = "https://api.jd.com/routerjson";//文档给出,入口地址。String accessToken = "fa6df891-88c0-4e71-8a80-573ff7276254" ;//只有这里会变。String appKey = "DCB16278B645135825F936D08D636F05";String appSecret = "f59d6d41cf4e4d549b157dba39c3d50f";////示例代码//3.    获取类目结构树 【没有应用级参数。OK  】JdClient client=new DefaultJdClient(SERVER_URL,accessToken,appKey,appSecret);DspKcUsertagGetRequest request=new DspKcUsertagGetRequest();try {//client.xxx 没有其他方法。DspKcUsertagGetResponse response=client.execute(request);//代码拿数据。DspResult result = response.getQuerylistusertagResult();boolean success = result.getSuccess();if( success ){List<DspUserTagQuery> valueList = result.getValue();//ok//==========》jdbc 操作mysql。【拼接SQL】/* Connection connection = JdbcUtil.getConnection();Statement statement = connection.createStatement();//statement.executeUpdate("INSERT INTO stu VALUES (22, 'demo', 22);");statement.executeUpdate(sql);//最后不要忘记释放资源哦JdbcUtil.release(statement);*///==========》mybatis 操作mysnewql。【封装beanList】ArrayList<CategoryDO> categoryDOList = new ArrayList<CategoryDO>();for(int i=0; i< valueList.size();i++){DspUserTagQuery query = valueList.get(i);String[] name = query.getName();//###测试发现 数组 属性只存 一个元素。int[] type = query.getType();Long[] pid = query.getPid();Long[] wid = query.getWid();Long[] status = query.getStatus();CategoryDO categoryDO = new CategoryDO();if(name!=null){categoryDO.setName(name[0]);}if(type!=null) {categoryDO.setType(type[0]);}if(pid!=null){categoryDO.setPid(pid[0]);}if(wid!=null) {categoryDO.setWid(wid[0]);}if(status!=null) {categoryDO.setStatus(status[0]);}categoryDOList.add(categoryDO);//解决SQL过长的问题【mysql SQL最大限制都装不下了。】if( (i>0 && (i%1000==0)) ||  (  i==(valueList.size()-1) )  ) { //每1000个对象插入一次categoryDOMapper.insertListSelective(categoryDOList);categoryDOList = new ArrayList<CategoryDO>();}}//                categoryDOMapper.insertListSelective(List<CategoryDO> valueList)//行不通
//                categoryDOMapper.insertListSelective(categoryDOList);//Jackson  list转json  Str  ====测试用//=====》【###   MAPPER是第三方jar的Class,这里@Autowire成功,必须在xml配置bean才行!!】String jsonStr = MAPPER.writeValueAsString(valueList);System.out.println(jsonStr);//ok}else{System.out.println("查询失败。");}}catch (Exception e){e.printStackTrace();}return 0;}@Overridepublic int insert(CategoryDO record) {return 0;}@Overridepublic int insertSelective(CategoryDO record) {return 0;}}

④====测试 数据完整性。逻辑。

====

====最后。框架就是框架。!!!

经验:【遇到 一些业务逻辑 无关的繁琐处理,尝试使用 相关框架。】

工欲善其事必先利其器!

### jdbc 向数据库插入特殊字符 失败。SQL报错的问题。【批量插入时手动解决特殊字符,根本不现实!!】相关推荐

  1. Blender3 按下I键插入帧失败,报错 插入关键帧的帧位置 解决

    每隔一段时间,插入关键帧就会报错 插入关键帧的帧位置,不知道怎么出现的. 后面发现,多数是在纯手K的轨道上,出现这样的问题.空轨道,导入姿势后,按下I键插帧,有时也有该问题. 找了下方法,大概知道了原 ...

  2. oracle批量插入报错,MyBatis Oracle批量插入数据

    导语:在开发中或多或少都会遇到数据批量插入的功能,最近我在做项目的过程中就遇到了这样一个问题.上传Excel文件,解析文件内容并将解析的内容插入数据库. 思路分析 1.解析Excel文件 Excel文 ...

  3. 记录hive sql报错,return code1和return code2解决方法

    执行hive sql语句的时候非常容易出现return code 1.return code 2.return code 3的情况,我就遇到了很多次,code3在某次意外中得以解决 但是引发了code ...

  4. 使用DBUnit框架数据库插入特殊字符失败的查错经历

    本文记录的是使用DBUnit测试框架进行数据库数据插入时,插入特殊字符失败的查错经历.希望能对向我这样的小白同学们在遇到类似问题时,能够有一些启发. 背景: 在写跟数据库交互模块的单元测试,数据库表中 ...

  5. 数据库执行sql报错Got a packet bigger than 'max_allowed_packet' bytes及重启mysql

    准备在mysql上使用数据库A,但mysql5经过重装后,上面的数据库已丢失,只得通过之前备份的A.sql重新生成数据库A. 1.执行sql报错 在执行A.sql的过程中,出现如下错误:Got a p ...

  6. SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003

    SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003 数据类型 MSSQL 2008R2  数据大小 352 MB 故障检测 服务器几次断电后数据库可疑 无法附加 消 ...

  7. 利用sql报错帮助进行sql注入

    我们可以利用sql报错帮助进行sql注入,这里以sql server 为例: sql查询时,若用group by子句时,该子句中的字段必须跟select 条件中的字段(非聚合函数)完全匹配,如果是se ...

  8. 导入sql文件报错:MySQL server has gone away 以及解决方法

    项目场景: 导入sql文件报错:MySQL server has gone away 以及解决方法 问题描述: 在我们使用mysql导入大文件sql时可能会报MySQL server has gone ...

  9. python连接SQL报错:1366, Incorrect string value: '\\xF0\\x9F\\x98\\x81'

    问题描述:Python从百度地图抓取消息保存到MySQL数据中,对应数据库字段为varchar以及TEXT,字符编码utf-8.部分插入成功,部分插入失败,报错如下. error:1366, &quo ...

最新文章

  1. oracle merge
  2. Android:四种启动模式分析
  3. 【数据结构】对排序的综合总结
  4. 数据结构(严蔚敏)之二——链表的c语言实现
  5. html dom 替换节点,从javascript dom文本节点替换
  6. c语言 结构体里使用动态数组_PHP 语法六数组使用及内部结构
  7. Linux安装 Screen出现的问题
  8. CNN/RNN TF1.4
  9. 微信生态下的营销洞察
  10. Spark源码剖析(一):如何将spark源码导入到IDEA中
  11. assimp android build,使用Android Studio+CMakeLists编译assimp
  12. 贝叶斯分析好坏_玩转贝叶斯分析
  13. matlab中画花瓣,matlab花瓣图的编程原理是什么,向天下大侠求解!!!!给力的? 爱问知识人...
  14. 《MLB棒球创造营》:走近棒球运动·坦帕湾光芒队
  15. 地图学:专题地图制作详细步骤
  16. python独立样本t检验 图_Graphpad 分析教程 | 手把手教你玩转独立样本 t 检验
  17. DVB-S2 DVB-S2X DVB-DSNG 发射机 接收机FPGA IP
  18. androidP Surface到SurfaceFlinger -->surface -> BufferQueue(一)
  19. OMA DRM 1.0 – OMA Download 框架
  20. kubernetes开发环境的比较

热门文章

  1. Microsoftnbsp;Projectnbsp;2010…
  2. cssbefore图片大小_css :after和:before
  3. layer.confirm弹窗垂直居中问题
  4. 不要抱怨电脑网速慢,只能怪自己不会调快网速
  5. 电脑开机卡在欢迎界面进不去?解决办法。
  6. 宏观框架-海通梁中华-01)
  7. 正点原子Linux 触摸芯片改成GT911后的驱动修改(单点和多点触摸)
  8. 1005. 存款收益
  9. Linux在线安装Redis
  10. java 杀死僵死的线程_Ubuntu中找到并杀死僵尸进程