有两张表A、B。
A有500条记录,B有500乃至更多条,查询A表所有记录封装成List;
现根据A表的ID查询B表中对应的记录,那么
List<A> listA = getObjects(A.class);
for(A a : listA){/*循环查询数据库*/
B b= getObjectById(a.getId());
map.put("A",a.name);
map.put("B",b.time);
}
List<B> listB = getObjects(B.class);
for(A a : List<A>){
for(B b : List<B>){
if(a.getId() == b.getAid())
map.put("A",a.name);
map.put("B",b.time);
}
}
这两种方式哪个效率高
List<A> listA = getObjects(A.class);
Map<Long,Object> mapA = new HashMap<String,Object>();
/*这里map的key是Object中的某一字段的类型,可以是int,string,long之类的*/
for(A a : listA){
mapA.put(a.getId(),a);
}
List<B> listB = getObjects(B.class);
Map<String, Object> A_B = new HashMap<String, Object>();
for(B b : listB){
A a = mapA.get(b.getAId());
A_B.put("B",b);
A_B.put("A",a);
}
/*这样就避免了N次查询数据库,提高执行效率了*/
显然是第一种高效,嵌套循环明显次数更多啊
我觉得是第二种。如果单纯的是代码,那的确是第一种。但是,你第一种方式是循环访问数据库!
而第二种只需一次访问!试问,你一个查询,要连续查询几百万次数据,这连接数真的无法想象。代价也是相当昂贵的!
就我工作经验而言,做过的项目中,通常要考虑的是尽量减少数据库的连接
一方面是访问数据库本身,建立连接,释放连接,对数据库本身就会造成很大的负担,而且效率很低。
能一次访问就一次访问。
另一方面SQL文的执行次数过多,也会较低效率。
这种的效率的低,跟java本身25w次循环是不能比的。
所以还是第二种好一些。
其实更好的解决方案应该是根据数据的查询要求,将两个表合并写成一个检索SQL文(两层SELECT),数据直接取得后,返回赋值。
SELECT
XXX
FROM
(SELECT XXX
FROM A
WHERE ....
) AS TEMP, B
WHERE A.ID = B.ID
....