一个数据分页排序查询框架——SmartPagination

长孙逸仙
2023-12-01

项目地址:https://github.com/VincentLiSH/powerstone

smartpagination的优势:
1、方便扩展:借助“Template Method”设计模式封装了分页逻辑中的固定算法,同时为不同数据访问层技术预留扩展点,因此底层可以采用ORM、iBatis、JDBC等技术访问数据库,甚至可以不是数据库(比如可以是另一个服务的API);
2、提供了Web层的封装简化开发,但并不绑定某种MVC框架;
3、支持复杂查询条件表单、查询结果分页、排序、翻页和排序过程中表单状态记忆;
4、服务器端分页,每次只取出一页数据,不会因数据量大而占用大量内存;

核心的分页逻辑封装在BasePagingController中

https://github.com/VincentLiSH/powerstone/blob/main/SmartPagination/src/org/powerstone/smartpagination/common/BasePagingController.java
附带了一个SpringMVC+Hibernate+JDBC+iBATIS实现的Sample应用,用来演示如何使用此框架。

典型应用代码如下:仅不到40行代码即可实现一个一般分页和一个复杂查询分页功能。

Java代码
  1. public  ModelAndView listHibernate(HttpServletRequest request, HttpServletResponse response) throws  Exception {  
  2.    BaseHbmPagingController ctrl = new  BaseHbmPagingController(baseHibernateDao) {  
  3.        @Override   
  4.        protected  PageInfo<DetachedCriteria, Order> makePageInfo(HttpServletRequest request) {  
  5.             HbmPageInfo pi = new  HbmPageInfo();  
  6.             pi.setCountDistinctProjections("id" );  
  7.             pi.setExpression(DetachedCriteria.forClass(UserModel.class ));  
  8.             // pi.addOrderByAsc("id");   
  9.             return  pi;  
  10.        }  
  11.    };  
  12.    ctrl.handleRequest(request, response);  
  13.    return   new  ModelAndView( "userList" ,  "userList" , BaseHbmPagingController.getPageData(request));  
  14. }  
public ModelAndView listHibernate(HttpServletRequest request, HttpServletResponse response)throws Exception {
   BaseHbmPagingController ctrl = new BaseHbmPagingController(baseHibernateDao) {
       @Override
       protected PageInfo<DetachedCriteria, Order> makePageInfo(HttpServletRequest request) {
            HbmPageInfo pi = new HbmPageInfo();
            pi.setCountDistinctProjections("id");
            pi.setExpression(DetachedCriteria.forClass(UserModel.class));
            // pi.addOrderByAsc("id");
            return pi;
       }
   };
   ctrl.handleRequest(request, response);
   return new ModelAndView("userList", "userList", BaseHbmPagingController.getPageData(request));
}

Java代码
  1. public  ModelAndView queryHibernate(HttpServletRequest request,HttpServletResponse response) throws  Exception{  
  2.    BaseHibernateQueryFormPagingController ctrl = new  BaseHibernateQueryFormPagingController() {  
  3.         @Override   
  4.         protected  PageResult findByPageInfo(PageInfo<DetachedCriteria, Order> pi) {  
  5.                 return  baseHibernateDao.findByPage((HbmPageInfo) pi);  
  6.         }  
  7.         @Override   
  8.         protected  PageQuery<DetachedCriteria, Order> makePageQuery() {  
  9.                 return   new  UserModelQuery();  
  10.         }  
  11.    };  
  12.    ctrl.setCommandClass(UserModel.class );  
  13.    ctrl.setCommandName("userModel" );  
  14.    ctrl.setFormView("userModelQuery" );  
  15.    ctrl.setSuccessView("redirect:/query.htm" );  
  16.    ctrl.setPagingDataName("userList" );  
  17.    return  ctrl.handleRequest(request, response);  
 类似资料: