報錯信息:
傳入的表格格式數據流(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>
