1 分页查询
1.1 分页核心
设计一个用于封装当前页所有分页相关的数据的对象,叫分页对象PageBean
/**
* 分页对象。用于封装当前页的分页相关的所有数据
* @author h
*
*/
public class PageBean {
private Listdata;//当前页的数据
private Integer firstPage;//首页
private Integer prePage;//上一页
private Integer nextPage;//下一页
private Integer totalPage;//末页、总页数
private Integer currentPage;//当前页
private Integer totalCount;//总记录数
private Integer pageSize;//每页显示的记录数
}
1.2 分页的实现步骤
1)编写分页对象和实体对象
/**
* 分页对象。用于封装当前页的分页相关的所有数据
* @author h
*
*/
public class PageBean {
private Listdata;//当前页的数据
private Integer firstPage;//首页
private Integer prePage;//上一页
private Integer nextPage;//下一页
private Integer totalPage;//末页、总页数
private Integer currentPage;//当前页
private Integer totalCount;//总记录数
private Integer pageSize;//每页显示的记录数
public ListgetData() {
return data;
}
public void setData(Listdata) {
this.data = data;
}
public Integer getFirstPage() {
return 1;
}
public void setFirstPage(Integer firstPage) {
this.firstPage = firstPage;
}
/**
* 计算上一页
* @return
*/
public Integer getPrePage() {
return this.getCurrentPage()==this.getFirstPage() ? 1 : this.getCurrentPage()-1;
}
public void setPrePage(Integer prePage) {
this.prePage = prePage;
}
/**
* 计算下一页
* @return
*/
public Integer getNextPage() {
return this.getCurrentPage()==this.getTotalPage()?
this.getTotalPage()
: this.getCurrentPage()+1;
}
public void setNextPage(Integer nextPage) {
this.nextPage = nextPage;
}
public Integer getTotalPage() {
return this.getTotalCount()%this.getPageSize()==0 ?
this.getTotalCount()/this.getPageSize()
:this.getTotalCount()/this.getPageSize()+1;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getTotalCount() {
return totalCount;
}
public void setTotalCount(Integer totalCount) {
this.totalCount = totalCount;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
以员工查询信息为例子
/**
* 员工对象
* @author h
*
*/
public class Employee {
private int id;
private String name;
private String gender;
private int age;
private String title;
private String phone;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Employee(int id, String name, String gender, int age, String title,
String phone, String email) {
super();
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
this.title = title;
this.phone = phone;
this.email = email;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Employee [age=" + age + ", email=" + email + ", gender="
+ gender + ", id=" + id + ", name=" + name + ", phone=" + phone
+ ", title=" + title + "]";
}
}
2)编写DAO层代码(查询总记录数和查询当前页数据)
/**
* 员工的DAO类
* @author h
*
*/
public class EmpDao {
/**
* 提供一个查询当前页员工的方法
*/
public ListqueryCurrentData(Integer currentPage,Integer pageSize){
try {
//1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(JdbcUtil.getDataSource());
//2.执行查询sql操作
//计算查询的起始行
int startNo = (currentPage-1)*pageSize;
Listlist = (List)qr.query("SELECT * FROM employee LIMIT ?,?",
new BeanListHandler(Employee.class),
new Object[]{startNo,pageSize});
return list;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 提供查询总记录数的方法
* @param args
*/
public Integer queryTotalCount(){
try {
//1.创建QueryRunner
QueryRunner qr = new QueryRunner(JdbcUtil.getDataSource());
//2.执行sql查询
Long count = (Long)qr.query("SELECT COUNT(*) FROM employee", new ScalarHandler(1));
return count.intValue();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
3)编写Service层代码(封装PageBean对象)
/**
* 员工的业务类
* @author h
*
*/
public class EmpService {
/**
* 提供用于封装PageBean对象方法(处理业务逻辑)
*/
public PageBean queryPageBean(Integer currentPage,Integer pageSize){
//封装PageBean分页对象数据
PageBean pageBean = new PageBean();
//设置当前页
pageBean.setCurrentPage(currentPage);
//设置每页显示的记录数
pageBean.setPageSize(pageSize);
EmpDao empDao = new EmpDao();
/**
* 从数据库中查询出总记录数
*/
int totalCount = empDao.queryTotalCount();
//设置总记录数
pageBean.setTotalCount(totalCount);
//设置当前页的数据
/**
* 从数据库中查询出当前页的员工数据
*/
Listlist = empDao.queryCurrentData(pageBean.getCurrentPage(), pageBean.getPageSize());
pageBean.setData(list);
return pageBean;
}
}
4)编写Servlet代码(接收用户输入)
public class PageServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/***********一、获取用户输入**************/
//设置当前页(获取用户的输入)
String currentPageStr = request.getParameter("currentPage");
//如果用户没有输入,就是默认第1页
if(currentPageStr==null || currentPageStr.equals("")){
currentPageStr = "1";
}
//设置每页显示的记录数(获取用户的输入)
String pageSizeStr = request.getParameter("pageSize");
if(pageSizeStr==null || pageSizeStr.equals("")){
pageSizeStr = "5";
}
/***************二、调用业务方法,获取PageBean对象***********************/
EmpService empService = new EmpService();
PageBean pageBean = empService.queryPageBean(Integer.parseInt(currentPageStr), Integer.parseInt(pageSizeStr));
/****************三、得到业务数据,跳转视图*********************/
//把PageBean数据发送到jsp页面中显示
request.setAttribute("pageBean", pageBean);
//转发
request.getRequestDispatcher("/list.jsp").forward(request, response);
}
}
5)编写jsp页面代码(显示分页效果)
分页显示效果
编号
姓名
性别
年龄
职位
电话
邮箱
${emp.id }
${emp.name }
${emp.gender }
${emp.age}
${emp.title }
${emp.phone }
${emp.email }
首页
上一页
下一页
末页
当前第${pageBean.currentPage }页/共${pageBean.totalPage }页,
共${pageBean.totalCount }条 每页显示 条
2 条件查询
2.1 条件查询的核心
根据用户的查询条件组装sql语句:
//组装sql
StringBuffer sql = new StringBuffer("select * from department where 1=1 ");
if(query!=null){
//部门名称不为空时
if(query.getDeptName()!=null && !query.getDeptName().equals("")){
sql.append(" and deptName like '%"+query.getDeptName()+"%'");
}
//部门负责人不为空时
if(query.getPrincipal()!=null && !query.getPrincipal().equals("")){
sql.append(" and principal like '%"+query.getPrincipal()+"%'");
}
//部门职能不为空时
if(query.getFunctional()!=null && !query.getFunctional().equals("")){
sql.append(" and functional like '%"+query.getFunctional()+"%'");
}
}