mybatis批量插入insert时报错

Posted 林夕Emma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

  

  

  

 

以上是关于mybatis批量插入insert时报错的主要内容,如果未能解决你的问题,请参考以下文章

mybatis执行insert方法向数据库插入数据时,报空指针求

MyBatis 批量插入获取自增 id 问题解决

MyBatis批量插入返回主键报错

Mybatis 批量更新 ORA-00911: 无效字符的错误

mybatis 插入空值时报错 TypeException

MyBatis批量插入几千条数据,请慎用foreach