二次开发
OA办公系统中使用的数据库分页技术
2023-03-21 08:54:27

      海钛瑞OA办公自动化系统支多种数据库技术,已经通过测试的有Firebird数据库,MS SQL SERVER数据库,PostgreSQL数据库等,如果用户需要用Oracle数据库或MYSQL数据库亦或是Opengauss数据库,我们也可以进行适配来满足需求。数据库的适配其实就是SQL语法适配,要看数据库开发者对SQL标准的遵循或扩展情况。要实现分页展示数据,先要确定每页显示记录的条数,需要显示的记录总数,下面以数据库常见的分页技术来说明。

 


       JDBC通用分页是通过标准的java数据库通信接口来实现,具有同数据库无关性的优点,缺点是当数据量特别大时,效率会较低,不能使用特定数据库优化功能。
       先查询出记录部总数iTotal,当前端需要显示的是第几页iPage,然后计算出iStart开始行、iEnd结束行的值,一般用分页类来实现。
/*
查询分页大致如下
@parm sql 查询语句
@parm iStart 开始行
@parm iEnd  结束行
*/
public List<Map> queryByPage(String sql ,int iStart,int iEnd)
{
  List<Map> list = new java.util.ArrayList<HashMap>();
  Connection conn=getConnection();
  Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
  ResultSet rs=stmt.executeQuery(sql);
  rs.last();
  int total = rs.getRow();
  if (total>0)
  {
    rs.absolute(iStart);
    do
    {
    //取出记录
    ...
    }while((rs.next()) && (++iStart<=iEnd));
  }
  return list;
}

 


       Firebird数据库提供一个可以用于分页的子句ROWS
/*
查询分页大致如下
@parm sql 查询语句
@parm iStart 开始行
@parm iEnd  结束行
*/
public List<Map> queryByPage(String sql ,int iStart,int iEnd)
{
  List<Map> list = new java.util.ArrayList<HashMap>();
  Connection conn=getConnection();
 
  PreparedStatement prepstmt = conn.prepareStatement(sql);
  prepstmt.setInt(1,iStart)
  prepstmt.setInt(2,iEnd)
  ResultSet rs=prepstmt.executeQuery();
  while(rs.next())
  {
  //取出记录
  ...
  }
  return list;
}

 


       MS SQL SERVER数据库分页就没那么幸运,提供的是top也就是前多少条记录。
select * from tableName
如果要查询上述结果中前10条记录,则相应的SQL语句是:
 
select top 10 =* from tablename
如果要查询上述结果中第 11 条到第 25 条记录,则相应的SQL语句是:
 
select top 15 * from tablename
where id not in (
  select top 10 id from tablename
)
取m行到n行的记录
select top (n-m+1) * from tablename
where id not in (
  select top m-1 id from tablename
)
计算分页和偏移
select top @pageSize * from tablename
where id not in (
  select top @offset id from tablename
)
/*
查询分页大致如下
@parm sql 查询语句
@parm iStart 开始行
@parm iEnd  结束行
*/
public List<Map> queryByPage(String sql ,int iStart,int iEnd)
{
  List<Map> list = new java.util.ArrayList<HashMap>();
  Connection conn=getConnection();
  /*SQL语句
 
*/
  PreparedStatement prepstmt = conn.prepareStatement(sql);
  prepstmt.setInt(1,iStart)
  prepstmt.setInt(2,iEnd)
  ResultSet rs=prepstmt.executeQuery();
  while(rs.next())
  {
  //取出记录
  ...
  }
  return list;
}



PostgreSQL数据库提供一个可以用于分页的子句limit offset
 SELECT * FROM tablename limit 5 offset 5; //检索从第6行到第10行的记录(6-10)
/*
查询分页大致如下
@parm sql 查询语句
@parm iStart 开始行
@parm iEnd  结束行
*/
public List<Map> queryByPage(String sql ,int iStart,int iEnd)
{
  List<Map> list = new java.util.ArrayList<HashMap>();
  Connection conn=getConnection();
 
  PreparedStatement prepstmt = conn.prepareStatement(sql);
  prepstmt.setInt(1,iStart)
  prepstmt.setInt(2,iEnd)
  ResultSet rs=prepstmt.executeQuery();
  while(rs.next())
  {
  //取出记录
  ...
  }
  return list;
}

 

      最后我们可以看出SQL Server中没有带两个参数Limit语句,top只能有一个参数,取前面多少行记录,而Firebird数据库中的ROWS语句同PostgreSQL数据库中Limit语句类似带有两个参数,记录开始行和结束行,非常方便做分页取数据。OA办公系统需要兼顾性能和效率,针对不同SQL做不同选择。对于其它数据库mysql,oracle也是类似的。对OA办公系统的二次开发有一定的借鉴价值,希望对大家有所帮助。