本次在提供一个关于解决批量导入由于数据量过多,会报出参数过多,我们应该清楚一个问题,sqlserver导入数据时,允许的最大sql长度是3000个字符,但当我们数据过多,及时是使用batch结合事务处理已然会爆掉,实际上我们还可以用另一种方式,将文件生成到数据库所在的服务器上,然后通过数据库本身的备份恢复机制将数据导入到db中,下面是具体操作代码
环境:spring boot-maven-mybatis-sqlserver-tomcat
一、在service实现中创建含有导入数据的文件
@Service public class DemoServiceImpl extends ServiceImpl<DemoMapper, Demo> implements DemoService { @Resource private DemoMapper dmapper; @Override public void insertDemo(List<Demo> demoList) throws Exception { if(ToolUtil.isNotEmpty(demoList)) { try{ //生成存储过程TXT start Demo demo = new Demo(); Demo testDemo = null; String filename = "D:/"+demoList.get(0).getFileId()+"demoFileName.txt"; File newFile = new File(filename); StringBuffer sb = new StringBuffer(); for(int i=0;i<demoList.size();i++){ testDemo = demoList.get(i); ToolUtil.copyProperties(testDemo, demo); sb.append(StringUtil.null2String(demo.filed1())).append(","); sb.append(StringUtil.null2String(demo.filed2())).append(","); sb.append(StringUtil.null2String(demo.filed3())).append("*"); } Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile), "UTF-8")); writer.write(sb.toString()); writer.flush(); writer.close(); //生成存储过程TXT End //调用存储过程 dmapper.insertTxt(filename,"demoFileName"); } catch (Exception e) { throw e; } } } }
二、StringUtil工具类
public class StringUtil { /** * null或""转换String "" * * */ public static String null2String(String str){ if(str==null||"".equals(str)) { return ""; } return str; } } 三、dao.xml中加入调用读取文件的sql <select id="insertTxt"> exec dbo.txt_insert @filename =#{filename},@tablename = #{tablename} </select>
四、执行导入的slq语句
ALTER procedure [dbo].[txt_insert] @filename nvarchar(100), @tablename nvarchar(100) AS exec(' bulk insert ' + @tablename + ' from ''' + @filename + ''' WITH ( FIELDTERMINATOR = '','',--列分割符 ROWTERMINATOR = ''*'',--行分割符 FIRSTROW = 1 , --指定要加载的第一行的行号。默认值是指定数据文件中的第一行 CHECK_CONSTRAINTS );')