**
今天我们主要学习的实后台的分页效果首先
分页三要素
page 页码 视图层传递过来
rows 页大小 视图层传递过来
total 总记录数 后台查出来
**
目的:作用通用的分页的查询方法
1、先利用以前的知识完成一个普通的查询方法
2、将原有的查询方法进行反射优化,转变成一个可以被所有实体类dao层所继承的通用查询方法
3、考虑该方法可以进行分页
3.1 算总记录数
3.2 查询出当前页的结果集
1.首先我们写的是运用以前学习的知识来做一个查询所有的方法
public List<Book>list(Book book,PageBean pageBean) throws SQLException{
// String sql="select * from t_mvc_book where true";
// String bname=book.getBname();
// if(StringUtils.isNotBlank(bname)) {
// sql+= " and bname like '%"+bname+"%'";
// }
// Connection con = DBAccess.getConnection();
// PreparedStatement pst = con.prepareStatement(sql);
// ResultSet rs=pst.executeQuery();
// List<Book>list=new ArrayList<>();
// while(rs.next()) {
// list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
// }
// DBAccess.close(con, pst, rs);
// return list;
2、将原有的查询方法进行反射优化,转变成一个可以被所有实体类dao层所继承的通用查询方法
我们需要重新建一个dao包然后运用泛型从上面那个包吧sql 运用反射 还有就是是否要进行分页的属性传过去为下一步分页做好铺垫!!
package com.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.entity.Book;
/**
* T代表你要对哪个实体类对应的表进行分页查询
* @author Administrator
*
* @param <T>
*/
public class BaseDao <T>{
/**
*
* @param sql 查询不同的实体类 ,那么对应的sal语句不同,所以需要传递
* @param clz 生产出不同的实体类对应的实列,然后装进list容器中返回
* @param pageBean 决定是否分页
* @return
* @throws SQLException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public List<T>executeQuery(String sql,Class clz,PageBean pageBean) throws SQLException, InstantiationException, IllegalAccessException{
Connection con = DBAccess.getConnection();
PreparedStatement pst=con.prepareStatement(sql);
ResultSet rs=pst.executeQuery();
List<T>list=new ArrayList<>();
T t;
while(rs.next()) {
/**
* 1.实列化一个book对象(该对象空的)
* 2.取book的所有属性,然后给其赋值
* 2.1获取所有属性对象
* 2.2给属性对象赋值
* 3.赋完值得book对象装进list容器中
*/
// list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
t = (T) clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
field.set(t, rs.getObject(field.getName()));
}
list.add(t);
}
DBAccess.close(con, pst, rs);
return list;
}
/**
* 利用原生sql拼接出符合条件的结果集的查询sql
* @param sql
* @param pageBean
* @return
*/
}
测试结果
很显然达到了同样的目的!!
3、考虑该方法可以进行分页
1.首先介绍一下分页所需要的包
PageBean包
package com.util;
/**
* 分页工具类
*
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 10;// 页大小
private int total = 0;// 总记录数
private boolean pagination = true;// 是否分页
public PageBean() {
super();
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public void setTotal(String total) {
this.total = Integer.parseInt(total);
}
public boolean isPagination() {
return pagination;
}
public void setPagination(boolean pagination) {
this.pagination = pagination;
}
/**
* 获得起始记录的下标
*
* @return
*/
public int getStartIndex() {
return (this.page - 1) * this.rows;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
}
}
里面有很多什么计算总条数还有是否要分页的属性自己拿着用就好了
然后接下来写分页的代码
package com.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.entity.Book;
/**
* T代表你要对哪个实体类对应的表进行分页查询
* @author Administrator
*
* @param <T>
*/
public class BaseDao <T>{
/**
*
* @param sql 查询不同的实体类 ,那么对应的sal语句不同,所以需要传递
* @param clz 生产出不同的实体类对应的实列,然后装进list容器中返回
* @param pageBean 决定是否分页
* @return
* @throws SQLException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public List<T>executeQuery(String sql,Class clz,PageBean pageBean) throws SQLException, InstantiationException, IllegalAccessException{
Connection con = DBAccess.getConnection();
PreparedStatement pst=con.prepareStatement(sql);
ResultSet rs=pst.executeQuery();
List<T>list=new ArrayList<>();
if(pageBean!=null && pageBean.isPagination()) {
// 需要分页
// 算符合条件的总记录数
String countSql=getCountSql(sql);
pst = con.prepareStatement(countSql);
rs=pst.executeQuery();
if(rs.next()) {
pageBean.setTotal(rs.getLong(1)+"");
}
// 查询出符合条件的结果集
String pageSql=getPageSql(sql,pageBean);
pst = con.prepareStatement(pageSql);
rs=pst.executeQuery();
}else {
pst = con.prepareStatement(sql);
rs=pst.executeQuery();
}
T t;
while(rs.next()) {
/**
* 1.实列化一个book对象(该对象空的)
* 2.取book的所有属性,然后给其赋值
* 2.1获取所有属性对象
* 2.2给属性对象赋值
* 3.赋完值得book对象装进list容器中
*/
// list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
t = (T) clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
field.set(t, rs.getObject(field.getName()));
}
list.add(t);
}
DBAccess.close(con, pst, rs);
return list;
}
/**
* 利用原生sql拼接出符合条件的结果集的查询sql
* @param sql
* @param pageBean
* @return
*/
private String getPageSql(String sql, PageBean pageBean) {
// TODO Auto-generated method stub
return sql+"limit "+pageBean.getStartIndex()+","+pageBean.getRows()+";";
}
/**
* 获取符合条件的总记录数的sql语句
* @param sql
* @return
*/
private String getCountSql(String sql) {
// TODO Auto-generated method stub
return "select count(1) from("+sql+")t;";
}
}
理一下 首先是你是否要分页哪里有一个if判断如果进行分页就走里面的代码
先计算出来总条数,然后数据库里面的关键字limit的意思就是
第一个数字代表初始下表 第二个数字就是代表偏移量
比如:select * from t_mvc_book where true and bname like ‘%圣墟%’ limit 0,5;
他就会显示下标0-5之间的数据
然后看那边的运行代码
package com.chenkang.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.entity.Book;
import com.util.BaseDao;
import com.util.DBAccess;
import com.util.PageBean;
import com.util.StringUtils;
/**
* Book book 封装这jsp传递过来的查询参数
* PageBean pageBean 决定dao层的list调用时是否分页
* @author Administrator
*
*/
public class BookDao extends BaseDao<Book>{
// public List<Book>list(Book book,PageBean pageBean) throws SQLException{
// String sql="select * from t_mvc_book where true";
// String bname=book.getBname();
// if(StringUtils.isNotBlank(bname)) {
// sql+= " and bname like '%"+bname+"%'";
// }
// Connection con = DBAccess.getConnection();
// PreparedStatement pst = con.prepareStatement(sql);
// ResultSet rs=pst.executeQuery();
// List<Book>list=new ArrayList<>();
// while(rs.next()) {
// list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
// }
// DBAccess.close(con, pst, rs);
// return list;
//
// }
public List<Book>list(Book book,PageBean pageBean) throws SQLException, Exception{
String sql="select * from t_mvc_book where true";
String bname=book.getBname();
if(StringUtils.isNotBlank(bname)) {
sql+= " and bname like '%"+bname+"%'";
}
return super.executeQuery(sql, Book.class, pageBean);
}
public static void main(String[] args) throws Exception {
BookDao bookDao=new BookDao();
Book book=new Book();
book.setBname("圣墟");
// PageBean pageBean=new PageBean();
// pageBean.setPage(2);
List<Book> list = bookDao.list(book, pageBean);
for (Book b : list) {
System.out.println(b);
}
}
}
测试结果
就这样做了一个后台的分页效果