mybatis批量插入insert時報錯
阿新 • • 發佈:2018-01-15
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時報錯