初学SSH,开始用的Struts2+Hibernate3+Spring3,Hibernate中用的HibernateTemplate进行数据库的操作。之后在进行前台页面显示的时候,要用到分页,查了一下资料,Spring 整合 Hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现感觉有点不懂,就没怎么看了。
之后决定把框架都换成跟书上一样的,Struts2.3.34+Hibernate4.3.5+Spring4.0.4,把映射方式改成了注解(其中也遇到了很多问题,卡了很久,见《注解改成映射遇到的问题》),能够正常的List和Delete之后便准备又开始进行分页的工作。
刚刚开始真的是一点头绪都没有,就到处找代码,问人,去GitHub找现成的项目,反正过程很艰难╮(╯﹏╰)╭。
1.数据库建表
2.PO
student.java
1 packagepo;2
3 importjavax.persistence.Column;4 importjavax.persistence.Entity;5 importjavax.persistence.GeneratedValue;6 importjavax.persistence.GenerationType;7 importjavax.persistence.Id;8 importjavax.persistence.Table;9
10 @Entity11 @Table(name = "student")12 public classStudent {13 @Id @Column(name="id")14 @GeneratedValue(strategy =GenerationType.AUTO)15 privateInteger id;16
17 @Column(name="sid")18 privateString sid;19
20 @Column(name="sname")21 privateString sname;22
23 @Column(name="sex")24 privateString sex;25
26 //setter和getter
27 }
3.DAO
BaseDAO
packagedao;importjava.util.List;importjava.io.Serializable;public interface BaseDAO{//根据ID加载实体
T get(ClassentityClazz , Serializable id);//保存实体
Serializable save(T entity);//更新实体
voidupdate(T entity);//删除实体
voiddelete(T entity);//根据ID删除实体
void delete(ClassentityClazz , Serializable id);//获取所有实体
List findAll(ClassentityClazz);//获取实体总数
long findCount(ClassentityClazz);//分页获取
List findByPage(String hql, int pageNo, intpageSize);
}
BaseDAOImpl
packagedao;import org.hibernate.*;importorg.springframework.transaction.annotation.Transactional;importjava.util.List;importjava.io.Serializable;public class BaseDAOImpl implements BaseDAO{//DAO组件进行持久化操作底层依赖的SessionFactory组件
privateSessionFactory sessionFactory;//依赖注入SessionFactory所需的setter方法
public voidsetSessionFactory(SessionFactory sessionFactory)
{this.sessionFactory =sessionFactory;
}publicSessionFactory getSessionFactory()
{return this.sessionFactory;
}//根据ID加载实体
@SuppressWarnings("unchecked")
@Transactionalpublic T get(ClassentityClazz , Serializable id)
{return(T)getSessionFactory().getCurrentSession()
.get(entityClazz , id);
}//保存实体
@TransactionalpublicSerializable save(T entity)
{returngetSessionFactory().getCurrentSession()
.save(entity);
}//更新实体
@Transactionalpublic voidupdate(T entity)
{
getSessionFactory().getCurrentSession().saveOrUpdate(entity);
}//删除实体
@Transactionalpublic voiddelete(T entity)
{
getSessionFactory().getCurrentSession().delete(entity);
}//根据ID删除实体
@Transactionalpublic void delete(ClassentityClazz , Serializable id)
{
getSessionFactory().getCurrentSession()
.createQuery("delete " +entityClazz.getSimpleName()+ " en where en.id = ?0")
.setParameter("0", id)
.executeUpdate();
}//获取所有实体
@Transactionalpublic List findAll(ClassentityClazz)
{return find("select en from "
+ entityClazz.getSimpleName() + " en");
}//获取实体总数
@Transactionalpublic long findCount(ClassentityClazz)
{
List> l = find("select count(*) from "
+entityClazz.getSimpleName());//返回查询得到的实体总数
if (l != null && l.size() == 1)
{return (Long)l.get(0);
}return 0;
}/*** 使用hql 语句进行分页查询操作
*@paramhql 需要查询的hql语句
*@parampageNo 查询第pageNo页的记录
*@parampageSize 每页需要显示的记录数
*@return当前页的所有记录*/@SuppressWarnings("unchecked")
@Transactionalpublic ListfindByPage(String hql,int pageNo, intpageSize)
{//创建查询
returngetSessionFactory().getCurrentSession()
.createQuery(hql)//执行分页
.setFirstResult(pageNo)
.setMaxResults(pageSize)
.list();
}
}
StudentDAO和StudentDAOImpl直接继承以上即可无须修改
4.创建一个PageBean
packagevo;importjava.util.List;public classPageBean {
@SuppressWarnings("rawtypes")private List list;//要返回的某一页的记录列表
private int allRow; //总记录数
private int totalPage; //总页数
private int currentPage; //当前页
private int pageSize;//每页记录数
@SuppressWarnings("unused")private boolean isFirstPage; //是否为第一页
@SuppressWarnings("unused")private boolean isLastPage;//是否为最后一页
@SuppressWarnings("unused")private boolean hasPreviousPage; //是否有前一页
@SuppressWarnings("unused")private boolean hasNextPage;//是否有下一页
@SuppressWarnings("rawtypes")publicList getList() {returnlist;
}
@SuppressWarnings("rawtypes")public voidsetList(List list) {this.list =list;
}public intgetAllRow() {returnallRow;
}public void setAllRow(intallRow) {this.allRow =allRow;
}public intgetTotalPage() {returntotalPage;
}public void setTotalPage(inttotalPage) {this.totalPage =totalPage;
}public intgetCurrentPage() {returncurrentPage;
}public void setCurrentPage(intcurrentPage) {this.currentPage =currentPage;
}public intgetPageSize() {returnpageSize;
}public void setPageSize(intpageSize) {this.pageSize =pageSize;
}/*** 初始化分页信息*/
public voidinit() {this.isFirstPage =isFirstPage();this.isLastPage =isLastPage();this.hasPreviousPage =isHasPreviousPage();this.hasNextPage =isHasNextPage();
}/*** 以下判断页的信息,只需getter方法(is方法)即可
*
*@return
*/
public booleanisFirstPage() {return currentPage == 1; //如是当前页是第1页
}public booleanisLastPage() {return currentPage == totalPage; //如果当前页是最后一页
}public booleanisHasPreviousPage() {return currentPage != 1;//只要当前页不是第1页
}public booleanisHasNextPage() {return currentPage != totalPage; //只要当前页不是最后1页
}/*** 计算总页数,静态方法,供外部直接通过类名调用
*
*@parampageSize每页记录数
*@paramallRow总记录数
*@return总页数*/
public static int countTotalPage(final int pageSize, final intallRow) {int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1;returntotalPage;
}/*** 计算当前页开始记录
*
*@parampageSize每页记录数
*@paramcurrentPage当前第几页
*@return当前页开始记录号*/
public static int countOffset(final int pageSize, final intcurrentPage) {final int offset = pageSize * (currentPage - 1);returnoffset;
}/*** 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
*
* @paramPage 传入的参数(可能为空,即0,则返回1)
*@return当前页*/
public static int countCurrentPage(intpage) {final int curPage = (page == 0 ? 1: page);returncurPage;
}
}
5.Service层
StudentService.java
packageservice;importjava.util.List;importpo.Student;importvo.PageBean;public interfaceStudentService {//分页查询
PageBean queryForPage(int pageSize, intcurrentPage);
}
StudentServiceImpl.java
packageservice;importjava.util.List;importpo.Student;importvo.PageBean;importdao.StudentDAO;public class StudentServiceImpl implementsStudentService{privateStudentDAO studentDAO;public voidsetStudentDAO(StudentDAO studentDAO)
{this.studentDAO =studentDAO;
}
@Overridepublic PageBean queryForPage(int pageSize, intpage) {int count = (int) studentDAO.findCount(Student.class); //总记录数
int totalPage = PageBean.countTotalPage(pageSize, count); //总页数
int offset = PageBean.countOffset(pageSize, page); //当前页开始记录
int length = pageSize; //每页记录数
int currentPage =PageBean.countCurrentPage(page);
List list = studentDAO.findByPage("from Student", offset, length); //该分页的记录//把分页信息保存到Bean中
PageBean pageBean = newPageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(count);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();returnpageBean;
}
}
6.action
packageaction;importjava.util.List;importpo.Student;importservice.StudentService;importvo.PageBean;importcom.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")public class StudentAction extendsActionSupport{privateStudentService studentService;public voidsetStudentService(StudentService studentService) {this.studentService =studentService;
}private intpage;privatePageBean pageBean;public intgetPage() {returnpage;
}public void setPage(intpage) {this.page =page;
}publicPageBean getPageBean() {returnpageBean;
}public voidsetPageBean(PageBean pageBean) {this.pageBean =pageBean;
}publicString pageList(){this.pageBean = studentService.queryForPage(4, page);returnSUCCESS;
}
}
7.前端界面
共页 共条记录 当前第页 第一页 上一页 下一页 最后一页 |
8.效果图
struts.xml和applicationContext.xml配置文件这里就省略了
这次写分页给我最大感觉,只要付出了足够的时间,即使开始感觉很难做的东西都会写着写着,慢慢地就出来了,即使有些地方你不懂,但是你会很莫名其妙的去改正它,虽然你也不知道你为什么要去改,就好像是你知道怎么做一样。。。
最后要感谢龙哥的热心帮助,不仅写了份开发文档,还认真地指导了我很多,真是非常感谢!
此文部分内容来源网络,如有侵犯您的版权问题,请来消息至电子邮件2147895584&qq.com(&换成@)及时与本人联系。转载亦请注明出处,谢谢。