一、目标
实现下面的分查询加条件查询加模糊查询:
二、具体实现
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, pageSize
即limit 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
函数,获取分页的数据。