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