部门分页查询

部门分页查询

  • 简单基础分页
  1. 分析
  1. 分页查询也是数据库进行查询的,所以我们要分页对应的SQL语向应该怎么写。
  2. 分页查询使用 LIMIT 关键字,格式为: LIMIT 开始索引, 每页显示的条数
  3. 以后前端页面在发送请求携带参数时,它并不明确开始索引是什么,但是它知道查询第几页。所以开始索引需要在后端进行计算,计算的公式是 :开始索引 = (当前页码-1)每页显示条数

基于上图,我们可以看到,前端需要请求的数据为:

  1. 展现哪一个页面
  2. 每个页面展示多少数据

基于上图,我们可以看到,后端需要响应的数据为:

  1. 数据表里面所有数据的条数
  2. 展现出前端指定页面的数据信息
  1. 设计

Controller层:

  1. 我们使用Get风格的请求
  2. 设定前端请求的参数为 page以及pageSize这两个数据对应展现哪一个页面以及每个页面展示多少数据
  3. 由于后端需要处理总条数以及当前页面对应的所有数据,因此我们将这两条数据封装在pageBean类的对象里面统一传输(当然我们也可以选用其他方式进行数据传输,比如集合)
  4. 我们响应的话就是用统一响应结果,将pageBean返回出去。

@RestController
public class EmpController {
    @Autowired
    private EmpService empService;

    @GetMapping("/emps")//@RequestParam(defaultValue = "1")设置一个默认的初始展现数据
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "5") Integer pageSize) {
        PageBean pagebean = empService.page(page, pageSize);
        return Result.success(pagebean);
    }
}

Service层:

  1. 看注释

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Override
    public PageBean page(Integer page, Integer pageSize) {
        //获取总条数
        Long count=empMapper.count();

        //获取指定页面的所有员工数据
        //在这里我们已经将页面展示的数据显示计算好了(page-1)*pageSize
        List<Emp> empList = empMapper.page((page-1)*pageSize, pageSize);
        //返回一个pageBean集合
        return new PageBean(count,empList);
    }
}

mapper层:

@Mapper
public interface EmpMapper {


    @Select("select count(*) from emp")
    public Long count();//获取数据表里面的总条数

    @Select("select * from emp limit #{page} ,#{pageSize}")//数据传入进行分页展示操作
   public List<Emp> page(@Param("page") int page, @Param("pageSize") Integer pageSize);
}

  • 分页插件

(1)分页插件以及使用规则

PageHelper 是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。

如果使用了PageHelper分页插件进行分页,那我们是无需再Mapper这层来手动分页的。 Mapper这一层,我们进行正常的列表查询即可。我们需要在Service层中,调用Mapper的方法之前设置分页参数,在调用Mapper方法执行查询之后,解析分页结果,并将结果封装到PageBean对象中,返回。

(2)设计

流程如下:

步骤:

  1. 引入依赖:

<dependency>

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper-spring-boot-starter</artifactId>

    <version>1.4.2</version>

</dependency>

  1. 代码实现

Controller层:不变,该怎么写还怎么写

Service层:

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    @Override
    public PageBean page(Integer page, Integer pageSize) {
        //1.设置分页参数,这个里面无需多想,分页插件自动计算和操作
        PageHelper.startPage(page, pageSize);

        //2.执行查询
        List<Emp> list = empMapper.list();
        Page<Emp> p = (Page<Emp>) list;//Page<Emp>是分页插件pagehelper当中提供的分页结果的封装类,也无需多想

        //封装PageBean对象
        return new PageBean(p.getTotal(), p.getResult());//分页总数,目标分页的总数据
    }

Mapper层:

直接写一个数据库查询语句就行

@Select("select * from emp")
public List<Emp> list();

  • 条件分页
  1. 需求

我们看到页面原型及需求中描述,搜索栏的搜索条件有三个,分别是:

姓名:模糊匹配

性别:模糊匹配

入职时间:范围匹配

  1. 开发

Controller层:

  1. 前端请求什么参数就要在controller层的方法参数中添加什么参数
  2. 当传入的参数为时间对象的时候,我们需要给她加一个注解为指定时间的类型

@GetMapping("/emps")
public Result pageByTj(String name, Short gender,
                       //切记当传入一个时间对象类型的时候,一定要指定他的编码规则
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end,
                       @RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "5") Integer pageSize) {

    //返回一个pageBean对象的内容,由于pageBean里面的emp数据为list所以可以使用直接塞进去
    PageBean pageBean = empService.pageByTj(name,gender,begin,end,page,pageSize);
    return Result.success(pageBean);
}

Service层:

  1. 我们使用了pageHelper分页插件,所以在mapper层方法中就不需要再传入分页的参数了,只需要将其他的参数放到方法里面进行传输

@Override
public PageBean pageByTj(String name, Short gender, LocalDate begin,
                         LocalDate end, Integer page, Integer pageSize) {
    PageHelper.startPage(page, pageSize);
    List<Emp> empList = empMapper.pageByTj(name,gender,begin,end);
    Page<Emp> p = (Page<Emp>) empList;
    return new PageBean(p.getTotal(), p.getResult());
}

Mapper层:

  1. mapper层当中我们所看到的是使用了动态sql语句的xml方法,所以只需要指定相应的参数,将所有的sql语句放到xml文件中即可
  2. 在参数前面加上注解,用来识别,建议后面都加上。但是如果是对象的参数就不要加否则报错

List<Emp> pageByTj(@Param("name") String name, @Param("gender")Short gender,
                   @Param("begin")LocalDate begin,@Param("end")LocalDate end);

Xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.Mapper.EmpMapper">//namespace指定mapper层方法的全路径
    <select id="pageByTj" resultType="com.example.pojo.Emp">//方法,返回值
        select *from emp
        <where>
            <if test="name!=null and name!=''">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender!=null">
                and gender=#{gender}
            </if>
            <if test="begin!=null and end!=null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>
</mapper>

1. 首先需要在pom.xml中添加mybatisplus和分页插件的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> ``` 2. 在application.yml中配置mybatisplus和分页插件的参数: ``` mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml global-config: db-config: id-type: auto field-strategy: not_empty table-prefix: sys_ configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql ``` 3. 编写Mapper接口: ``` @Mapper public interface DeptMapper extends BaseMapper<Dept> { List<Dept> selectPage(Page<Dept> page, @Param("deptName") String deptName); } ``` 4. 编写Service实现类: ``` @Service public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements DeptService { @Override public IPage<Dept> selectPage(Page<Dept> page, String deptName) { QueryWrapper<Dept> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(deptName)) { queryWrapper.like("dept_name", deptName); } return baseMapper.selectPage(page, queryWrapper); } } ``` 5. 编写Controller: ``` @RestController @RequestMapping("/dept") public class DeptController { @Autowired private DeptService deptService; @GetMapping("/list") public Result list(Page<Dept> page, String deptName) { IPage<Dept> data = deptService.selectPage(page, deptName); return Result.success(data); } } ``` 6. 在前端页面中,可以通过ajax请求/list接口,传入参数page和deptName实现分页查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值