日期:2014-05-16  浏览次数:20621 次

数据库分页三种形式

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集合划分,优点简单,缺点占用系统内存,影响系统性能,故一般没人使用