JavaWeb实现多张表联合查询(可附带条件查询)并实现分页显示

导读:本篇文章讲解 JavaWeb实现多张表联合查询(可附带条件查询)并实现分页显示,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、目标

实现下面的分查询加条件查询加模糊查询:
在这里插入图片描述

二、具体实现

1. 结合两张表进行联合查询

上面的课程列表显示是结合两张表的信息显示的。课程编号,课程名,学分,开课时间,结课时间是课程表中的字段,任课老师,教师联系方式是教师表中的字段。
课程表如下图:
在这里插入图片描述
老师表如下图:
在这里插入图片描述
课程表与老师表是多对一的关系。
看上面的两张表,我们就可以看出两张表基于tno字段进行连接,然后取交集,属于内连接。由于返回的一行不能封装成课程对象,也不能封装成老师对象。所以,我们把每一行的数据放在一个map中,多行用List<map<String, Obiect>>来存放数据。

@Override
    public List<Map<String, Object>> selectCoursesBySno(long sno) {
        String sql="select cno,cname,credit,startDate,endDate,t2.tname,t2.phone  from t_course  t1 " +
                " inner join t_teacher t2 on t1.tno=t2.tno" +
                " where cno not in (select cno  from t_student_course where sno=?)";
		//实例化一个RowMapper接口对象,需要实现他未实现的方法
        RowMapper<Map<String, Object>> rowMapper=new RowMapper<Map<String, Object>>() {
            @Override
            public Map<String, Object> mapRow(ResultSet resultSet, int i) throws SQLException {
                Map<String, Object>  map=new HashMap<>();
                map.put("cno",resultSet.getLong("cno"));
                map.put("cname",resultSet.getString("cname"));
                map.put("credit",resultSet.getString("credit"));
                map.put("startDate",resultSet.getDate("startDate"));
                map.put("endDate",resultSet.getDate("endDate"));
                map.put("tname",resultSet.getString("tname"));
                map.put("phone",resultSet.getString("phone"));
                return map;
            }
        };
        List<Map<String, Object>> list = jdbcTemplate.query(sql, rowMapper, sno);
        return list;
    }
2. 基于上面的两张表的联合查询,实现分页查询

联合查询依旧需要,那么说明上面的sql语句依旧需要写,所带的条件是可带可不带的,所以,我们需要动态拼接sql语句的where部分的限制语句。分页查询需要附带limit ?,?子句,如果要显示第一页(pageNum = 1),每页显示数目为5(pageSize = 5),那么子句为limit (pageNum-1)*pageSize, pageSizelimit 0, 5

@Override
    public List<Map<String, Object>> selectList(int pageNum, int pageSize, CourseVo courseVo) {
        String sql = "select  cno,cname,credit,startDate,endDate," +
                " t2.tname,t2.phone from  t_course  t1  inner join" +
                " t_teacher t2 on t1.tno=t2.tno where 1=1";
        //where  cname like '%Spring%' and tno=3 limit  0,5";
        if (!"".equals(courseVo.getCname())) {
            sql += " and cname like '%" + courseVo.getCname() + "%'";
        }
        if (courseVo.getTno() != -1) {
            sql += " and t1.tno=" + courseVo.getTno();
        }
        sql += " limit ?,?";
        System.out.println(sql);
        RowMapper<Map<String, Object>> rowMapper = new RowMapper<Map<String, Object>>() {
            @Override
            public Map<String, Object> mapRow(ResultSet resultSet, int i) throws SQLException {
                long cno = resultSet.getLong("cno");
                String cname = resultSet.getString("cname");
                long credit = resultSet.getLong("credit");
                Date startDate = resultSet.getDate("startDate");
                Date endDate = resultSet.getDate("endDate");
                String tname = resultSet.getString("tname");
                String phone = resultSet.getString("phone");
                Map<String, Object> map = new HashMap<>();
                map.put("cno", cno);
                map.put("cname", cname);
                map.put("credit", credit);
                map.put("startDate", startDate);
                map.put("endDate", endDate);
                map.put("tname", tname);
                map.put("phone", phone);
                return map;
            }
        };
        List<Map<String, Object>> list = jdbcTemplate.query(sql, rowMapper, (pageNum - 1) * pageSize, pageSize);
        return list;
    }
3. 实现翻页效果(上一页,下一页,首页,尾页,跳转)

(1)首先要知道这些数据总共有多少页,记为totalPage
先获取第一步中结合两张表进行联合查询,统计它的行数,假如为totalCount,那么总的页数可以利用下面的行数计算:

public int getTotalPage() {
        if (this.totalCount % this.pageSize == 0) {
            this.totalPage = this.totalCount / this.pageSize;
        } else {
            this.totalPage = this.totalCount / this.pageSize+1;
        }
        return totalPage;
    }

(2)调用第二步的基于上面的两张表的联合查询,实现分页查询的代码,如果用户点击上一页pageNum-1,下一页pageNum+1,首页pageNum=1,尾页pageNum=totalPage,跳转pageNum=所要跳转的页面值
然后将pageNum传给后台,后台调用第二部的selectList函数,获取分页的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84704.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!