關於省,市,區聯動 java 實現方式


關於省,市,區的三級聯動后台的實現有兩種方式:

1:分三次請求各自取出 省 市 區 的數據;

2:一次請求獲得所有的數據,並且組裝成相依的數據結構到前端;

其中第一種方式:

會導致數據的延遲加載,出現的情況是 省 有數據了,市和區一級還沒有數據,導致用戶的體驗不好;這種方式只有省一級的數據可以提前加載好,市和區一級的數據只用等到選中后才開始請求;

第二種實現方式:

1):查出省--->遍歷省,查出省下面的市--->遍歷市,查出市下面的區:組好相應的數據結構;這種方式的缺點:多次查詢數據庫,市和區的數據有多少條

就會查詢多少次數據庫,這樣效率很低,在不加緩存的情況下這種的查詢中國下所有的省市區需要的時間為:18s左右

//根據id查找出最頂層對象
        TbTreeExample example=new TbTreeExample();
        example.createCriteria().andIdEqualTo(id);
        TbTree tree = tbTreeMapper.selectByExample(example).get(0);
        //查找所有的省份
        TbTreeExample provinceExample=new TbTreeExample();
        provinceExample.createCriteria().andPIdEqualTo(id);
        List<TbTree> provinces = tbTreeMapper.selectByExample(provinceExample);
        for (TbTree province : provinces) {
            //查找所有的市
            TbTreeExample cityExample=new TbTreeExample();
            cityExample.createCriteria().andPIdEqualTo(province.getId());
            List<TbTree> cities = tbTreeMapper.selectByExample(cityExample);
            for (TbTree city : cities) {
                //查找所有的區
                TbTreeExample districtExample=new TbTreeExample();
                districtExample.createCriteria().andPIdEqualTo(city.getId());
                List<TbTree> districts = tbTreeMapper.selectByExample(districtExample);
                city.setNodes(districts);
            }
            province.setNodes(cities);
        }
        tree.setNodes(provinces);
        return tree;

2):一次性查出省市區所有的數據,然后在內存中組成相應的結構給到前台:

這種方式在沒有緩存的情況下查詢的時間為:0.7-0.8s左右;

代碼如下:

TbTreeExample example=new TbTreeExample();
        List<TbTree> trees = tbTreeMapper.selectByExample(example);
        for (TbTree country : trees) {
            if(country.getId()==id){
                //獲取省
                for(TbTree province : trees){
                    if(province.getpId()==country.getId()){
                        //獲取市
                        for (TbTree city : trees) {
                            if(city.getpId()==province.getId()){
                                //獲取區
                                for (TbTree district : trees) {
                                    if(district.getpId()==city.getId()){
                                        city.getNodes().add(district);
                                    }
                                }
                                province.getNodes().add(city);
                                
                            }
                        }
                        country.getNodes().add(province);
                    }
                }
                return country;
            }
        }
        
        return null;
    }

當然我這里用的是遍歷的方式來實現這種方式,也可以用遞歸的方式來實現這種業務;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM