關於省,市,區聯動 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