ssh分页查询 mysql_SSH后台分页

初学SSH,开始用的Struts2+Hibernate3+Spring3,Hibernate中用的HibernateTemplate进行数据库的操作。之后在进行前台页面显示的时候,要用到分页,查了一下资料,Spring 整合 Hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现感觉有点不懂,就没怎么看了。

之后决定把框架都换成跟书上一样的,Struts2.3.34+Hibernate4.3.5+Spring4.0.4,把映射方式改成了注解(其中也遇到了很多问题,卡了很久,见《注解改成映射遇到的问题》),能够正常的List和Delete之后便准备又开始进行分页的工作。

刚刚开始真的是一点头绪都没有,就到处找代码,问人,去GitHub找现成的项目,反正过程很艰难╮(╯﹏╰)╭。

1.数据库建表

5f9bd79f004a4f8cab31af6102d725fb.png

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.效果图

1f2fcb5dd2c6bd39688807b8324bb038.png

struts.xml和applicationContext.xml配置文件这里就省略了

这次写分页给我最大感觉,只要付出了足够的时间,即使开始感觉很难做的东西都会写着写着,慢慢地就出来了,即使有些地方你不懂,但是你会很莫名其妙的去改正它,虽然你也不知道你为什么要去改,就好像是你知道怎么做一样。。。

最后要感谢龙哥的热心帮助,不仅写了份开发文档,还认真地指导了我很多,真是非常感谢!

此文部分内容来源网络,如有侵犯您的版权问题,请来消息至电子邮件2147895584&qq.com(&换成@)及时与本人联系。转载亦请注明出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值