数据库分页三种模式

数据库分页三种形式

java项目中数据库分页有以下三种常见形式:

    1.结合数据库产品自身特点的sql语句,优点效率最高,缺点兼容性差,更换数据库产品,所有sql语句需要重新写

    以salserver为例适用于 SQL Server 2005
SELECT TOP 页大小 *
FROM
        (
        SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
        ) A
WHERE RowNumber > 页大小*(页数-1)

页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。

    2、使用数据库游标分页,优点适合所有数据库,缺点不适合大数据量查询

       page第几页,pagesize页大小

        public List<AdminDTO> findAll(int page,
            int pageSize) throws SQLException {

        List<AdminDTO> list = new ArrayList<AdminDTO>();

        //ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。
        //ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变
        PreparedStatement ps = con.prepareStatement("select ad.id,ad.adminName,ad.adminPass,ad.roleId,r.rolerName from adminInfo ad,roler r where ad.roleId=r.roleId",
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
        ResultSet rs = ps.executeQuery();

        int position = (page - 1) * pageSize;
        rs.absolute(position);

        int count = 0;

        while (rs.next() && count < pageSize) {
            count++;
            AdminDTO dto = new AdminDTO();
            dto.setId(rs.getInt("id"));
            dto.setAdminName(rs.getString("adminName"));
            dto.setAdminPass(rs.getString("adminPass"));
            dto.setRoleId(rs.getInt("roleId"));
            dto.setRolerName(rs.getString("rolerName"));
            list.add(dto);
        }
        return list;
    }

 

3、使用缓存,一次性从数据库查询出所有记录,存放到缓存里面,然后用list集合划分,优点简单,缺点占用系统内存,影响系统性能,故一般没人使用