SSH, 整合分页功能,连带DAO经典封装
2023-09-14 08:57:54 时间
Action:
任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数。并根据这个参数进行查值。
然后在继承ServiceManage,ServiceManage类是用来 存放共用的东西:response,重要的是Service的get set
具体讲一下PageManage,
totalPages;//总页数
totalRecord;//总记录数
showRecordNum=DEFAULT_PAGE_NUM;//每页显示记录数
showPageNum;//当前页显示的记录数量
public class PageManage extends ServiceManage{ * 分页的一些参数 * @author sl private static final long serialVersionUID = 1L; // 以下三个参数是分页需返回 // protected int currentPage = 1; // 当前页数 protected int totalPages; // 总页数 protected int totalRecord; // 总记录数 protected int pageNum = 1; // 当前页数 //默认每页的数量 protected int numPerPage = 20; protected PageUtil pageUtil(int totalRecord_) { return new PageUtil(pageNum, totalRecord_, numPerPage); //一些getset方法 public int getTotalPages() { return totalPages; public void setTotalPages(int totalPages) { this.totalPages = totalPages; public int getTotalRecord() { return totalRecord; public void setTotalRecord(int totalRecord) { this.totalRecord = totalRecord; public int getPageNum() { return pageNum; public void setPageNum(int pageNum) { this.pageNum = pageNum; public int getNumPerPage() { return numPerPage; public void setNumPerPage(int numPerPage) { this.numPerPage = numPerPage;其中涉及到的 PageUtil,这就分页的参数设置,和进行分页功能的一些逻辑判断,逻辑变动。
PageUtil:
PageUtil(Integer currentPage,Integer totalRecord,int showRecordNum)这个定义了一个page 以后调用就这个。 //分页用到的基本两个参数:1.总的记录条数 2.每页的记录条数 DEFAULT_CURRENT=1; //默认显示第一页 DEFAULT_PAGE_NUM=20;//默认显示20条记录 pageFirRecord=0;//当前页第一条记录 currentPage=1;//当前页数 totalPages;//总页数 totalRecord;//总记录数 showRecordNum=DEFAULT_PAGE_NUM;//每页显示记录数 showPageNum;//当前页显示的记录数量 prePage=1; nexePage=1;public class PageUtil{ //分页用到的基本两个参数:1.总的记录条数 2.每页的记录条数 //public static final Integer DEFAULT_CURRENT=1; //默认显示第一页 public static final Integer DEFAULT_PAGE_NUM=20;//默认显示20条记录 protected Integer pageFirRecord=0;//当前页第一条记录 protected Integer currentPage=1;//当前页数 protected Integer totalPages;//总页数 protected Integer totalRecord;//总记录数 protected Integer showRecordNum=DEFAULT_PAGE_NUM;//每页显示记录数 protected Integer showPageNum;//当前页显示的记录数量 protected Integer prePage=1; protected Integer nexePage=1; public PageUtil(){ public PageUtil(Integer currentPage,Integer totalRecord){//两个参数,一个是当前页数,一个是总页数
public PageUtil(Integer currentPage,Integer totalRecord,int showRecordNum){ //showRecordNum:为当前页的总记录条数 this.setTotalRecord(totalRecord); this.setShowRecordNum(showRecordNum); this.setTotalPages(); this.setCurrentPage(currentPage); this.setShowPageNum(); this.setPageFirRecord(); this.setPrePage();//计算前一页页码 this.setNexePage();//计算下一页页码 public Integer getPrePage() { return prePage; public void setPrePage() {//设置前一页的页码 this.prePage = currentPage-1;//为当前页数减1
if(currentPage==totalPages){ //如果当前页码为总页码,即最后一页 this.nexePage = 0;//返回0 }else{ this.nexePage = currentPage+1;//当前页加1 if(totalPages==0){//如果总页数为0,怎么返回0; this.nexePage = 0;
public void setShowPageNum() {//当前页显示的记录数量 if(currentPage*showRecordNum-totalRecord 0){//当前页数*每页显示的条数—总的记录条数 0 表示现在已经是最后一页了 this.showPageNum = totalRecord-(currentPage-1)*showRecordNum; }else{ this.showPageNum=showRecordNum;
public void setShowRecordNum(Integer showRecordNum) { this.showRecordNum = showRecordNum;
if(currentPage totalPages totalPages!=0){ this.currentPage=totalPages;//当前页大于总页数时为总页数,并且保证不存在记录时不出错,即totalPages!=0 }else if(totalPages==0){ this.currentPage=1; }else{ this.currentPage = currentPage;
public void setPageFirRecord() {//第一条记录所在集合的标号,比实际排数少一 this.pageFirRecord = (getCurrentPage()-1)*showRecordNum;//第一条记录为当前页的前一页*每页显示的记录数 public Integer getPageFirRecord() {//返回第一条记录 return pageFirRecord;
只要继承一个父类CURDS;CURDS类里面的方法和封装好的DAO层hibernate带分页的分装方法一致 随便一个service层接口: 一般的方法自然都在CURDS有了。以下是写一个特殊的方法 List AuthApply getApplie(): 所以一般来说,CURDS里面的方法够用了。
共用的CURDS接口里面的方法里面如果要用就实现,不用不需要 DAOManage:只是DAO接口的注入public class AuthApplySI extends DAOManage implements AuthApplyS{ public AuthApply findById(Integer id) { return authApplyD.findById(id); public List AuthApply getList(PageUtil pageUtil, Object... args) { return authApplyD.findByPage(getHQL((String)args[0]), pageUtil.getPageFirRecord(), pageUtil.getShowRecordNum()); public int getNums(Object... args) { return authApplyD.findByPage(getHQL((String)args[0]), 0, 0).size(); private String getHQL(String type){ StringBuffer hql = new StringBuffer("from AuthApply as auth where auth.authType = "+type+""); hql.append(" and auth.status = "+AuthCon.SUBMIT_AUTH+""); return hql.toString(); public AuthApply makePersitent(AuthApply entity) { return authApplyD.makePersitent(entity); public List AuthApply getApplie(String type, String status, Integer memberId) { StringBuffer hql = new StringBuffer("from AuthApply as auth where auth.authType = "+type+" and auth.status = "+status+""); if(memberId != null){ hql.append(" and auth.member.memberId = "+memberId); return authApplyD.findByPage(hql.toString(), 0, 0).size() == 0? null: authApplyD.findByPage(hql.toString(), 0, 0); }
AuthApplyD实现类: super(AuthApply.class);这个方法很重要,调用的是GenericHibernateDAO的方法,而将Bean类传到DAO层。public class AuthApplyDI extends GenericHibernateDAO AuthApply implements AuthApplyD{ public AuthApplyDI() { super(AuthApply.class);//这super,就是调用父类的构造方法 }GenericDAO接口封装: 这才是我想说的经典
* @param hql 需要查询的hql语句 * @param value 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 List T findByPage(final String hql , final Object value , final int offset, final int pageSize); * 使用hql 语句进行分页查询操作 * @param hql 需要查询的hql语句 * @param values 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 List T findByPage(final String hql, final Object[] values, final int offset, final int pageSize); * 使用sql 语句进行分页查询操作 * @param sql * @param offset * @param pageSize * @return List T findByPageSQL(final String sql, final int offset, final int pageSize); * 根据语句查找总数 * @param hql hql语句 * @return 对应的数目 Integer getCount(String hql); void updateObj(final String hql,final Object[] values); * 更新 * */ void updateEntity(T entity); * 返回list集合 * */ @SuppressWarnings("unchecked") public List getListDataByHQL(String hql); * hql查询单个字段 * */ public List Object findSingleDataByHQL(String hql); * hql查询多个字段 * */ public List Object[] findSomeDataByHQL(String hql);/** * @param T public interface GenericDAO T { * 通过ID获得实体对象 * @param id实体对象的标识符 * @return 该主键值对应的实体对象 T findById(Integer id); T findById(Long id); * 将实体对象持久化 * @param entity 需要进行持久化操作的实体对象 * @return 持久化的实体对象 T makePersitent(T entity); * 将实体变为瞬态 * @param entity需要转变为瞬态的实体对象 void makeTransient(T entity); * 将一系列的实体变为瞬态,使用本地sql * @param hql void makeTransientByIds(String sql); * 使用hql语句进行分页操作 * @param hql * @param offset第一条记录索引 * @param pageSize每页需要显示的记录数 * @return查询的记录 List T findByPage(final String hql,final int offset,final int pageSize);
* @param hql 需要查询的hql语句 * @param value 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 List T findByPage(final String hql , final Object value , final int offset, final int pageSize); * 使用hql 语句进行分页查询操作 * @param hql 需要查询的hql语句 * @param values 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 List T findByPage(final String hql, final Object[] values, final int offset, final int pageSize);public class GenericHibernateDAO T extends HibernateDaoSupport implements GenericDAO T { private Class T persistentClass; public GenericHibernateDAO(Class T persistentClass){ this.persistent "unchecked") public List T findByPage(final String hql, final int offset, final int pageSize){ if(hql == null){ return new ArrayList T List T list= getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(final Session session) throws HibernateException, SQLException{ Query query=session.createQuery(hql); if(!(offset==0 pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); List T result = query.list(); return result; return list; @SuppressWarnings("unchecked") public List findByPageSQL(final String sql, final int offset, final int pageSize){ List list= getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(final Session session) throws HibernateException, SQLException{ Query query=session.createSQLQuery(sql); if(!(offset==0 pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); List result = query.list(); return result; return list;
@SuppressWarnings("unchecked") public List T findByPage(final String hql, final Object value, final int offset, final int pageSize) { List T list = getHibernateTemplate().executeFind(new HibernateCallback() public Object doInHibernate(Session session) throws HibernateException, SQLException Query query=session.createQuery(hql).setParameter(0, value); if(!(offset==0 pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); List T result = query.list(); return result; return list; @SuppressWarnings("unchecked") public List T findByPage(final String hql, final Object[] values, final int offset, final int pageSize) { List T list = getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query=session.createQuery(hql); for (int i = 0 ; i values.length ; i++){ query.setParameter( i, values[i]); if(!(offset==0 pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); List T result = query.list(); return result; return list;
@SuppressWarnings("unchecked") public void updateObj(final String hql, final Object[] values) { getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query=session.createQuery(hql); for(int i=0;i values.length;i++){ query.setParameter( i, values[i]); query.executeUpdate(); return null; public Integer getCount(String hql) { Integer count; //iterate方法与list方法的区别是list取出全部,iterator取出主键,迭代的时候才取出数据 count = ((Long)getHibernateTemplate().iterate(hql).next()).intValue(); System.out.println("大小"+ count); return count; public T makePersitent(T entity) { getHibernateTemplate().saveOrUpdate(entity); return entity; public void makeTransient(T entity) { getHibernateTemplate().delete(entity); @SuppressWarnings("unchecked") public void makeTransientByIds(final String sql) { getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query=session.createQuery(sql); query.executeUpdate(); return null; public T findById(Long id) { return (T) getHibernateTemplate().get(getPersistentClass(), id); public void updateEntity(T entity) { this.getHibernateTemplate().update(entity); @SuppressWarnings("unchecked") public List getListDataByHQL(String hql) { return getHibernateTemplate().find(hql); * hql查询单个字段 * */ @SuppressWarnings("unchecked") public List Object findSingleDataByHQL(String hql) { return getHibernateTemplate().find(hql); * hql查询多个字段 * */ @SuppressWarnings("unchecked") public List Object[] findSomeDataByHQL(String hql) { return getHibernateTemplate().find(hql); }
希望首页能再次通过,我修改下。 总结:带分页功能的SSH整合,DAO层经典封装 考虑前台,一条线的传到后台,然后分工必须明确。 DAO层的封装,可见java底层的魅力。 共同开发,共同努力。
ssh整合问题总结--使用HibernateTemplate实现数据分页展示 在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了一些问题,下面以我练习的项目为例详细介绍,如何在Spring+hibernate(+action)的环境下完成数据的分页查询.
二哥聊RPA 公号「二哥聊RPA」。关注我,一起洞察 RPA ◎ RPA创业者 ◎ 现明堂红木商业顾问,为十月结晶、可啦啦、鑫蜂维等多家企业提供 RPA 咨询服务 ◎ 希望帮助大家在 RPA 上做一些力所能及的事情
相关文章
- ssh后端框架结构
- 在 SPIRE 中用 SSH 证实节点身份
- 替代XShell的SSH客户端/远程桌面 — FinalShell
- 解决Ubuntu下ssh无法启动
- CentOS 6.2中文乱码(SSH)
- Linux基础: ssh服务器配置方法
- Ubuntu20.04基础:桌面安装及root权限开通和ssh安装讲解
- 教你ubuntu如何开启SSH服务远程登录操作
- Linux下SSH免密码登录配置详解
- Linux下SSH的作用及应用(linux中ssh是什么)
- 黑客团伙利用SSH暴力破解器入侵远程设备 用于挖矿和DDoS攻击
- 配置简易指南:Linux下SSH配置一步到位(linux的ssh)
- 连接Linux SSH连接被拒绝:如何解决?(linuxssh拒绝)
- 使用Linux远程SSH工具的优势(linux远程ssh工具)
- 使用SSH操作Linux服务器:必备技能(ssh操作linux)
- 安装Linux上的SSH:简单步骤指南(linux如何安装ssh)
- 登陆 Linux 使用SSH登陆的方法简介(linux怎么ssh)
- shell探索Linux世界,使用Xshell连接SSH(linuxsshx)
- 使用Linux系统ssh远程连接工具(Linux系统ssh工具)
- Linux如何快速删除SSH服务(linux删除ssh)
- 密钥保护Linux服务器:存储SSH密钥的正确姿势(linux保存ssh)
- 远程连接Linux服务器:SSH的使用(linux的ssh服务)
- 安装Oracle远程连接:基于SSH的实施方法(ssh安装oracle)
- Linux脚本精通SSH远程管理(linux脚本ssh)
- 使用Linux SSH命令轻松远程登录(linux的ssh命令)
- 如何修改Linux SSH端口?(linuxssh端口)
- Linux下完美配置SSH远程连接(linux下配置ssh)
- SSH命令:Linux系统连接更快更安全的方式(linux系统ssh命令)
- 如何通过SSH访问MySQL数据库(mysql中ssh)
- SSH搭配Redis,实现更强大的安全性(SSH还需要redis吗)