mysql分页有几种逻辑方式_几种分页方式分析.

一.逻辑分页

1.逻辑分页的第一种方式,利用ResultSet的滚动分页。步骤如下:

a.根据条件sql查询数据库。

b.得到ResultSet的结果集,由于ResultSet带有游标,因此可以使用其next()方法来指向下一条记录。

c.利用next()方法,得到分页所需的结果集。

这种分页方式依靠的是对结果集的算法来分页,因此通常被称为“逻辑分页”。

代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TestPageResultSetDAO.java

1408c5260b2f05e450dee929db9be5f7.png *

1408c5260b2f05e450dee929db9be5f7.png * Copyright 2008. All Rights Reserved.

f466905a3bcb5dcef110eab799825254.png */

731655954c7be9d8835ece551b5385f8.pngpackage com.cosmow.pageresultset.dao;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport java.sql.Connection;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.DriverManager;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.PreparedStatement;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.ResultSet;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.SQLException;

731655954c7be9d8835ece551b5385f8.pngimport java.util.ArrayList;

731655954c7be9d8835ece551b5385f8.pngimport java.util.List;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport com.cosmow.pageresultset.entity.Bars;

731655954c7be9d8835ece551b5385f8.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TODO dao class TestPageResultSetDAO

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * Revision History

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * 2008-7-7,Cosmo,created it

f466905a3bcb5dcef110eab799825254.png */

24a924a57ba6b3f2b51fc9edb7ea4186.pngpublic class TestPageResultSetDAO {

1408c5260b2f05e450dee929db9be5f7.png

1408c5260b2f05e450dee929db9be5f7.png    private final String FIND_BARS_PAGE = "SELECT * FROM YYBARS ORDER BY id";

1408c5260b2f05e450dee929db9be5f7.png

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 提供JDBC连接方法,返回一个Connection的实例

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @return

1408c5260b2f05e450dee929db9be5f7.png     * @throws SQLException

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    private Connection getConnection() throws SQLException {

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";

1408c5260b2f05e450dee929db9be5f7.png            final String user = "store";

1408c5260b2f05e450dee929db9be5f7.png            final String password = "store_password";

1408c5260b2f05e450dee929db9be5f7.png            Class.forName("oracle.jdbc.driver.OracleDriver");

1408c5260b2f05e450dee929db9be5f7.png            Connection con = DriverManager.getConnection(url, user, password);

1408c5260b2f05e450dee929db9be5f7.png            return con;

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (ClassNotFoundException e) {

1408c5260b2f05e450dee929db9be5f7.png            throw new SQLException(e.getMessage());

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

1408c5260b2f05e450dee929db9be5f7.png

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 逻辑分页方法一,该方法使用移位(rs.next)来进行

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @param currentPage

1408c5260b2f05e450dee929db9be5f7.png     *            当前页

1408c5260b2f05e450dee929db9be5f7.png     * @param showRows

1408c5260b2f05e450dee929db9be5f7.png     *            一页显示的数据量

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    public List pageListOne(int currentPage, int showRows) {

1408c5260b2f05e450dee929db9be5f7.png        Connection con = null;

1408c5260b2f05e450dee929db9be5f7.png        PreparedStatement ps = null;

1408c5260b2f05e450dee929db9be5f7.png        ResultSet rs = null;

1408c5260b2f05e450dee929db9be5f7.png        ArrayList resultList = new ArrayList();

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            con = getConnection();

1408c5260b2f05e450dee929db9be5f7.png            ps = con.prepareStatement(FIND_BARS_PAGE);

1408c5260b2f05e450dee929db9be5f7.png            rs = ps.executeQuery();

1408c5260b2f05e450dee929db9be5f7.png            // 过滤结果集的变量

1408c5260b2f05e450dee929db9be5f7.png            int skipBegin = (currentPage - 1) * showRows;

1408c5260b2f05e450dee929db9be5f7.png            int skipEnd = currentPage * showRows;

1408c5260b2f05e450dee929db9be5f7.png            // 翻页计数器

1408c5260b2f05e450dee929db9be5f7.png            int currentNum = 0;

1408c5260b2f05e450dee929db9be5f7.png            // 当返回结果集中有记录时

715f2d05503b99d41f3b6ba2cdccc84d.png            while (rs.next()) {

1408c5260b2f05e450dee929db9be5f7.png                // 以下情况将保证在结果集中有记录时的应用

715f2d05503b99d41f3b6ba2cdccc84d.png                if (currentNum >= skipBegin && currentNum 

1408c5260b2f05e450dee929db9be5f7.png                    Bars bar = new Bars();

1408c5260b2f05e450dee929db9be5f7.png                    bar.setId(rs.getLong("id"));

1408c5260b2f05e450dee929db9be5f7.png                    bar.setName(rs.getString("name"));

1408c5260b2f05e450dee929db9be5f7.png                    bar.setType(rs.getInt("type"));

1408c5260b2f05e450dee929db9be5f7.png                    bar.setCreatorId(rs.getLong("creator_id"));

1408c5260b2f05e450dee929db9be5f7.png                    resultList.add(bar);

1408c5260b2f05e450dee929db9be5f7.png                    if (currentNum == skipEnd - 1)

1408c5260b2f05e450dee929db9be5f7.png                        break;

5bcb1807ee3e00d2b3c225f0b3f5c751.png                }

1408c5260b2f05e450dee929db9be5f7.png                currentNum++;

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png            e.printStackTrace();

715f2d05503b99d41f3b6ba2cdccc84d.png        } finally {

715f2d05503b99d41f3b6ba2cdccc84d.png            try {

1408c5260b2f05e450dee929db9be5f7.png                if (rs != null)

1408c5260b2f05e450dee929db9be5f7.png                    rs.close();

1408c5260b2f05e450dee929db9be5f7.png                if (ps != null)

1408c5260b2f05e450dee929db9be5f7.png                    ps.close();

1408c5260b2f05e450dee929db9be5f7.png                if (con != null)

1408c5260b2f05e450dee929db9be5f7.png                    con.close();

715f2d05503b99d41f3b6ba2cdccc84d.png            } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png                e.printStackTrace();

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

1408c5260b2f05e450dee929db9be5f7.png        return resultList;

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

f466905a3bcb5dcef110eab799825254.png}

731655954c7be9d8835ece551b5385f8.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

2.逻辑分页的第二种方式

利用Scrollable ResultSets(可滚动结果集合)来快速定位到某个游标所指定的记录行,所使用的是ResultSet的absolute()方法。

改进代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TestPageResultSetDAO.java

1408c5260b2f05e450dee929db9be5f7.png *

1408c5260b2f05e450dee929db9be5f7.png * Copyright 2008. All Rights Reserved.

f466905a3bcb5dcef110eab799825254.png */

731655954c7be9d8835ece551b5385f8.pngpackage com.cosmow.pageresultset.dao;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport java.sql.Connection;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.DriverManager;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.PreparedStatement;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.ResultSet;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.SQLException;

731655954c7be9d8835ece551b5385f8.pngimport java.util.ArrayList;

731655954c7be9d8835ece551b5385f8.pngimport java.util.List;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport com.cosmow.pageresultset.entity.Bars;

731655954c7be9d8835ece551b5385f8.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TODO dao class TestPageResultSetDAO

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * Revision History

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * 2008-7-7,Cosmo,created it

f466905a3bcb5dcef110eab799825254.png */

24a924a57ba6b3f2b51fc9edb7ea4186.pngpublic class TestPageResultSetDAO {

1408c5260b2f05e450dee929db9be5f7.png

1408c5260b2f05e450dee929db9be5f7.png    private final String FIND_BARS_PAGE = "SELECT * FROM YYBARS ORDER BY id";

1408c5260b2f05e450dee929db9be5f7.png    

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 提供JDBC连接方法,返回一个Connection的实例

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @return

1408c5260b2f05e450dee929db9be5f7.png     * @throws SQLException

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    private Connection getConnection() throws SQLException {

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";

1408c5260b2f05e450dee929db9be5f7.png            final String user = "store";

1408c5260b2f05e450dee929db9be5f7.png            final String password = "store_password";

1408c5260b2f05e450dee929db9be5f7.png            Class.forName("oracle.jdbc.driver.OracleDriver");

1408c5260b2f05e450dee929db9be5f7.png            Connection con = DriverManager.getConnection(url, user, password);

1408c5260b2f05e450dee929db9be5f7.png            return con;

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (ClassNotFoundException e) {

1408c5260b2f05e450dee929db9be5f7.png            throw new SQLException(e.getMessage());

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

1408c5260b2f05e450dee929db9be5f7.png

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 逻辑分页方法二,使用absolute()方法分页

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @param currentPage

1408c5260b2f05e450dee929db9be5f7.png     *            当前页

1408c5260b2f05e450dee929db9be5f7.png     * @param showRows

1408c5260b2f05e450dee929db9be5f7.png     *            一页显示的数据量

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    public List pageListTwo(int currentPage, int showRows) {

1408c5260b2f05e450dee929db9be5f7.png        Connection con = null;

1408c5260b2f05e450dee929db9be5f7.png        PreparedStatement ps = null;

1408c5260b2f05e450dee929db9be5f7.png        ResultSet rs = null;

1408c5260b2f05e450dee929db9be5f7.png        ArrayList resultList = new ArrayList();

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            con = getConnection();

1408c5260b2f05e450dee929db9be5f7.png            ps = con.prepareStatement(FIND_BARS_PAGE);

1408c5260b2f05e450dee929db9be5f7.png            rs = ps.executeQuery();

1408c5260b2f05e450dee929db9be5f7.png

1408c5260b2f05e450dee929db9be5f7.png            // 过滤结果集的变量

1408c5260b2f05e450dee929db9be5f7.png            int skipBegin = (currentPage - 1) * showRows;

1408c5260b2f05e450dee929db9be5f7.png            int skipEnd = currentPage * showRows;

1408c5260b2f05e450dee929db9be5f7.png            // 利用rs.absolute进行定位

1408c5260b2f05e450dee929db9be5f7.png            if (!rs.absolute(skipBegin))

1408c5260b2f05e450dee929db9be5f7.png                return resultList;

1408c5260b2f05e450dee929db9be5f7.png            // 当返回结果集中有记录时

715f2d05503b99d41f3b6ba2cdccc84d.png            while (rs.next()) {

1408c5260b2f05e450dee929db9be5f7.png                // 以下情况将保证在结果集中有记录时的应用

715f2d05503b99d41f3b6ba2cdccc84d.png                if (skipBegin 

1408c5260b2f05e450dee929db9be5f7.png                    Bars bar = new Bars();

1408c5260b2f05e450dee929db9be5f7.png                    bar.setId(rs.getLong("id"));

1408c5260b2f05e450dee929db9be5f7.png                    bar.setName(rs.getString("name"));

1408c5260b2f05e450dee929db9be5f7.png                    bar.setType(rs.getInt("type"));

1408c5260b2f05e450dee929db9be5f7.png                    bar.setCreatorId(rs.getLong("creator_id"));

1408c5260b2f05e450dee929db9be5f7.png                    resultList.add(bar);

1408c5260b2f05e450dee929db9be5f7.png                    if (skipBegin == skipEnd - 1)

1408c5260b2f05e450dee929db9be5f7.png                        break;

5bcb1807ee3e00d2b3c225f0b3f5c751.png                }

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png            e.printStackTrace();

715f2d05503b99d41f3b6ba2cdccc84d.png        } finally {

715f2d05503b99d41f3b6ba2cdccc84d.png            try {

1408c5260b2f05e450dee929db9be5f7.png                if (rs != null)

1408c5260b2f05e450dee929db9be5f7.png                    rs.close();

1408c5260b2f05e450dee929db9be5f7.png                if (ps != null)

1408c5260b2f05e450dee929db9be5f7.png                    ps.close();

1408c5260b2f05e450dee929db9be5f7.png                if (con != null)

1408c5260b2f05e450dee929db9be5f7.png                    con.close();

715f2d05503b99d41f3b6ba2cdccc84d.png            } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png                e.printStackTrace();

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

1408c5260b2f05e450dee929db9be5f7.png        return resultList;

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

f466905a3bcb5dcef110eab799825254.png}

731655954c7be9d8835ece551b5385f8.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

虽然和第一种方式区别不大,单效率比ResultSet滚动要好,但是absolute()方法并不是所有jdbc驱动都支持。

可用如下代码测试当前jdbc驱动是否支持可滚动结果集:

731655954c7be9d8835ece551b5385f8.pngint type = rs.getType();

731655954c7be9d8835ece551b5385f8.pngif (type == ResultSet.TYPE_SCROLL_INSENSITIVE || type == ResultSet.TYPE_SCROLL_SENSITIVE)

731655954c7be9d8835ece551b5385f8.png    System.out.println("Result set is scrollable");

731655954c7be9d8835ece551b5385f8.pngelse

731655954c7be9d8835ece551b5385f8.png    System.out.println("Result set is not scrollable");

二.物理分页

利用数据库本身的一些特性来分页。即:利用了数据库对sql语法的优化,提高分页性能。

1.针对Oracle数据库

步骤如下:

a.根据所使用的数据库特性来组织sql进行分页。

b.每次跳转页面的sql查询都不相同。

通用的sql分页方式,“限制行数结果集的倒序”分页,步骤如下:

(1).取得符合条件的所有结果集中可以唯一标识的Key值(通常是主键),并正向排序。

(2).利用数据库提供的特殊方法进行“最大结果集”的限制(在Oracle中使用rownum, sql server中使用top, mysql中使用limit...),

该“最大结果集”指包含当前所处页的所有记录数,“最大结果集”应该只包含惟一的Key值。

(3).对步骤(2)中的“最大结果集”进行逆序,并取得“显示当前页显示数量的结果集”,该结果集中只包含惟一的Key值。

(4).通过步骤(3)中所取得的Key值取得显示数据,该显示数据就是当前页应该显示的数据。

代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TestPageResultSetDAO.java

1408c5260b2f05e450dee929db9be5f7.png *

1408c5260b2f05e450dee929db9be5f7.png * Copyright 2008. All Rights Reserved.

f466905a3bcb5dcef110eab799825254.png */

731655954c7be9d8835ece551b5385f8.pngpackage com.cosmow.pageresultset.dao;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport java.sql.Connection;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.DriverManager;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.PreparedStatement;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.ResultSet;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.SQLException;

731655954c7be9d8835ece551b5385f8.pngimport java.util.ArrayList;

731655954c7be9d8835ece551b5385f8.pngimport java.util.List;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport com.cosmow.pageresultset.entity.Bars;

731655954c7be9d8835ece551b5385f8.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TODO dao class TestPageResultSetDAO

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * Revision History

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * 2008-7-7,Cosmo,created it

f466905a3bcb5dcef110eab799825254.png */

24a924a57ba6b3f2b51fc9edb7ea4186.pngpublic class TestPageResultSetDAO {

1408c5260b2f05e450dee929db9be5f7.png

1408c5260b2f05e450dee929db9be5f7.png    //针对Oracle

1408c5260b2f05e450dee929db9be5f7.png    private final String FIND_BARS_ORACLE = "select b3.* from "

1408c5260b2f05e450dee929db9be5f7.png            + "(select b1.id from "

1408c5260b2f05e450dee929db9be5f7.png            + "(select b.id from yybars b where rownum <= ? order by b.id desc) b1 "

1408c5260b2f05e450dee929db9be5f7.png            + "where rownum <= ? order by b1.id desc) b2, "

1408c5260b2f05e450dee929db9be5f7.png            + "yybars b3 where b2.id = b3.id order by b2.id";

1408c5260b2f05e450dee929db9be5f7.png    

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 提供JDBC连接方法,返回一个Connection的实例

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @return

1408c5260b2f05e450dee929db9be5f7.png     * @throws SQLException

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    private Connection getConnection() throws SQLException {

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";

1408c5260b2f05e450dee929db9be5f7.png            final String user = "store";

1408c5260b2f05e450dee929db9be5f7.png            final String password = "store_password";

1408c5260b2f05e450dee929db9be5f7.png            Class.forName("oracle.jdbc.driver.OracleDriver");

1408c5260b2f05e450dee929db9be5f7.png            Connection con = DriverManager.getConnection(url, user, password);

1408c5260b2f05e450dee929db9be5f7.png            return con;

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (ClassNotFoundException e) {

1408c5260b2f05e450dee929db9be5f7.png            throw new SQLException(e.getMessage());

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

1408c5260b2f05e450dee929db9be5f7.png

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 物理分页方法一针对Oracle,使用sql语句的id查询来进行

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @param currentPage

1408c5260b2f05e450dee929db9be5f7.png     *            当前页

1408c5260b2f05e450dee929db9be5f7.png     * @param showRows

1408c5260b2f05e450dee929db9be5f7.png     *            一页显示的数据量

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    public List pageListThree(int currentPage, int showRows) {

1408c5260b2f05e450dee929db9be5f7.png        Connection con = null;

1408c5260b2f05e450dee929db9be5f7.png        PreparedStatement ps = null;

1408c5260b2f05e450dee929db9be5f7.png        ResultSet rs = null;

1408c5260b2f05e450dee929db9be5f7.png        ArrayList resultList = new ArrayList();

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            con = getConnection();

1408c5260b2f05e450dee929db9be5f7.png            ps = con.prepareStatement(FIND_BARS_ORACLE);

1408c5260b2f05e450dee929db9be5f7.png            //传入参数,第一个参数标示包含该页总共有几条数据

1408c5260b2f05e450dee929db9be5f7.png            ps.setInt(1, showRows * currentPage);

1408c5260b2f05e450dee929db9be5f7.png            //第二个参数标示将取得在第一个参数所指定的数据中应该显示的数据

1408c5260b2f05e450dee929db9be5f7.png            ps.setInt(2, showRows);

1408c5260b2f05e450dee929db9be5f7.png            rs = ps.executeQuery();

1408c5260b2f05e450dee929db9be5f7.png            // 当返回结果集中有记录时

715f2d05503b99d41f3b6ba2cdccc84d.png            while (rs.next()) {

1408c5260b2f05e450dee929db9be5f7.png                Bars bar = new Bars();

1408c5260b2f05e450dee929db9be5f7.png                bar.setId(rs.getLong("id"));

1408c5260b2f05e450dee929db9be5f7.png                bar.setName(rs.getString("name"));

1408c5260b2f05e450dee929db9be5f7.png                bar.setType(rs.getInt("type"));

1408c5260b2f05e450dee929db9be5f7.png                bar.setCreatorId(rs.getLong("creator_id"));

1408c5260b2f05e450dee929db9be5f7.png                resultList.add(bar);

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png            e.printStackTrace();

715f2d05503b99d41f3b6ba2cdccc84d.png        } finally {

715f2d05503b99d41f3b6ba2cdccc84d.png            try {

1408c5260b2f05e450dee929db9be5f7.png                if (rs != null)

1408c5260b2f05e450dee929db9be5f7.png                    rs.close();

1408c5260b2f05e450dee929db9be5f7.png                if (ps != null)

1408c5260b2f05e450dee929db9be5f7.png                    ps.close();

1408c5260b2f05e450dee929db9be5f7.png                if (con != null)

1408c5260b2f05e450dee929db9be5f7.png                    con.close();

715f2d05503b99d41f3b6ba2cdccc84d.png            } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png                e.printStackTrace();

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

1408c5260b2f05e450dee929db9be5f7.png        return resultList;

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

f466905a3bcb5dcef110eab799825254.png}

731655954c7be9d8835ece551b5385f8.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

2.针对MySQL数据库

在MySQL数据库中offset关键字的意思是"越过",而limit关键字的意思是“限制”,利用这两者结合可轻松分页。

(1)取得符合条件的结果集,包含全字段。

(2)利用offset关键字越过一段结果集(被越过的结果集就是"(当前页 - 1) * 一页显示数")。

(3)利用limit关键字限制取得一段结果集(被限制取得的结果集就是一页显示数)

代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TestPageResultSetDAO.java

1408c5260b2f05e450dee929db9be5f7.png *

1408c5260b2f05e450dee929db9be5f7.png * Copyright 2008. All Rights Reserved.

f466905a3bcb5dcef110eab799825254.png */

731655954c7be9d8835ece551b5385f8.pngpackage com.cosmow.pageresultset.dao;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport java.sql.Connection;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.DriverManager;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.PreparedStatement;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.ResultSet;

731655954c7be9d8835ece551b5385f8.pngimport java.sql.SQLException;

731655954c7be9d8835ece551b5385f8.pngimport java.util.ArrayList;

731655954c7be9d8835ece551b5385f8.pngimport java.util.List;

731655954c7be9d8835ece551b5385f8.png

731655954c7be9d8835ece551b5385f8.pngimport com.cosmow.pageresultset.entity.Bars;

731655954c7be9d8835ece551b5385f8.png

24a924a57ba6b3f2b51fc9edb7ea4186.png/**

1408c5260b2f05e450dee929db9be5f7.png * TODO dao class TestPageResultSetDAO

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * Revision History

1408c5260b2f05e450dee929db9be5f7.png * 

1408c5260b2f05e450dee929db9be5f7.png * 2008-7-7,Cosmo,created it

f466905a3bcb5dcef110eab799825254.png */

24a924a57ba6b3f2b51fc9edb7ea4186.pngpublic class TestPageResultSetDAO {

1408c5260b2f05e450dee929db9be5f7.png    

1408c5260b2f05e450dee929db9be5f7.png    private final String FIND_BARS_MYSQL = "select * from yybars order by id limit ? offset ?";

1408c5260b2f05e450dee929db9be5f7.png    

1408c5260b2f05e450dee929db9be5f7.png

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 提供JDBC连接方法,返回一个Connection的实例

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @return

1408c5260b2f05e450dee929db9be5f7.png     * @throws SQLException

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    private Connection getConnection() throws SQLException {

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";

1408c5260b2f05e450dee929db9be5f7.png            final String user = "store";

1408c5260b2f05e450dee929db9be5f7.png            final String password = "store_password";

1408c5260b2f05e450dee929db9be5f7.png            Class.forName("oracle.jdbc.driver.OracleDriver");

1408c5260b2f05e450dee929db9be5f7.png            Connection con = DriverManager.getConnection(url, user, password);

1408c5260b2f05e450dee929db9be5f7.png            return con;

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (ClassNotFoundException e) {

1408c5260b2f05e450dee929db9be5f7.png            throw new SQLException(e.getMessage());

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

1408c5260b2f05e450dee929db9be5f7.png    

715f2d05503b99d41f3b6ba2cdccc84d.png    /**

1408c5260b2f05e450dee929db9be5f7.png     * 物理分页方法二针对mysql,使用sql语句的limit和offset来进行分页

1408c5260b2f05e450dee929db9be5f7.png     * 

1408c5260b2f05e450dee929db9be5f7.png     * @param currentPage

1408c5260b2f05e450dee929db9be5f7.png     *            当前页

1408c5260b2f05e450dee929db9be5f7.png     * @param showRows

1408c5260b2f05e450dee929db9be5f7.png     *            一页显示的数据量

5bcb1807ee3e00d2b3c225f0b3f5c751.png     */

715f2d05503b99d41f3b6ba2cdccc84d.png    public List pageListFour(int currentPage, int showRows) {

1408c5260b2f05e450dee929db9be5f7.png        Connection con = null;

1408c5260b2f05e450dee929db9be5f7.png        PreparedStatement ps = null;

1408c5260b2f05e450dee929db9be5f7.png        ResultSet rs = null;

1408c5260b2f05e450dee929db9be5f7.png        ArrayList resultList = new ArrayList();

715f2d05503b99d41f3b6ba2cdccc84d.png        try {

1408c5260b2f05e450dee929db9be5f7.png            con = getConnection();

1408c5260b2f05e450dee929db9be5f7.png            ps = con.prepareStatement(FIND_BARS_MYSQL);

1408c5260b2f05e450dee929db9be5f7.png            //传入参数,第一个参数表示显示几条记录(limit关键字的含义)

1408c5260b2f05e450dee929db9be5f7.png            ps.setInt(1, showRows);

1408c5260b2f05e450dee929db9be5f7.png            //第二个参数表示丢弃几条记录(offset关键字的含义)

1408c5260b2f05e450dee929db9be5f7.png            ps.setInt(2, showRows * (currentPage - 1));

1408c5260b2f05e450dee929db9be5f7.png            rs = ps.executeQuery();

1408c5260b2f05e450dee929db9be5f7.png            // 当返回结果集中有记录时

715f2d05503b99d41f3b6ba2cdccc84d.png            while (rs.next()) {

1408c5260b2f05e450dee929db9be5f7.png                Bars bar = new Bars();

1408c5260b2f05e450dee929db9be5f7.png                bar.setId(rs.getLong("id"));

1408c5260b2f05e450dee929db9be5f7.png                bar.setName(rs.getString("name"));

1408c5260b2f05e450dee929db9be5f7.png                bar.setType(rs.getInt("type"));

1408c5260b2f05e450dee929db9be5f7.png                bar.setCreatorId(rs.getLong("creator_id"));

1408c5260b2f05e450dee929db9be5f7.png                resultList.add(bar);

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

715f2d05503b99d41f3b6ba2cdccc84d.png        } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png            e.printStackTrace();

715f2d05503b99d41f3b6ba2cdccc84d.png        } finally {

715f2d05503b99d41f3b6ba2cdccc84d.png            try {

1408c5260b2f05e450dee929db9be5f7.png                if (rs != null)

1408c5260b2f05e450dee929db9be5f7.png                    rs.close();

1408c5260b2f05e450dee929db9be5f7.png                if (ps != null)

1408c5260b2f05e450dee929db9be5f7.png                    ps.close();

1408c5260b2f05e450dee929db9be5f7.png                if (con != null)

1408c5260b2f05e450dee929db9be5f7.png                    con.close();

715f2d05503b99d41f3b6ba2cdccc84d.png            } catch (SQLException e) {

1408c5260b2f05e450dee929db9be5f7.png                e.printStackTrace();

5bcb1807ee3e00d2b3c225f0b3f5c751.png            }

5bcb1807ee3e00d2b3c225f0b3f5c751.png        }

1408c5260b2f05e450dee929db9be5f7.png        return resultList;

5bcb1807ee3e00d2b3c225f0b3f5c751.png    }

f466905a3bcb5dcef110eab799825254.png}

731655954c7be9d8835ece551b5385f8.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

分页结论:

1.物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。

2.物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势,

然而其它性能上的优点足以弥补这个缺点。

3.在分页工作前,有必要了解使用数据库本身的一些sql语句特点更好的分页。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值