/**
* 流式查询,全量导出
*
* @param req 查询条件
* @param size 单个文件数据最大条数
* @return
*/
@ApiOperation(value = "流式查询,全量导出")
@GetMapping("/streamAll")
public BaseResultModel streamAll(ReqBillRecordBackQuery req, Integer size) {
try {
billRecordBackService.streamAll(req, size);
} catch (Exception e) {
throw new RuntimeException(e);
}
return BaseResultModel.success();
}
以xml的方式
@Override
@Transactional
public void streamAll(ReqBillRecordBackQuery req, Integer size) throws Exception {
exportXml(req,size);
}
private void exportXml(ReqBillRecordBackQuery req, Integer size) throws Exception{
//文件内容行数
Integer in = 0;
//文件名称
Integer fileName=0;
String name = "exportTest";
String suf =".txt";
String path = "H:\\新建文件夹\\新建文件夹\\export\\";
File ff = new File(path);
//递归删除目录中的所有文件和子目录,而不删除目录本身。
FileUtils.cleanDirectory(ff);
File fe = new File(path+name+fileName+suf);
//删除此抽象路径名表示的文件或目录
//mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹
// fe.mkdirs();
//获取文件输出列
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(fe));
StringBuilder sb = new StringBuilder();
Cursor<BillRecordBack> billRecordBacks = mapper.streamAll(req);
for (BillRecordBack bil : billRecordBacks) {
sb.append(bil).append("\n");
in++;
if (in>=size){
in=0;
fileName++;
fe = new File(path+name+fileName+suf);
bufferedWriter = new BufferedWriter(new FileWriter(fe));
}
bufferedWriter.write(sb.toString());
//将StringBuilder数据重置
sb.setLength(0);
}
//最后需要自己关闭流
billRecordBacks.close();
bufferedWriter.close();
}
<select id="streamAll" resultType="com.psh.hik.entity.BillRecordBack" fetchSize="5000">
select t_id,r_id,r_time,r_number,descd,deleted,ctime,crname,mtime,chname from bill_record_back
<where>
<if test="null != param.rTime and ''!= param.rTime">
ctime = #{param.rTime}
</if>
<if test="null != param.rNumber and ''!= param.rNumber">
ctime = #{param.rNumber}
</if>
</where>
</select>
以mybatis-plus的方式
private void exportNote(ReqBillRecordBackQuery req, Integer size) throws Exception{
//lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变),AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。
//文件内容行数
AtomicInteger in = new AtomicInteger(1);
//文件名称
AtomicInteger fileName= new AtomicInteger(0);
String name = "exportTest";
String suf =".txt";
String path = "H:\\新建文件夹\\新建文件夹\\export\\";
File ff = new File(path);
//递归删除目录中的所有文件和子目录,而不删除目录本身。
FileUtils.cleanDirectory(ff);
AtomicReference<File> fe = new AtomicReference<>(new File(path + name + fileName + suf));
AtomicReference<BufferedWriter> bufferedWriter= new AtomicReference<>(new BufferedWriter(new FileWriter(fe.get())));
StringBuilder sb = new StringBuilder();
mapper.exportNote(req,resultContext -> {
try {
if (fileName.get()>=20){
return;
}
BillRecordBack resultObject = resultContext.getResultObject();
sb.append(resultObject).append("\n");
//a.incrementAndGet(); 先+1,再返回,a.getAndIncrement()先返回,再 +1
in.getAndIncrement();
System.out.println(in);
if (in.get() >=size){
in.set(0);
fileName.getAndIncrement();
fe.set(new File(path + name + fileName + suf));
bufferedWriter.set(new BufferedWriter(new FileWriter(fe.get())));
}
bufferedWriter.get().write(sb.toString());
//将StringBuilder数据重置
sb.setLength(0);
}catch (Exception e){
throw new RuntimeException(e);
}
});
bufferedWriter.get().close();
}
@Select("select t_id,r_id,r_time,r_number,descd,deleted,ctime,crname,mtime,chname from bill_record_back")
//这个注解是设定每次流式查询的iterator大小的,这里是1000条 ,ResultSetType.FORWARD_ONLY 只允许游标向下移动
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 5000)
@ResultType(BillRecordBack.class)
void exportNote(ReqBillRecordBackQuery req, ResultHandler<BillRecordBack> handler);