1. 程式人生 > >mybatis批量插入insert時報錯

mybatis批量插入insert時報錯

ssi get 拼接 back 清理 XML try inter 防止

報錯信息:

傳入的表格格式數據流(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>

  

  

  

mybatis批量插入insert時報錯