IntelliJ IDEA教程 Scala excel wpf timer autocomplete insert vue下载 vue教程入门 后台网站模板 后台管理网页模板 php项目实战 jq获取元素 matlab读取dat文件 css面试题 如何升级python 完美解决cpu利用率低 python参数 python正则表达 windows搭建python开发环境 python的编译器 python如何调用函数 python用什么ide java抽象类 java查看版本 java实现多线程 java如何获取当前时间 凯立德地图免费下载 acmecadconverter 动态加载js cmd代码 微信彩色字 苹果x银色 php正则匹配 脚本大师 wmiprvse是什么进程 正则表达式数字 fireworks 光标变粗 梦想世界答题器
当前位置: 首页 > 学习教程  > 编程语言

20201102 mybatis-分页

2020/11/4 15:08:50 文章标签:

一.简述分页过程: 简述分页过程:将分页最基本的页码(pageNum)和页面个数(pageSize)封装到创建的Page对象,然后mybatis分页的插件基于Page中的基本分页属性完成sql的limit分页语句的查询&#x…

一.简述分页过程:

简述分页过程:将分页最基本的页码(pageNum)和页面个数(pageSize)封装到创建的Page对象,然后mybatis分页的插件基于Page中的基本分页属性完成sql的limit分页语句的查询,这样mybatis查询返回的结果就是分页后的数据;但是——通常最后会将分页的基本数据和分页查询后的list数据共同进一步封装到PageInfo对象中。

过程:
  • 开启分页(本质是创建一个Page对象): PageHelper.startPage(pageNum, pageSize);
  • 获取带分页的对象集合: List UserPoList = UserPoMapper.selectXxx();
  • 封装对象list集合到pageinfo中以PageInfo返回展示:PageInfo userPoPageInfo = new PageInfo<>(UserPoList);

二. PageHelper使用以及PageInfo中分页对象的转化

首先,在使用Mybatis查询数据库展示到前端的过程中不可避免的要考虑到分页问题,这时就引入了Mybatis的PageHelper插件,这个插件对分页功能进行了强有力的封装,只需要将查询出来的数据List集合放入到它指定的对象中,就完成了分页
其中PageHelper插件是属于mybatis框架的,所以肯定会和mybatis内在的融合,即MySQL一般使用 LIMIT 实现分页查询

分页核心代码

public PageInfo<Po> pageList(Integer pageNum, Integer pageSize){

	// 开启分页————————这一步实际是创建一个page对象,这个对象中有分页所需的基本配置项
	//Page<Object> startPage = PageHelper.startPage(2, 3);
    PageHelper.startPage(pageNum, pageSize);
    
    //上面创建的page对象,会对其下最接近的mybatis的sql语句进行limit分页查询的;  创建的Page对象,实际上是一个ArrayList类型的集合 
    List<Po> poList = poMapper.selectXxx();
    
    // 封装list到PageInfo对象中,即对page的进一步详细封装(又加入了分页查询后的数据)
    PageInfo<Po> poPageInfo = new PageInfo<>(poList);
    
    return poPageInfo;
}
 
    pageNum:指定了查询第几页数据;
    pageSize:指定每一页显示多少条数据;

上述核心细节:Page中已经封装有分页的基本属性(pageNum和pageSize)了,但是PageInfo是对Page的进一步封装。

  1. Po是数据库对应的实体类对象; 为啥说po是数据库的实体对象呢,因为mybatis原理可知,查询后返回的实体对象和数据库中数据结构一致。
  2. PageInfo是需要返回的对象类型,里面封装了包含Po数据的List集合;实际上,第一步开启分页时设置了起始页和页面数量而创建的page对象就完成对紧接的mapper进行limit分页了,但是PageInfo是对Page的进一步封装,还有添加加了一些更丰富的判断方法,将之前Page中封装的分页参数和分页后的数据共同封装在一起了这也是PageInfo和Page的区别之处

三.PageInfo<>对象泛型的转化

mybatis的分页,正常情况下PageInfo中的泛型必须是数据库的实体类对象,即PO对象为啥呢?


因为PageHelper.startPage(pageNum, pageSize);创建的page对象,对最近的mybatis的sql有效,之后mybatis返回的查询list结果时,由于
page类型也是ArrayList类型,所以返回的list类型的po集合,被类型转换为page类型了。它里面有page封装的分页相关属性,只有将这个
po对象传给PageInfo,这样Pageinfo中对page的进一步封装相关属性才会被赋值。如果将mybatis返回的po,进行了转换和解析为
vo对象,这个vo对象虽然也是list集合,但是里面有mybatis的pagehelper插件转换的page相关属性都没有了,这样vo封装到pageinfo中
里面分页相关属性就获取不到了。

在这里插入图片描述

3.1 泛型转换:

这里定义了一个静态的工具方法,用于将PageInfo中的泛型Po对象转换为Vo对象,其他对象类似,只需要传入对应的泛型。

public class PageUtils{
    /**
         * 将PageInfo对象泛型中的Po对象转化为Vo对象
         * @param pageInfoPo PageInfo<Po>对象</>
         * @param <P> Po类型
         * @param <V> Vo类型
         * @return
     */
     public static <P, V> PageInfo<V> PageInfo2PageInfoVo(PageInfo<P> pageInfoPo) {
         // 创建Page对象,实际上是一个ArrayList类型的集合
         Page<V> page = new Page<>(pageInfoPo.getPageNum(), pageInfoPo.getPageSize());
         page.setTotal(pageInfoPo.getTotal());
         return new PageInfo<>(page);
     }
}

  • 泛型P:Po对象类型;
  • 泛型V:Vo或其他需要分页的数据类型;
  • Page对象是保存list数据集合,实际上是ArrayList类型;
  • 转换泛型的实质就是给新的PageInfo对象中的page对象添加pageNum、pageSize、Total等属性。在得到PageInfo对象后可以使用getList()方法获取存储数据的List集合,进而给PageInfo对象保存需要分页的数据。

3.2 分页逻辑且泛型转换的实现:


UserPo.java

public class UserPo{
	private Integer id;
    private String userName;
    private String userPassword;
    private Integer addressId;
}

UserVo.java

public class UserVo{
	private Integer id;
    private String userName;
    private String addressName;
}
===============================================================================
public class UserServiceImpl implements UserService{
	public pageInfo<UserVo> pageUserVoList(Integer pageNum, Integer pageSize){
    	// 1. 开启分页
        PageHelper.startPage(pageNum, pageSize);
        // 2. 从数据库中查询出
        List<UserPo> UserPoList = UserPoMapper.selectXxx();
        // 3. 封装list到PageInfo对象中自动分页
        PageInfo<Po> userPoPageInfo = new PageInfo<>(UserPoList);
        
        // 4. 转换为UserVo类型的PageInfo对象
        PageInfo<UserVo> UserVoPageInfo = PageUtils.PageInfo2PageInfoVo(userPoPageInfo);
        // 5. 创建需要分页的UserVoList
        List<UserVo> userVoList = new ArrayList<>();
        // 6. 遍历UserPo给UserVoList初始化
        for(UserPo userpo : UserPoList){
        	UserVo uservo = new UserVo();
            // 6.1 将与Po对象相同属性的值赋值到Vo对象中
            BeanUtils.copyProperties(userpo, uservo);
            String addressName = userPoMapper.selectAddressById(userpo.AdrressId).getAddressName();
            uservo.setAddressName(addressName);
            userVoList.add(uservo);
        }
        for (UserVo uservo : userVoList) {
    		userVoPageInfo.getList().add(articleVo);
		}
    	return userVoPageInfo;
    }
}

这里主要处理了UserVo与UserPo中不同的数据,真正处理分页的逻辑代码非常简单。只要能够获得需要分页Vo对象的集合,存入到VoPageInfo的List中即可。

四.假分页

上面分页原理是mybatis的pagehelper插件,这个插件内在本质和mybatis有结合的,只要封装和创建好分页所需属性的page对象后,会自动对紧邻的mybatis的第一个sql生效,那么如果是单纯的集合数据的分页,不是和mybatis查询回的集合数据的分页呢?那么就用单纯将集合基于pageNum和pageSize来手动分页就可以了,list有一个sublist方法,从集合中灵活提取某些数据来完成分页;

	public PageInfo<Object> toPageResponse(List<Object> list) {
      
        List<Object> pageList = list;
        int total = list.size();
        com.github.pagehelper.Page<Object> page = PageHelper.getLocalPage();
        if (page != null && page.getPageNum() > 0) {
            int pageSize = page.getPageSize();
            int totalPage = total / pageSize + (total % pageSize == 0 ? 0 : 1);
            int pageNum = page.getPageNum();
            if (pageNum > totalPage) {
                pageNum = totalPage;
            }
            if (pageNum < 1) {
                pageNum = 1;
            }
            pageList = list.subList((pageNum - 1) * pageSize, Math.min(list.size(), pageNum * pageSize));
            PageHelper.clearPage();
        }               
        return new PageInfo<Object>( pageList);
    }

本文链接: http://www.dtmao.cc/news_show_350347.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?