• mybatis批量插入insert时报错


    报错信息:

    传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为2100

    错误分析:

    由于mybatis拼接的sql语句参数过多导致

    解决办法:

    不用mybatis的批处理

    ①配置文件  applicationContext-mybatis.xml

      <!-- 解决mybatis批处理insert -->
        <bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
            <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
            <constructor-arg name="executorType" value="BATCH" />
        </bean>

    ②service层注入 

        @Autowired
    	private SqlSessionTemplate sst;
    

    ③自己封装的方法,在service曾,用于批量insert

    	public Boolean insert(List<PDA_JWL_INTERFACE_H> inList,String zyh){
    		// 新获取一个模式为BATCH,自动提交为false的session
    		// 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
    		SqlSession session = sst.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
    		moMapper= session.getMapper(MOMapper.class);
    		Map<String,Object> cc = new HashMap<>();
    		
    		try {
    			for (PDA_JWL_INTERFACE_H in : inList) {
    				moMapper.insert(in);
    			}
    			cc.put("zyh", zyh);
    			moMapper.call(cc);
    			session.commit();
    			//清理缓存,防止溢出
    			session.clearCache();
    			return true;
    		} catch (Exception e) {
    			session.rollback();
    			return false;
    		} finally {
    			session.close();
    		}
    	}
    

    ④controller中调

    	/**
    	 * 提交汇总
    	 */
    	@RequestMapping(value="/tj", method = RequestMethod.POST,produces="application/json;charset=utf-8")
    	@ResponseBody
    	public Map<String,Object> tj(@RequestBody List<PDA_JWL_INTERFACE_H> tList,HttpServletRequest req){
    		
    		//封装返回值的map
    		Map<String,Object> m = new HashMap<>();
    		
    		
    		//解密认证
    		String token = req.getParameter("token");
    		String tk = MD5Utils.encode(CREKEY);
    		System.out.println(tk);
    		if(!token.equals(tk)){
    			m.put("flag",Code.FLAG1.getIndex());
    			m.put("erroCode", Code.ERROR1.getIndex());
    			m.put("content", "");
    			return m;
    		}
    		//存放要放到中间表里的数据
    		List<PDA_JWL_INTERFACE_H> inList = new LinkedList<>();
    		
    		//作业号,用UUID生产,唯一编号,区分作业类型
    		
    		//Long t1 = System.currentTimeMillis();
    		
    		String zyh = UUID.randomUUID().toString();
    		try {
    			for (PDA_JWL_INTERFACE_H t : tList) {
    				
    				PDA_JWL_INTERFACE_H in = new PDA_JWL_INTERFACE_H();
    				
    				//作业号
    				in.setZYH(zyh);
    				//制单人号:默认当前登陆的ID(必填,不显示)
    				in.setZDRH(t.getZDRH());
    				//事物类型:默认“采购入库”(必填,不显示)
    				in.setSWLX(t.getSWLX());
    				//供应商号:必填,不显示
    				in.setGYSH(t.getGYSH());
    				//供应商:视图中公司号与本作业公司号相同
    				in.setGYS(t.getGYS());
    				//公司号:必填,不显示
    				in.setGSH(t.getGSH());
    				//仓库号:必填,不显示
    				in.setCKH(t.getCKH());
    				//仓库:视图中操作员号与当前登陆ID相同
    				in.setCK(t.getCK());
    				//新仓库号
    				in.setXCKH(t.getXCKH());
    				//新仓库
    				in.setXCK(t.getXCK());
    				//领用人
    				in.setLYR(t.getLYR());
    				//新库位号
    				in.setXKWH(t.getXKWH());
    				//新库位
    				in.setXKW(t.getXKW());
    				//采购类型:必填
    				in.setCGLX(t.getCGLX());
    				//采购人:必填
    				in.setCGR(t.getCGR());
    				//库位号:必填,不显示
    				in.setKWH(t.getKWH());
    				//库位:视图中仓库号与本作业仓库号相同
    				in.setKW( t.getKW());
    				//行号:自动生成本作业中不重复的序号。app端传过来
    				in.setHH( t.getHH());
    				//物品号:输入物品号后直接返回对应值,需要完全匹配。视图中公司号、物品类型与本作业公司号、采购类型相同。(必填)
    				in.setWPH(t.getWPH());
    				//物品名称:显示、不可编辑
    				in.setWPMC(t.getWPMC());
    				//规格:显示、不可编辑
    				in.setGG(t.getGG());
    				//单位:显示、不可编辑
    				in.setDW(t.getDW());
    				//生产批号:输入关键字后弹窗选择。
    				in.setSCPH(t.getSCPH());
    				//等级:默认 一等品(必填)
    				in.setDJI(t.getDJI());
    				//数量:必填
    				in.setSL(t.getSL());
    				//件数:非必填
    				in.setJS(t.getJS());
    				//单价:非必填,如果是空或0,只提示,不控制后续操作。
    				in.setDJ(t.getDJ());
    				//金额:单价*数量,不可编辑。
    				in.setJE(t.getJE());
    				//币别码:默认   RMB(必填)
    				in.setBBM(t.getBBM());
    				//税率:默认  0.17(必填)
    				in.setSLV(t.getSLV());
    				//一级部门
    				in.setYJBM(t.getYJBM());
    				//盘点来源
    				in.setPDLY(t.getPDLY());
    				//批号
    				in.setPH(t.getPH());
    				
    				inList.add(in);
    				
    			}
    			Boolean flag = moService.insert(inList,zyh);
    			if(!flag){
    				int i = 1/0;
    			}else{
    				/*Long t2 = System.currentTimeMillis();
    				System.out.println(t2-t1);*/
    			}
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    			m.put("flag",Code.FLAG1.getIndex());
    			m.put("erroCode", Code.ERROR2.getIndex());
    			m.put("content", "");
    			return m;
    		}
    		m.put("flag",Code.FLAG.getIndex());
    		m.put("erroCode", "");
    		m.put("content", "");
    		return m;
    	}
    	
    

    ⑤映射文件中xxxMapper.xml

    	<!-- 提交 -->
    	<insert id="insert" parameterType="PDA_JWL_INTERFACE_H" >
    	  insert into PDA_JWL_INTERFACE_H ( 
    	  
    	  ZYH,ZDRH,SWLX,SWRQ,GYSH,GYS,GSH,CKH,CK,XCKH,
    	  XCK,LYR,XKWH,XKW,CGLX,CGR,KWH,KW,HH,WPH,
    	  WPMC,GG,DW,SCPH,DJI,SL,JS,DJ,JE,BBM,
    	  SLV,YJBM,PDLY,PH
    	  
    	  ) values
    	  
    	  (#{ZYH}, #{ZDRH}, #{SWLX},getdate(), #{GYSH},
     	   #{GYS}, #{GSH},#{CKH}, #{CK},#{XCKH}, 
     	   #{XCK},#{LYR},#{XKWH},#{XKW},#{CGLX}, 
    	   #{CGR}, #{KWH},#{KW}, #{HH}, #{WPH},
    	   #{WPMC}, #{GG},#{DW}, #{SCPH}, #{DJI},
    	   #{SL}, #{JS},#{DJ}, #{JE}, #{BBM},
    	   #{SLV},#{YJBM},#{PDLY}, #{PH})
    	 
    	</insert>
    

      

      

      

  • 相关阅读:
    使用log4j在javaweb中实现日志管理
    android 开发:使用SwipeRefreshLayout实现下拉刷新
    android 开发:保存图片到SD卡上
    android 开发:网页爬虫获取腾讯财经滚动新闻
    android 开发:Json的发送和接收
    安卓学习笔记之新浪微博开发(一)
    android之webview使用
    Android 使WebView支持HTML5 Video(全屏)播放的方法
    委托
    八月的第一场雨
  • 原文地址:https://www.cnblogs.com/ccEmma/p/8289277.html
Copyright © 2020-2023  润新知