﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-LoveJava-LoveLife-文章分类-SQL</title><link>http://www.blogjava.net/michaellee/category/39010.html</link><description>java人生路...MichaelLee</description><language>zh-cn</language><lastBuildDate>Thu, 16 Apr 2009 11:43:15 GMT</lastBuildDate><pubDate>Thu, 16 Apr 2009 11:43:15 GMT</pubDate><ttl>60</ttl><item><title>jsp+oracle分页代码</title><link>http://www.blogjava.net/michaellee/articles/266022.html</link><dc:creator>MichaelLee</dc:creator><author>MichaelLee</author><pubDate>Thu, 16 Apr 2009 11:37:00 GMT</pubDate><guid>http://www.blogjava.net/michaellee/articles/266022.html</guid><wfw:comment>http://www.blogjava.net/michaellee/comments/266022.html</wfw:comment><comments>http://www.blogjava.net/michaellee/articles/266022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaellee/comments/commentRss/266022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaellee/services/trackbacks/266022.html</trackback:ping><description><![CDATA[<p>说明：</p>
<p>1.我的数据库名叫aaa，密码是123</p>
<p>2.确定数据库中有数据 这是查询功能+分页</p>
<p>创建数据库sql</p>
<p>CREATE TABLE users (<br />
username varchar2(100),<br />
department varchar2(100),<br />
headship varchar2(100),<br />
)</p>
<p>类放在src下的com包中</p>
<p>db.java</p>
<p>package com;</p>
<p>import java.sql.Connection;&nbsp; <br />
import java.sql.DriverManager;&nbsp; <br />
import java.sql.SQLException;</p>
<p>public class db {</p>
<p>public static Connection getConnection() throws ClassNotFoundException, SQLException&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection con = null;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("oracle.jdbc.driver.OracleDriver");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:oracle:thin:@你的ip:1521:aaa";&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con = DriverManager.getConnection(url, "SYSTEM","123");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return con;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
}</p>
<p>查询页面MyJsp.jsp</p>
<p>&lt;%@ page language="java" import="java.util.*" pageEncoding="gbk"%&gt;<br />
&lt;%@ page import="java.sql.*"%&gt;<br />
&lt;jsp:directive.page import="com.*;"/&gt;<br />
&lt;%<br />
String path = request.getContextPath();<br />
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";<br />
%&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;base href="&lt;%=basePath%&gt;"&gt;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;My JSP 'a.jsp' starting page&lt;/title&gt;<br />
&nbsp;&nbsp; <br />
&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />
&lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />
&lt;meta http-equiv="expires" content="0"&gt;&nbsp;&nbsp; <br />
&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />
&lt;meta http-equiv="description" content="This is my page"&gt;<br />
&lt;!--<br />
&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />
--&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;%!<br />
int pageSize = 5;//每页显示的记录数<br />
int pageCount = 0;//总页数<br />
%&gt;<br />
&lt;%!<br />
Connection con;<br />
Statement sql;<br />
ResultSet rs;<br />
%&gt;<br />
&lt;%<br />
try<br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; con = db.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//可滚动查询数据的结果集<br />
&nbsp;&nbsp; request.setCharacterEncoding("GB2312");<br />
&nbsp;&nbsp; rs = stmt.executeQuery("select * from users") ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.last(); //让游标到表中的最后一行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int rowCount = rs.getRow(); //获取记录总数.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount = (rowCount % pageSize == 0) ? (rowCount / pageSize ) : (rowCount / pageSize +1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int showPage = 1;//当前页<br />
//取得用户所指定的页<br />
String goToPage = request.getParameter("showPage");<br />
&nbsp;&nbsp;&nbsp; if (goToPage == null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goToPage = "1";<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //转换成整形<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showPage = Integer.parseInt(goToPage);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (NumberFormatException ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showPage = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //当前页小于等于第一页则按第一页算 如果 当前页大于等于总页数则为最后页<br />
&nbsp;&nbsp;&nbsp; if(showPage &lt;=1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showPage = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else if(showPage &gt;= pageCount){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showPage = pageCount;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //游标的位置 (当前页 - 1) * 页面大小 + 1<br />
&nbsp;&nbsp;&nbsp; int posion = (showPage -1 ) * pageSize + 1;<br />
&nbsp;&nbsp;&nbsp; //设置游标的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp; rs.absolute(posion);<br />
%&gt;<br />
&nbsp;&nbsp; &lt;table border="1"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="160"&gt;用户名&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="160"&gt;部门&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="160"&gt;职位&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />
&lt;%<br />
&nbsp;&nbsp; int i =0;<br />
&nbsp;&nbsp; //循环显示表中的数据 pageSize(每页所显示的记录)<br />
&nbsp;&nbsp; //rs.isAfterLast() 游标是否在最后一行之后说明后面已经没记录<br />
&nbsp;&nbsp; while(i&lt;pageSize &amp;&amp; !rs.isAfterLast()){<br />
%&gt;<br />
&nbsp;&nbsp; &lt;table border="1"&gt;<br />
&nbsp;&nbsp; &lt;col width="160px"/&gt;&lt;col width="160px"/&gt;&lt;col width="160px"/&gt;&lt;col width="160px"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=rs.getString("username")%&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=rs.getString("department")%&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=rs.getString("headship")%&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%rs.next();i++;}%&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />
&lt;form action="" method="get"&gt;<br />
&nbsp;&nbsp; &lt;table border="1"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;当前第&lt;%=showPage%&gt;页&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;共&lt;%=pageCount%&gt;页&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="MyJsp.jsp?showPage=1"&gt;首页&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="MyJsp.jsp?showPage=&lt;%=showPage-1%&gt;"&gt;上一页&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="MyJsp.jsp?showPage=&lt;%=showPage+1%&gt;"&gt;下一页&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="MyJsp.jsp?showPage=&lt;%=pageCount%&gt;"&gt;尾页&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt; 共&lt;%=rowCount%&gt;条记录 &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;转到<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="showPage" size="4"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" name="go" value="提交"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp; &lt;/table&gt;<br />
&lt;/form&gt;<br />
&lt;%<br />
&nbsp;&nbsp; con.close() ;<br />
}<br />
catch(Exception e)<br />
{<br />
&nbsp;&nbsp; out.println(e) ;<br />
}<br />
%&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</p>
<img src ="http://www.blogjava.net/michaellee/aggbug/266022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaellee/" target="_blank">MichaelLee</a> 2009-04-16 19:37 <a href="http://www.blogjava.net/michaellee/articles/266022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp+oracle数据库/servlet分页思想</title><link>http://www.blogjava.net/michaellee/articles/265975.html</link><dc:creator>MichaelLee</dc:creator><author>MichaelLee</author><pubDate>Thu, 16 Apr 2009 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/michaellee/articles/265975.html</guid><wfw:comment>http://www.blogjava.net/michaellee/comments/265975.html</wfw:comment><comments>http://www.blogjava.net/michaellee/articles/265975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaellee/comments/commentRss/265975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaellee/services/trackbacks/265975.html</trackback:ping><description><![CDATA[首先让我们构建一个PageControl对象将分页所涉及到的一些关键的"控制数据"予以封装.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 具体说明如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; int&nbsp;&nbsp; curPage&nbsp;&nbsp; ;&nbsp;&nbsp; //当前是第几页&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; int&nbsp;&nbsp; maxPage&nbsp;&nbsp; ;&nbsp;&nbsp; //一共有多少页&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; int&nbsp;&nbsp; maxRowCount&nbsp;&nbsp; ;&nbsp;&nbsp; //一共有多少行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; int&nbsp;&nbsp; rowsPerPage&nbsp;&nbsp; ;&nbsp;&nbsp; //每页有多少行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; yourDataType&nbsp;&nbsp; yourdata&nbsp;&nbsp; ;//装载每页的数据&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 关于每页所要显示的"实体数据"的载体，其实现方式多种多样，比如说在IBM电子商务系统MPE中是以bean的形式，这是一种面向对象的实现，比较的简略的实现可用java.util.Vector等，为了避免分散对核心问题的的注意力，这里用youDataType予以抽象.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; void&nbsp;&nbsp; countMaxPage()&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //根据总行数计算总页数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; if&nbsp;&nbsp; (this.maxRowCount&nbsp;&nbsp; %&nbsp;&nbsp; this.rowsPerPage==0){&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.maxPage&nbsp;&nbsp; =&nbsp;&nbsp; this.maxRowCount/this.rowsPerPage;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; }else{&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.maxPage&nbsp;&nbsp; =&nbsp;&nbsp; this.maxRowCount/this.rowsPerPage&nbsp;&nbsp; +&nbsp;&nbsp; 1;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; this.rowsPerPage其实应从配置文件中获得，这样做的好处是程序能在运行中读取从而实现动态（再）配置,简略的做法是直接写在程序中。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; public&nbsp;&nbsp; PageControl(yourPersistenceLayer&nbsp;&nbsp; yourPL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 这是一个参数类型为yourPersistenceLayer的构造函数.PersistenceLayer是直接同数据库打交道的一层，不同的公司都有不同的实现，比如说Microsoft的ADO就可以看作是一PersistenceLayer,IBM在其MPE系统中也实现了一个庞大的PersistenceLayer,.&nbsp;&nbsp; 一种投机的做法是不要PersistenceLayer,或者可以说是淡化该层，这样做势必降低系统的稳定性，可重用性,可扩展性。&nbsp;&nbsp; 具体可以参考附录文献.在这个构造函数中，有这样几个主要操作：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; this.maxRowCount&nbsp;&nbsp; =&nbsp;&nbsp; yourPL.getAvailableCount();&nbsp;&nbsp;&nbsp;&nbsp; //得到总行数&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; this.yourdata&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; yourPL.getResult();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到要显示于本页的数据&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; this.countMaxPage();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //计算总页数&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 关于this.yourdata这里还有一个细节：在从数据库中获取"实体数据"时,通常有两种方式:(A)一次性获取所有数据；(B)每次根据当前页号，获取本页的数据，将其它数据予以抛弃；考虑到数据往往是大量甚至是海量的，如果一次性的获取，那么这些数据必然大量占用服务器内存资源，使系统性能大大降低，因此建议使用方法（A）&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 接下来的工作就可以交给servlet和jsp了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 在servlet的service()方法中只需进行如下操作：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; PageControl&nbsp;&nbsp;&nbsp;&nbsp; pageCtl&nbsp;&nbsp; =&nbsp;&nbsp; yourBusinessObject.listData(req.getParameter("jumpPage"));&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; req.setAttribute("pageCtl",pageCtl);&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 说明：yourBusinessObject封装了商业逻辑，是位于Business&nbsp;&nbsp; Logic&nbsp;&nbsp; Layer中的一个对象，运用OOAD的方法，封装商业对象，在Persistent&nbsp;&nbsp; Layer之上组建坚实的Business&nbsp;&nbsp; Logic&nbsp;&nbsp; Layer同样是构建大型电子商务架构的关键所在。本文的关注点只是分页处理，暂不详细论述.&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 在每个想要实现翻页显示数据的jsp页面中，我们的工作也很简单,其代码是公式化的：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;jsp:useBean&nbsp;&nbsp; id="pageCtl"&nbsp;&nbsp; class="yourpackage.PageControl"&nbsp;&nbsp; scope="request"&gt;&lt;/jsp:useBean&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%if(pageCtl.maxPage!=1)){%&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;form&nbsp;&nbsp; name="PageForm"&nbsp;&nbsp; action="/servlet/yourpackage.yourservlet"&nbsp;&nbsp; method="post"&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%@&nbsp;&nbsp; include&nbsp;&nbsp; file="/yourpath/pageman.jsp"%&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;/form&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%}%&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 说明：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; if(pageCtl.maxPage!=1)实现了这样一个逻辑：如果所取得数据不足一页,那么就不用进行翻页显示。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 我们注意到&lt;%@&nbsp;&nbsp; include&nbsp;&nbsp; file="/yourpath/pageman.jsp"%&gt;这使得真正的翻页部分完全得到了重用.&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 那么pageman.jsp到底做了些什么呢？它实现了经常做翻页处理的人耳熟能详的逻辑&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; （A）第一页时不能再向前翻；&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; （B）最后一页时不能再向后翻；&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 同时能够进行页面任意跳转，具体代码如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 每页&lt;%=pageCtl.rowsPerPage%&gt;行&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 共&lt;%=pageCtl.maxRowCount%&gt;行&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 第&lt;%=pageCtl.curPage%&gt;页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 共&lt;%=pageCtl.maxPage%&gt;页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%if(pageCtl.curPage==1){&nbsp;&nbsp; out.print("&nbsp;&nbsp; 首页&nbsp;&nbsp; 上一页");&nbsp;&nbsp; }else{&nbsp;&nbsp; %&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;A&nbsp;&nbsp; HREF="javascript:gotoPage(1)"&gt;首页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;A&nbsp;&nbsp; HREF="javascript:gotoPage(&lt;%=pageCtl.curPage-1%&gt;)"&gt;上一页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%}%&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%if(pageCtl.curPage==pageCtl.maxPage){&nbsp;&nbsp; out.print("下一页&nbsp;&nbsp; 尾页");&nbsp;&nbsp; }else{&nbsp;&nbsp; %&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;A&nbsp;&nbsp; HREF="javascript:gotoPage(&lt;%=pageCtl.curPage+1%&gt;)"&gt;下一页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;A&nbsp;&nbsp; HREF="javascript:gotoPage(&lt;%=pageCtl.maxPage%&gt;)"&gt;尾页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;%}%&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 转到第&lt;SELECT&nbsp;&nbsp; name="jumpPage"&nbsp;&nbsp; onchange="Jumping()"&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%&nbsp;&nbsp; for(int&nbsp;&nbsp; i=1;i&lt;=pageCtl.maxPage;i++)&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; if&nbsp;&nbsp; (i==&nbsp;&nbsp; pageCtl.curPage){&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; %&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OPTION&nbsp;&nbsp; selected&nbsp;&nbsp; value=&lt;%=i%&gt;&gt;&lt;%=i%&gt;&lt;/OPTION&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;%}else{%&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OPTION&nbsp;&nbsp; value=&lt;%=i%&gt;&gt;&lt;%=i%&gt;&lt;/OPTION&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%}}%&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/SELECT&gt;页&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 在页面上会呈现出形如下图的外观，至于想要修饰美化，那是美工的工作所在。&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 最后附上用于页面跳转的javascript公共函数:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; function&nbsp;&nbsp; Jumping(){&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.PageForm.submit();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; ;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; function&nbsp;&nbsp; gotoPage(pagenum){&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.PageForm.jumpPage.value&nbsp;&nbsp; =&nbsp;&nbsp; pagenum;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.PageForm.submit();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; ;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; 如果他们位于名为TurnPage.js的文件中，那么在每个要实现翻页数据显示的jsp页面中加上这样的引用：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;SCRIPT&nbsp;&nbsp; Language="JavaScript"&nbsp;&nbsp; src="/yourPath/TurnPage.js"&gt;&lt;/SCRIPT&gt; 
<img src ="http://www.blogjava.net/michaellee/aggbug/265975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaellee/" target="_blank">MichaelLee</a> 2009-04-16 15:14 <a href="http://www.blogjava.net/michaellee/articles/265975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库中最常用的SQL语句</title><link>http://www.blogjava.net/michaellee/articles/265264.html</link><dc:creator>MichaelLee</dc:creator><author>MichaelLee</author><pubDate>Mon, 13 Apr 2009 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/michaellee/articles/265264.html</guid><wfw:comment>http://www.blogjava.net/michaellee/comments/265264.html</wfw:comment><comments>http://www.blogjava.net/michaellee/articles/265264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaellee/comments/commentRss/265264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaellee/services/trackbacks/265264.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="postmessage_133326">对<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=SQL">SQL</span>语句进行调整，往往有一项前期工作，就是定位最常用的SQL 语句。<font color="#0000ff"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=Oracle">Oracle</span></font><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%FD%BE%DD%BF%E2">数据库</span>可以从多个方面取得SQL语句。如从<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%FD%BE%DD">数据</span>库自身的<font color="#0000ff">存储</font>过程或者函数中取得，也可以从前台的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%D3%A6%D3%C3">应用</span><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%B3%CC%D0%F2">程序</span>中取得。所以，数据库<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%B9%DC%C0%ED">管理</span>员必须学会如何从数据库当前程序库缓存中对已经存在的SQL语句进行采样。了解当前使用最频繁的SQL语句以及其对应的资源消耗情况。只有如此，数据库管理员才能够对症下药，<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%BD%E2%BE%F6">解决</span>SQL语句执行效率不高的问题。　　在<font color="#0000ff">Oracle</font>数据库中有多种方法可以帮助数据库管理员定位常用的SQL语句。笔者在这里介绍比较常用的两种方法。<br />
　<strong>　一、查询<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CF%B5%CD%B3">系统</span>表sys.wrh$_sqlsta。</strong><br />
　　在数据库系统中有如下一张表。这张表<font color="#0000ff">存储</font>中Oracle数据库执行过的SQL语句的相关情况。<br />
　　<img height="168" alt="" src="http://oracle.chinaitlab.com/UploadFiles_7269/200901/20090108102514332.jpg" width="490" border="0" /><br />
　　如上面这张表中，他会反映某个特定Sql语句的执行信息。其中第一个参数Excutions_Total参数纪录了某条SQL语句总共执行的次数。而第二个参数Disk-Reads-Totali参数则统计了从磁盘中读取数据的次数。当SQL语句的执行次数特别多而且又是多次从磁盘中读取数据的话，那么数据库管理员就要注意了。因为从磁盘中读取数据要比从<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C4%DA%B4%E6">内存</span>中读取数据慢的多。此时，若数据库管理员能够想方设法，让这些执行频率高的SQL语句不直接从磁盘中读取数据，而是从内存中读取数据，那么就可以非常有效的提高SQL语句的执行效率。<br />
　　另外数据库可以员也可以通过Statspack方法来定位SQL语句。当我们启用这个<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%B9%A6%C4%DC">功能</span>的时候，数据库会生成一张Stats$Sql_summary的表。他的功能跟上面这张表类似，只是他会有选择的纪录相关的信息。<br />
　　在Sql_Parameter会记入相关的条件。如当SQL语句执行次数大于多少才进行纪录;又或者当SQL语句执行磁盘读取次数大于多少时进行统计等等。通过这个过滤，会让数据库管理员了解更多的信息。但是，这里要注意一个问题，当任何一个指标超出(Oracle官方资料上把这个指标叫做阀值)的时候，系统就会往上面这个表中添加一条纪录。所以如果这个指标<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C9%E8%D6%C3">设置</span>的比较低，当数据库比较繁忙的时候，我们会发现这张表会变得非常的活跃。数据库会时不时的向这张表中添加纪录。<br />
　　所以，如果数据库管理员想用这种方法来定位SQL语句的话，那么需要同时做好两项工作<br />
　　一是需要根据SQL调整过程来随时调整这个指标。当我们数据库管理员需要对SQL语句进行调整的时候，就必须要降低指标值。如此才能够定位那些不常用的SQL语句，并对其进行调整。但是，降低指标值会导致数据库向这个表中添加更多的纪录。此时，数据库管理员在调整过后，就要手工删除这表中多余的数据。<br />
　　二是要定期的查看这表中的内容。因为随着系统应用时机的不同，有些SQL语句可能在某个时段后不再使用。所以，如果SQL调整不再使用这些内容的话，则数据库管理员从这张表中删除他们就显得非常的必要了。<br />
<br />
</div>
<strong>二、使用第三方工具对其进行定位。</strong>　　除了Oracle数据库自带的工具之外，我们数据库管理员还可以利用一些第三方的工具或者脚本来对常用的SQL语句进行定位。<br />
　　如有些公司开发了一些GUI工具。这些工具可以帮助我们数据库管理员迅速显示程序库缓存中的SQL 语句，并且通过一些参数，还可以抽取执行频率比较高的或者耗用资源比较多的SQL语句。另外，我们也可以自己写一些SQL脚本。通过这个脚本来直接读取数据库缓存中的SQL语句。<br />
　　采用第三方工具有时候会比上面这个方法更加的有用。因为上面这个方法其纪录的是一个过去式的结果。而直接在缓存中读取的数据，则反映的是及时的数据。如当用户发觉数据库性能降低的时候，则数据库管理员可以采用这些工具，了解SQL语句的执行情况，看看是否是因为SQL语句所造成的。<br />
　　当数据库管理员找到影响数据库性能的那个SQL语句之后，我们就可以对每个可疑的SQL语句进行调整。<br />
　　如数据库管理员可以更改优化器模式。在Oracle数据库中，提供了不少的优化器模式，如最快优化器或者耗用资源最少优化器等等。数据库管理员可以尝试更改不同的优化器模式，然后让数据库产生多个执行计划。通过对每个计划进行追踪、分析、计时，来确定那个执行计划具有最快的执行时间。<br />
　　如可以添加提示，来强制改变执行计划，来获得最优的执行时间。调整SQL语句的过程包含多个操作。SQL语句的调整从全局水平转移到特定的水平。SQL语句调整的终极目标是缩短SQL语句的执行时间。Oracle数据库中不同的执行计划，其执行所需要的时间是不同的。出于调整的需要，数据库管理员可以通过向所选择的语句中添加提示的方式，强制对执行计划进行修改。<br />
　　如可以通过添加索引来删除不必要的全表扫描。索引是提高数据库查询性能的一个法宝。当SQL语句查询效率低下，数据库管理员想到的第一个方法就是能否对表添加合适的索引来提高SQL语句的查询效率。通过对表添加索引，特别是基于位图和基于函数的索引， 可以防止一些不必要的全表扫描。不过，在后续调整的过程中给表添加索引的话，要注意一个问题。就是添加索引后，可能会造成许多其他的SQL语句执行计划的改变。所以，在为某一个SQL语句调整添加或者删除了某个索引之后，可能会发现其他的SQL语句执行效率有所改变。故一般在后期的SQL语句调整过程中，我们都不怎么建议数据库管理员对原来的索引进行调整。在确实有必要的情况下，数据库管理员要能够站在一个全局的角度，去评估索引更改后对其他SQL语句执行计划的影响。从而最终确定这么处理是否合适。<br />
　　另外在对单独的SQL语句进行调整的时候，还需要注意一个持久化的问题。也就是说，对SQL语句的调整，无论是执行计划的调整，还是优化器模式的改变，其效果不能够只是暂时的。让SQL语句调整变得更持久，只有如此，调整才有实际意义。<br />
　　如何才能够提高调整后的SQL语句的持久性呢?笔者这里有一个小的建议。如果通过以上的定位方法，了解到某条SQL语句执行频率非常高，或者耗用的资源比较多，又或者多次从磁盘中读取数据。对于这种SQL语句，如何保证调整的持久化呢?此时，可以改变SQL语句的来源来达到持久化的目的。如当数据库管理员发现SQL语句是来源于应用程序。此时，在调整的过程中，数据库管理员可以考虑，把应用程序传递过来的SQL语句打包放入存储过程，然后把存储过过程放入Oracle系统的软件包中来实现。他可以让我们定。位SQL语句的工作来的简单;而且，他还使得所有远程 的应用程序更加便于移植，因为对Oracle的调用都是封装在数据库函数或者过程之中。<br />
　　从以上的分析中我们可以看出，要对SQL语句进行调整，无论是采取何种方式，第一件工作就是要定位需要对哪些SQL语句进行调整。为了提高调整的效果，哪些执行频率高、耗用资源多的SQL语句，就成为我们调整的对象。所以，如何定位这些语句就显得至关重要。我们只要找到这些SQL语句，就可以使得我们的优化工作事半功倍
<img src ="http://www.blogjava.net/michaellee/aggbug/265264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaellee/" target="_blank">MichaelLee</a> 2009-04-13 13:30 <a href="http://www.blogjava.net/michaellee/articles/265264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>