mybatis和jpa分页的实现

分页技术
本文介绍MyBatis、MyBatis-Plus及JPA三种框架下的分页实现方式,包括PageHelper、mybatis-plus插件和Spring Data JPA的PageRequest用法。

一、mybatis的分页

1、PageHelper的使用

(1)导入依赖

		<!-- 分页查询依赖 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.12</version>
		</dependency>

(2)mvc的service层

		PageHelper.startPage(page, size);
		List<Demo> demoByParams= demoMapper
				.getDemoByParams(ids.toString(), name, desc, type);
		PageInfo<Demo> pageInfo = new PageInfo<>(demoByParams);
		result.setData(pageInfo.getList());
		result.setTotal(pageInfo.getTotal());

(3)mvc的mapper层

和分页无关,原sql

import org.apache.ibatis.annotations.Param;

List<Demo> getDemoByParams(@Param("ids") String ids, @Param("name") String name,
			@Param("desc") String desc, @Param("type") int type);

二、jpa分页

jpa有好几个继承关系的接口:JpaRepository继承PagingAndSortingRepository,PagingAndSortingRepository继承CrudRepository。
在这里插入图片描述

1、在JpaRepository中

1、org.springframework.data.domain.PageRequest;的使用

(1)mvc的Service层

//jpa自带查询方法分页使用:多传一个参数pageRequest
PageRequest pageRequest = PageRequest.of(page - 1, size);//特别注意:jpa当前页从0开始,但前端一般参数从1开始
Page<JctbctYjjbntPy> findAll = basicFarmlandPageRepository.findAll(pageRequest);
result.setData(findAll.getContent());//获取分页后的数据
result.setTotal(findAll.getTotalElements());//获取总数量
//自定义jpa的sql查询
PageRequest pageRequest = PageRequest.of(page - 1, size);
Page<JctbctYjjbntPy> byZjCodeList = basicFarmlandPageRepository.getByZjCodeList(code, pageRequest);
			result.setData(byZjCodeList.getContent());
			result.setTotal(byZjCodeList.getTotalElements());

(2)mvc的repository层

import org.springframework.data.repository.query.Param;
import org.springframework.data.domain.Page;

@Query("SELECT t FROM JctbctYjjbntPy t WHERE xzdm=?1")
	Page<JctbctYjjbntPy> getByZjCodeList(@Param("code") String code, PageRequest pageRequest);

2、在PagingAndSortingRepository中

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

PageRequest pageRequest = PageRequest.of(page - 1, size);
	 /**
     * Specification<Users>:用于封装查询条件
     */
        Specification<ComponentModelEntity> spec = new Specification<ComponentModelEntity>() {
        //Predicate:封装了 单个的查询条件
        /**
         * Root<Users> root:查询对象的属性的封装。
         * CriteriaQuery<?> query:封装了我们要执行的查询中的各个部分的信息,select  from order by
         * CriteriaBuilder cb:查询条件的构造器。定义不同的查询条件
         */
            @Override
            public Predicate toPredicate(Root<ComponentModelEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> list = new ArrayList<>();
                list.add(cb.equal(root.get("typeId"),"1"));//筛选
                query.orderBy(cb.asc(root.get("id")));//排序
                Predicate[] arr = new Predicate[list.size()];
                return cb.and(list.toArray(arr));
            }
        };
        Page<ComponentModelEntity> all = componentModelDao.findAll(spec,pageRequest);

多条件查询:
PageRequest pageRequest = PageRequest.of(page - 1, size);
        Specification<ToolBoxTask> spec = new Specification<ToolBoxTask>() {
            @Override
            public Predicate toPredicate(Root<ToolBoxTask> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> list = new ArrayList<Predicate>();
                list.add(root.get("type").in("1", "10", "11"));
                list.add(cb.equal(root.get("creatorId"), creatorId));
                Predicate[] p = new Predicate[list.size()];
                return cb.and(list.toArray(p));
            }
        };
        Page<ToolBoxTask> all = toolBoxDao.findAll(spec, pageRequest);

3、区别

CrudRepository提供CRUD的功能
PagingAndSortingRepository提供分页和排序功能
JpaRepository提供JPA相关的方法,如刷新持久化数据、批量删除等。

三、mybatis-plus分页

第一步、新建配置类,如下:

import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisPlusConfig {
 
    /**
     * mybatis-plus分页插件<br>
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}

第二步,使用:

QueryWrapper<TaskManager> queryWrapper = new QueryWrapper<>();
IPage<TaskManager> page = new Page<>(1,10);
taskManagerMapper.selectMapsPage(page, queryWrapper);//查询返回的是map
//IPage<FieldInfo> fieldInfoIPage = fieldInfoMapper.selectPage(page, queryWrapper);//查询返回的是实体类
//page.getRecords()
//page.getTotal()
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值