导入批量数据一次查询将数据的编码重复的查出来

2 篇文章 0 订阅
2 篇文章 0 订阅

导入批量数据将数据分组

在导入数据操作中,我们通常会计入日志,有必要的话还会显示在前台告知导入者共计导入或新增或更新了多少
条数据,而在此之前我们根据导入数据的编码来查询数据库的本来存不存在,再来匹配数据是更新还是新增,一般我们新手做法是用一个for循环去查询,这样是可以解决问题,但这样查一次就会连接一次数据库,对其性能损耗很大,所以一次查询出结果是很有必要的.

我这是被安排的任务是完成批量导入数据功能能,但导入的数据如果有编码重复的,就在前台给用户选择哪些是要覆盖的,哪些不导入.这里的重点就是”查一次”.

流程图

Created with Raphaël 2.1.0 解析上传文件得到所有数据,创建HashMap 得到allList(全部数据) 查询sql得到codeExistList(编码存在的数据) 匹配操作(两个集合的code是否相等) 添加入可更新组(将查到数据的id赋给解析后的数据) 存入HashMap,存入session,将编码重复数据传回前台 执行导入操作(导入数据有id的为更新) 添加入可新增组 yes no

哈哈,第一次用MarkDown,强行给自己加戏,见谅!鞠躬!好了接下来是重点!

一次查询全部数据的sql

其实就是in

select * from 表 where code in(item1.code,item2.code,…);

但是!数据库查询里in函数里只最多有999个元素,所以传过来的List参数需要进行处理:
splitList ()方法可以直接拿过去;


@Override
    public List <ReportDisplayInfo> checkCodeIsRepetition (List <ReportDisplayInfo> reportDisplayinfoCodes)
    {
        List <ReportDisplayInfo> result = new ArrayList <ReportDisplayInfo> ();
        List <List <ReportDisplayInfo>> checkCodeIsRepetitionList = new ArrayList <List <ReportDisplayInfo>> ();
        // 数据库的in函数最大能处理999的长度
        checkCodeIsRepetitionList = splitList (reportDisplayinfoCodes, Integer.valueOf (999));
        result = _displayInfoMapper.checkCodeIsRepetition (checkCodeIsRepetitionList);
        return result;
    }

    public static <E> List <List <E>> splitList (List <E> targetList, Integer splitSize)
    {
        if (targetList == null)
            return null;
        Integer size = targetList.size ();
        List <List <E>> resultList = new ArrayList <List <E>> ();
        if (size <= splitSize)
        {
            resultList.add (targetList);
        }
        else
        {
            for (int i = 0; i < size; i += splitSize)
            {
                // 用于限制最后一部分size小于splitSize的list
                Integer limit = i + splitSize;
                if (limit > size)
                {
                    limit = size;
                }
                resultList.add (targetList.subList (i, limit));
            }
        }
        return resultList;
 }

接口方法及mapper文件中的sql

@Param注解请务必加上,不加框架不认识它

 public List <ReportDisplayInfo> checkCodeIsRepetition (@Param ("reportDisplayinfoCodes") List <List <ReportDisplayInfo>> reportDisplayinfoCodes);

由于对参数做了处理变成List <List <E>>类型,所以这变成了双重foreach循环

<select id="checkCodeIsRepetition" resultType="ReportDisplayInfo" parameterType="java.util.List">
        select <include refid="reportDisplayInfo" />
        from BR_ReportDisplayInfo  
        where REPORTDISPALYCODE in 
            <foreach collection="reportDisplayinfoCodes" index="index" item="codeList" separator=" OR REPORTDISPALYCODE IN " >  
                <foreach collection="codeList" index="index" item="info" open="(" separator="," close=")">  
                     #{info.displayCode}  
                </foreach>   
            </foreach>  
    </select>

分组

//allImportData是解析出来的全部数据,temp是数据库中的存在和本次解析数据的code相同的数据
temp = _reportDisplayInfoService.checkCodeIsRepetition (allImportData);
if (CollectionUtils.isNotEmpty (temp))
                {
                    reportDisplayInfoOKButCode = true;
                    // 筛选出可新增数据(分组[可增加数据,选择更新的数据])
                    for (ReportDisplayInfo reportDisplayInfo : allImportData)
                    {
                        int index = 0;
                        for (ReportDisplayInfo reportDisplayInfo2 : temp)
                        {
                            //code匹配上的,加上id属性,以后记日志时可以以此为条件判断它是新增还是更新
                            if (reportDisplayInfo.getDisplayCode ().equals (reportDisplayInfo2.getDisplayCode ()))
                            {
                                reportDisplayInfo.setId (reportDisplayInfo2.getId ());
                                codeRepetitiveData.add (reportDisplayInfo);
                                break;
                            }
                            else
                            {
                                index++;
                                if (index == temp.size ())
                                {
                                    normalData.add (reportDisplayInfo);
                                }
                            }
                        }
                    }
                }
                else
                {
                    normalData.addAll (allImportData);
                }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、在项目操作前建议先建立或打开一个项目,项目中有当前图形的配置信息。 2、展实测点功能,外业采集的数据DAT文件,编码为589,105,110或为JZD的数据将被当做实测点,实测点有专门的符号表示,其他点位用一般的点表示,能自动生成实测界址点及对应点号对照表。 在菜单中可以展点位的代码和原始点号,据此可以判断该点是否为灰桩和水泥桩等。当需要删除点号注记时请切换到展点位状态。 界线刷子。界线刷子可以将CAD图上的2D或3D多段线刷成各种界址线。在刷界线的时候,原界址线的属性将被完整的复制,同时原线中的0长度节点将自动被删除,当某些老线无法注记边长时,多为此原因引起,此时,可以采用自身刷自身解决问题。 刷子在使用时逆时针的界址线将自动被刷为顺时针。 4、一个完整的宗地上好后,可以在软件中注记删除宗地内部界址点号;注记删除界线边长;注记删除宗地名称。有多个选项的操作可具体参照CAD命令行提示。 5、一个村、一个镇、一个县完成后,应用相应的行政界线依照接边的宗地绘制行政界线,行政界绘好后可以进行按村、按乡、按县依据规程细则进行界址点号重排并注记,在重排界点时要依照由高级到低级的顺序重排,重排号的点号自动注记在图上。 界址线的属性比较多,宗地的预编号一定要正确不可重复,对于大宗地套小宗地(如国有地)时注记的面积会自动减去界线内的其他宗地,一些自动获取的信息,如宗地的建筑密度,容积率等,目前不支持,待做使用权时会升级支持。 7、界址点的属性项少但要求高,每个界址点必须依附一个宗地存在,不可从其他宗地复制添加,且要用程序本身的添加界点功能添加,当需要将已编好的界线改变预编号时,系统会自动更新界址点的归属宗地,但外部复制的点不会更新此信息。界址点在上指界人时要先读取一下界点,查看该界点归属于那个宗地,在以此为参照编辑其他信息,如界线的内、外、中。 7、界址点由于在图上是零散的,因此由于软件或作业员的原因,很容易造成错误的发生,可以做如下检查:(1)界线属性是否遗漏(2)检查是否复制了外部界址点(3)由于接边拼图造成的界址点重复(3)位置很近但不重合的界点(4)捕捉不到位造成的点不在线上的界址点。检查后双击显示条可定位到该点。 8、界址点的批量编辑功能内外业均可使用。属性编辑后批量写回属性时一定要检查部分点属性是否已更新,否则不可在CAD中存盘。 草图绘制,程序使用了多种方法输出草图,可以输出PDF格式(清晰),输出DWG、DXF、JPG、WORD。也可以用程序单独打开一个DXF文件,另存为JPG、BMP等格式的图片。程序有许多输出选项,参照选项输出即可。 省厅细则上的地籍调查表可以完整的输出,可以减少大量的检查和填表工作,即使将调查表转抄也可节省大量的人员。 9、若需要整体重排界址点号,图上的草图需要删除,因为草图上的界点会影响点号重排。 10、因软件的升级,请在使用前将图上的点号注记、边长注记、宗地注记删除,以使用新的程序规则。 11、宗地界和国有界的属性编好后,对界线进行重构,然后在拓扑检查中检查界线是否封闭,是否自交,是否反向,是否有缝隙,点线是否矛盾;对于0面积的宗地多为界线绘制不规范或冗余点造成,用户可重新指定界线起点或用BOUNDARY重新生成一条线,用界线刷刷一下。 12、一般界线封闭检查比较直观,点线矛盾更准确,两者结合使用,可杜绝宗地间的小缝隙,为入库做好质量保证。 13、使用本软件编辑的图形可以按县界、乡界、村界、宗地界、国有界、界址点分层分类导入苍穹建库软件,原CAD中编辑的属性信息可完整输出,现在建库尚早,软件编写时仅实验性的导出了部分属性,用户可验证软件的功能。 14、本软件可以生成DWG格式的电子版地籍调查表,要求提供打印成果的可直接批量打印即可,宗地信息统计表,争议宗地统计表,实测界点成果表等多种表格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值