如何更准确过滤信息?看完本篇你就知道

本文详细介绍了如何在Java Web项目中实现多条件过滤和分页查询功能。首先,通过创建PageResult类封装了分页所需的各种参数,并提供了计算方法。接着,创建QueryObject类用于封装用户传递的分页参数。在服务层,定义了查询方法,通过DAO执行SQL获取数据。在表现层,接收用户参数,调用服务层方法,将结果共享到request作用域中。在页面上,使用EL和JSTL展示数据并实现分页。此外,还讨论了高级查询的实现,包括关键字和部门ID的过滤。最后,强调了在翻页时正确传递高级查询参数的重要性。
摘要由CSDN通过智能技术生成

无论是使用Excel办公,还是浏览器搜寻关键字,都是需要通过条件过滤来实现。今天,手把手教你实现Java web项目——实现多条件过滤功能。

分页查询

需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/上一页/下一页/尾页的查询

数据分析:

通过观察,页面上需要显示下面的几个数据:
当前页:currentPage
页面大小:pageSize
总页数:totalPage
首页:1
上一页:prevPage
下一页:nextPage
尾页:endPage
总条数:totalCount
结果集:result

那么,我们应该如何方便快速的将这多个数据共享到页面上呢?答案是:封装

我们应该将这几个参数封装到一个对象中,然后共享这个对象即可,所以,我们有了下面这个类

@Getterpublic class PageResult {

    public static final  PageResult EMPTY_RESULT = new PageResult(Collections.EMPTY_LIST, 0, 1, 3);

    //1:两传

    private int currentPage;

    private int pageSize;

    

    //2:两查

    private List<?> result;

    private int totalCount;

    

    //3:三计算

    private int prevPage;

    private int nextPage;

    private int endPage;

    

    public PageResult(List<?> result, int totalCount, int currentPage, int pageSize){

        

        this.result = result;

        this.totalCount = totalCount;

        this.pageSize = pageSize;

        this.currentPage = currentPage;

        //计算

        this.endPage = totalCount % pageSize == 0 ?

                    totalCount / pageSize : totalCount / pageSize  + 1;

        this.prevPage = currentPage - 1 > 0 ? currentPage - 1 : 1;

        this.nextPage = currentPage + 1 > endPage ? endPage :currentPage + 1;

    }

}

在这个类中,我们提供了一个构造器来快速封装数据
其中,endPage/prevPage/nextPage是通过上面的几个参数计算得来的

在这些数据中,存在两个需要从数据库中查询得到的数据:总条数/结果集
这两个数据我们需要下面两条SQL进行查询

查询部门表中数据的总条数

SELECT count(id) FROM department

使用LIMIT关键字查询指定页面的数据

SELECT  id, name, sn FROM department LIMIT #{start}, #{pageSize}

#{start}:         使用(currentPage-1)*pageSize表达式计算出来的开始索引#{pageSize}: 每次查询的最大条数

要执行这两条SQL,需要用户传递两个参数:currentPage和pageSize
为了参数方便传递,我们将这两个参数封装到一个类中:QueryObject

@Setter@Getterpublic class QueryObject {

        // 默认查询第一页的数据

    private int currentPage = 1;

        // 页面中默认显示10条数据

    private int pageSize = 5;

    public int getStart(){

        return (currentPage - 1)*pageSize;

    }

}

可以看出,查询结果集中的#{start}表达式,是访问查询对象中的getStart()方法来获取到计算得到的开始索引

到此,我们都已经封装好了分页查询中最核心的两个类:
QueryObject:封装用户传递过来的currentPage/pageSize
PageResult:封装页面上显示需要的result/totalCount/currentPage/pageSize/totalPage/prevPage/pageSize

有了这两个类,我们就可以在service中定义下面的方法,来处理分页查询的业务了:

 

    public PageResult query(QueryObject qo) {

        //查询表中数据的总条数

        int totalCount = dao.queryForCount(qo);

        //当查询到的总条数为0时,说明没有数据,此时就不应该再之后下面的查询

        //直接返回相应的默认值即可

        if (totalCount == 0) {

            return PageResult.EMPTY_RESULT;

        }

        List<Department> data = dao.queryForList(qo);

        PageResult result = new PageResult(data, totalCount, qo.getCurrentPage(), qo.getPageSize());

        return result;

    }

该方法接收用户传递的数据(QueryObject),返回用户需要的数据(PageResult)
通过调用dao中的两个方法执行两条SQL查询数据(总条数和结果集)

<!--查询总条数--><select id="queryForCount" resultType="java.lang.Integer">

        SELECT count(id)

        FROM department

    </select><!--查询结果集-->

    &l

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值