e代剑客——温柔一刀

生活就像海洋,只有意志坚强的人,才能到达彼岸

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  76 随笔 :: 7 文章 :: 215 评论 :: 0 Trackbacks
开发采用spring+ibatis,数据库用oracle,数据量有几千万以上,而且还要不断的增多,用了三层子查询实现分页控制

下面都只是举的例子
 1 < sqlMap  namespace ="Y_wjlx" >  
 2
 3          < resultMap  class ="com.ctgusec.model.Y_wjlx"  id ="y_wjlx" >  
 4                  < result  property ="wjbh"  column ="wjbh"   />  
 5                  < result  property ="wjmc"  column ="wjmc"   />  
 6          </ resultMap >  
 7          < select  id ="getAllY_wjlx"  resultMap ="y_wjlx" >  
 8                  <![CDATA[                         
 9                 SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start# 
10                  ]]>  
11          </ select >  
12
13 </ sqlMap >  

用了个模型基类存储分页参数,模型类可以继承此类
public   class  BaseModel 

        
private  Integer start  =   0

        
private  Integer end  =   30

        
private  Integer size  =   30

        
private  Integer currentPage; 

        
private  Integer priviousPage; 

        
private  Integer nextPage; 

        
public  BaseModel() 
                
        }
 
        
public  BaseModel(Integer currentPage) 
                
if  (currentPage  >   0
                        
this .currentPage  =  currentPage; 
                        
this .priviousPage  =  currentPage  -   1
                        
this .nextPage  =  currentPage  +   1
                        
this .start  =  priviousPage  *  size; 
                        
this .end  =  currentPage  *  size; 
                }
 
        }
 

        
// 省略geter、serter方法 
}
 

dao层:
1public class SqlY_wjlxDao extends SqlMapClientDaoSupport implements IY_wjlxDao 
2
3        public List getAllY_wjlx(Y_wjlx y_wjlx) 
4                
5                return this.getSqlMapClientTemplate().queryForList("getAllY_wjlx", y_wjlx);                
6        }
 
7}
 
8

控制层:spring控制类实现分页
 1 public   class  Y_wjlxListAllController  extends  AbstractController 
 2
 3         Integer currentPage ; 
 4         
 5          // y_wjlx类继承BaseModel类 
 6         Y_wjlx y_wjlx; 
 7
 8         @Override 
 9          protected  ModelAndView handleRequestInternal(HttpServletRequest request, 
10                         HttpServletResponse response)  throws  Exception 
11                 String page  =  request.getParameter( " page " ); 
12                  if  (page  ==   null   ||  page.equals( " head " )) 
13                         currentPage = 1
14                         y_wjlx  =   new  Y_wjlx(currentPage); 
15                         request.getSession().setAttribute( " currentPage " , currentPage); 
16                 }
 
17                  if  ( " privious " .equals(page)) 
18                         currentPage  =  (Integer) request.getSession().getAttribute( " currentPage " ); 
19                          if (currentPage > 1 ) currentPage  -=   1
20                         y_wjlx  =   new  Y_wjlx(currentPage); 
21                         request.getSession().setAttribute( " currentPage " , currentPage); 
22                 }
  else   if  ( " next " .equals(page)) 
23                         currentPage  =  (Integer) request.getSession().getAttribute( " currentPage " ); 
24                         currentPage  +=   1
25                         y_wjlx  =   new  Y_wjlx(currentPage); 
26                         request.getSession().setAttribute( " currentPage " , currentPage); 
27                 }
 
28                 List list  =   this .drv_Manager.getAllY_wjlx(y_wjlx); 
29                  return   new  ModelAndView( " y_wjlxList " " list " , list); 
30         }
 
31
32          private  IDrv_Manager drv_Manager; 
33
34          public   void  setDrv_Manager(IDrv_Manager drv_Manager) 
35                  this .drv_Manager  =  drv_Manager; 
36         }
 
37 }

jsp页面分页调用
1 < button  onclick ="location.href  =  'y_wjlxList.shtml?page=head'" > 首&&页 </ button >     
2 && 
3 < button  onclick ="location.href  =  'y_wjlxList.shtml?page=privious'" > 上一页 </ button >     
4 && 
5 < button    onclick ="location.href='y_wjlxList.shtml?page=next'" > 下一页 </ button >

实现了分页,而且前面的数据查询翻页效率很高,但是越到后面越慢(这个好象是没有办法的)

现在的问题是:
1、spring控制类太累赘,好象做了它不该做的事情,翻页控制有没有比较好的办法抽到服务层?
2、翻页也只有:首页、上页、下页;想把最后一页也弄出来,但是担心效率太低,首先要统计数据总数,还有就是三层子查询到了几千万数据后效率就慢了。
有没有比较好的解决办法?

posted on 2006-08-30 10:06 温柔一刀 阅读(6431) 评论(23)  编辑  收藏 所属分类: 开源框架数据库相关

评论

# re: spring、ibatis控制oracle分页的问题 2006-08-30 11:25 Tendy
--
实现了分页,而且前面的数据查询翻页效率很高,但是越到后面越慢(这个好象是没有办法的)
--
如果一个 table 有几千万数据,谁去翻页……搜索好了  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 11:46 zeroblue
看hibernate的源代码,看丫是怎么翻页的。
我没仔细看过,但相信会有提示。  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 13:10 温柔一刀
@zeroblue
hibernate调用到了最后也就是三层子查询了
SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#
  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 13:11 温柔一刀
@Tendy
您说的有道理
但是客户有要求
人家是上帝啊  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 14:05 boddi
SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#
中的select wjbh,wjmc,rownum rn from y_wjlx不会造成很大的效率问题吗?  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 14:18 why
老大,你的代码真是丑陋,看着真累  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 14:26 温柔一刀
@why
Sorry,影响了您的视觉,偶也知道很丑陋,想改进它,谢谢您  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-30 14:27 温柔一刀
@boddi
这个应该算效率比较高的查询了  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-31 18:21 boddi
SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#
在SQLSERVER中无法实现啊!请问SQLSERVER有何高招吗?谢谢
  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-08-31 19:09 温柔一刀
@boddi
这个语句只能在oracle用
SQLSERVER应该也有类似的实现
您可以google一把看看  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-09-02 15:02 Jude Zhu
<br>SELECT
<br> wjbh,
<br> wjmc
<br>FROM (
<br> SELECT
<br> ROW_NUMBER (OVER wjbh ASC) AS ROWNUMBER
<br> wjbh,
<br> wjmc
<br> FROM y_wjlx
<br>)
<br>WHERE ROWNUMBER < #end#
<br> AND ROWNUMBER > #start#
  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-09-04 12:20 kimsoft
不错,希望再写一些spring+ibatis方面的blog  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-09-04 13:23 黄奕福
这样简单一些吧:
select * from
(
select rownum rownum__, t.* from mytable t where rownum < #start#
)
where rownum__ > #end#;  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-09-13 08:24 javarwx
这个分页和我们用ibatis开发的一个项目中分页的写法一样,如果不需要对数据排序的话建议可以不要用三层嵌套,可以只用两层嵌套查询,这样或许会提高些速度

只是我现在一直不是很明白ibatis提供的SqlMapClientImpl SqlMapDaoTemplate SqlMapSessionImpl这三个类有什么不同,希望指教

QQ:66116103  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-09-13 10:18 温柔一刀
@javarwx
看了下源码,SqlMapClientImpl ,SqlMapSessionImpl实现了同一个父类,我也没有搞清楚,惭愧,另外,好象没有SqlMapDaoTemplate 这个类吧,待我在仔细研究下源码,谢谢您的建议  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-10-15 17:00 曲静波
@Tendy
如果一个 table 有几千万数据,谁去翻页……搜索好了

有道理.但如果要是可以选择页码,链出末页,效率显然就低了~  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2006-10-15 17:01 曲静波
应该不会低很多,客户应该从易用性角度考虑.  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2007-01-12 10:25 ♂蜜蜂㊣仔仔gz
代码不能重用,应以复用未主要开发目的。分页嵌套比较正常,效率不会降低多少,复用应该是以参数形式传入sql,动态字段实现select count(1) from table 总量计算,当前页面计算等工作,最好以标签形式嵌套页面,免去维护问题。总的来说做的是不错的。  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2007-04-10 11:47 rjbj
请问用mysql,该怎么写?谢谢。  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2008-04-21 20:28 soei
蜜蜂㊣仔仔gz
说的对,
跟我现在做的一样,花几天时间debug ibatis的源码,做出来效果不错  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2008-05-19 18:31 asd
rdthert  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 2008-05-19 18:32 asd
aaaaaaaaaaaaaaaaa  回复  更多评论
  

# re: spring、ibatis控制oracle分页的问题 [未登录] 2008-05-19 18:35 java爱好者
您好!最近在学ibatis,想用spring+ibatis做个分页,但我发现了个问题,就是
SELECT wjbh,wjmc FROM (SELECT row_.*, rownum rownum_ FROM (select wjbh,wjmc,rownum rn from y_wjlx) row_ WHERE rownum <= #end#) WHERE rownum_ > #start#

假如页面上有很多的查询条件,有的值用户可以输入,也可不输入,你这里的sql语句不就不能在改变了,我觉得sql语句应该是动态的才好!但这样是不是就不能满足动态变sql,我是Ibatis初学者,不知道有什么好的解决方案?请赐教
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
 
联系偶 zhupanjava@gmail.com 温柔一刀