关于省,市,区的三级联动后台的实现有两种方式:

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;
}

当然我这里用的是遍历的方式来实现这种方式,也可以用递归的方式来实现这种业务;

关于省,市,区联动 java 实现方式的更多相关文章

  1. html实现 省——市——区三级联动

    html实现  省——市——区三级联动 html中实现三级联动是一个不错的demo,博主在这里跟大家分享一下实现的过程,以及自己在过程中出现的一些问题,仅供参考. 首先我们将全国的省市区数据导入进来, ...

  2. 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...

  3. StoreType.java 存储方式

    StoreType.java 存储方式 http://injavawetrust.iteye.com package com.iteye.injavawetrust.miner; /** * 存储方式 ...

  4. SpringBoot学习(三)-->Spring的Java配置方式之读取外部的资源配置文件并配置数据库连接池

    三.读取外部的资源配置文件并配置数据库连接池 1.读取外部的资源配置文件 通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法: @Configuration ...

  5. SpringBoot学习(二)-->Spring的Java配置方式

    二.Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @Bean Spring的Java配置方式是通过 @ ...

  6. Spring 的java 配置方式

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1@Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration 和 @ ...

  7. 使用Java API方式的MapReduce练习

    众所周知,hadoop生态圈的多数组件都是使用java开发的. 那么使用Java API方式实现起来,显得要比其它语言效率更高,更原生态. 前面有一个Hadoop学习笔记02_MapReduce练习 ...

  8. Spring的Java配置方式—@Configuration和@Bean实现Java配置

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @BeanSpring的Java配置方式是通过 @Configuration 和 @Be ...

  9. spring的Java注解方式

    以往我们在使用spring的时候都是用一堆<>这个玩意(尖括号)的xml文件来配置spring,在xml里都是"xxx"来配置需要的内容信息,在"" ...

随机推荐

  1. 设计神器 - 摹客设计系统上线了 | 晒出你的设计规范,赢iPad Pro!

    在国内,设计规范也许还是个不太常用的概念,但是如果你正好有参与互联网公司的产品设计,你应该早就已经体会到设计规范的重要性了.UI设计师总是要花费大量的时间和精力向开发描述一大堆设计细节,但是产品最后呈 ...

  2. Redis可以作为简单搜索引擎优化查询

    在日常开发中在遇到一些大数据量的查询的时候,其实可以换种思路采用redis事先都缓存起来,然后通过redis里面进行结果集的运算. 原来的做法可能是 查询SQL太复杂,然后将SQL进行拆分成多个子SQ ...

  3. IIS 6 备忘

    用IIS7久了, 回到IIS6 总被搞混,所以记录下,以备忘记. 以下是转载和整合了他人的资源,原出处不详.   IIS Web 服务器的权限设置有两个地方,一个是 NTFS 文件系统本身的权限设置, ...

  4. 构造函数constructor 与析构函数destructor(四)

    拷贝构造函数:拷贝构造函数就是在用一个类对象来创建另外一个类对象时被调用的构造函数,如果我们没有显示的提供拷贝构造函数,编译器会隐式的提供一个默认拷贝构造函数. 拷贝构造函数的定义是X(const X ...

  5. Django入门与实践-第20章:QuerySets(查询结果集)(完结)

    http://127.0.0.1:8000/boards/1/ #boards/models.py from django.utils.text import Truncator class Topi ...

  6. Robotframework-Appium 之常用API(二)

    续接上一文,更多API详细如下: 注:更多官方详情信息见 http://robotframework.org/robotframework/ 28. Name: Install App Source: ...

  7. CentOS7 Docker 安装

    CentOS7 已经内置了docker ,可以直接安装 安装Docker 命令: sudo yum install -y docker  启动docker  命令: service docker st ...

  8. Android 一个应用多个桌面图标

    理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER: 在Android 应用程序开发过程中,Activity入口会增加: a ...

  9. Autofac创建实例的方法总结[转]

    1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component so tha ...

  10. Android开源库集合(控件)

    RecycleView: RecycleView功能增强 https://github.com/Malinskiy/SuperRecyclerView RecycleView功能增强(拖拽,滑动删除, ...