zoukankan      html  css  js  c++  java
  • 带分页功能的SSH整合,DAO层经典封装

    任何一个封装讲究的是,使用,多状态。
    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;
    }
     
     
    }
    View Code

    其中涉及到的 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){//两个参数,一个是当前页数,一个是总页数
     
     
    this.setTotalRecord(totalRecord);//调用set()方法来将参数赋值
    this.setTotalPages();
    this.setCurrentPage(currentPage);
     
    this.setShowPageNum();
    this.setPageFirRecord();
    this.setPrePage();
    this.setNexePage();
    }
    /**
     * 重载
     * @param currentPage
     * @param totalRecord
     * @param showRecordNum
     */
    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
    }
     
     
    public Integer getNexePage() {
    return nexePage;
    }
    public void setNexePage() {
     
    if(currentPage==totalPages){  //如果当前页码为总页码,即最后一页
    this.nexePage = 0;//返回0
    }else{
    this.nexePage = currentPage+1;//当前页加1
    }
    if(totalPages==0){//如果总页数为0,怎么返回0;
    this.nexePage = 0;
    }
    }
     
     
    public Integer getShowPageNum() {//返回当前页显示的记录数量
    return showPageNum;
    }
    public void setShowPageNum() {//当前页显示的记录数量
    if(currentPage*showRecordNum-totalRecord>0){//当前页数*每页显示的条数—总的记录条数>0 表示现在已经是最后一页了
    this.showPageNum = totalRecord-(currentPage-1)*showRecordNum;
    }else{
    this.showPageNum=showRecordNum;
    }
     
    }
     
     
    public Integer getShowRecordNum() {//返回每页的记录条数
    return showRecordNum;
    }
    public void setShowRecordNum(Integer showRecordNum) {
    this.showRecordNum = showRecordNum;
    }
     
     
    public Integer getTotalPages() {//返回总的页数
    return totalPages;
    }
    public void setTotalPages() {//计算总页数
    if(totalRecord%showRecordNum==0){
    this.totalPages = totalRecord/showRecordNum;
    }else{
    this.totalPages = totalRecord/showRecordNum+1;
    }
     
    }
     
     
    public Integer getTotalRecord() {//返回总的记录条数
    return totalRecord;
    }
    public void setTotalRecord(Integer totalRecord) {
    this.totalRecord = totalRecord;
    }
     
     
    public Integer getCurrentPage() {//返回当前的页数
    return currentPage;
    }
    public void setCurrentPage(Integer currentPage) {
     
    if(currentPage==0||currentPage<0){
    currentPage=1;
    }
    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;
    }
     
     
    }
    View Code

    然后讲Service层:
        只要继承一个父类CURDS;CURDS类里面的方法和封装好的DAO层hibernate带分页的分装方法一致
    随便一个service层接口
    一般的方法自然都在CURDS有了。以下是写一个特殊的方法
       List<AuthApply> getApplie():
    所以一般来说,CURDS里面的方法够用了。
    public interface AuthApplyS extends CURDS<AuthApply>{
           
    /**
     * 根据认证的类型与状态获取相应的认证申请
     * */
    public List<AuthApply> getApplie(String type, String status, Integer memberId);
    }

    CURDS:    里面的方法是Service共用的方法

    /**
     * 根据条件集合大小,这里使用java 1.5引入的新特性:可变参数
     * */
    public int getNums(Object ...args);
    /**
     * 根据条件集合
     * */
    public List<T> getList(PageUtil pageUtil, Object ...args);
    /**
     * 保存对象
     * */
    public T makePersitent(T entity); 
    /**
     * 根本编号获得对象
     * */
        public T findById(Integer id);
     
    public interface CURDS<T> {
    /**
     * 根据条件集合大小,这里使用java 1.5引入的新特性:可变参数
     * */
    public int getNums(Object ...args);
    /**
     * 根据条件集合
     * */
    public List<T> getList(PageUtil pageUtil, Object ...args);
    /**
     * 保存对象
     * */
    public T makePersitent(T entity); 
    /**
     * 根本编号获得对象
     * */
    public T findById(Integer id);
    }
     
    View Code
     service层实现:
        共用的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);
    }
     
    }
    View Code

    下面看一下 DAO层的封装吧。

     经典的终于来了。前面注意分页的那些类:
    首先 因为有一些是特殊的方法,所以我们也要定义
    AuthApplyD接口:很简单吧。
        AuthApply 是bean类  
        GenericDAO 这继承的父类就是我们的封装。
    public interface AuthApplyD extends GenericDAO<AuthApply>{
     
    }
     
    AuthApplyD实现类
      super(AuthApply.class);这个方法很重要,调用的是GenericHibernateDAO的方法,而将Bean类传到DAO层。
    public class AuthApplyDI extends GenericHibernateDAO<AuthApply> implements
    AuthApplyD{
     
    public AuthApplyDI() {
    super(AuthApply.class);//这super,就是调用父类的构造方法
    }
     
    }
    View Code
    GenericDAO接口封装:
    这才是我想说的经典
      
    /**
     * 通过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);
     
     
    /**
     * 使用hql 语句进行分页查询操作
     * 
     * @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);
     
     
    /**
     * 使用hql 语句进行分页查询操作
     * 
     * @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);
    }
    View Code
     
    GenericHibernateDAO实现类:
    public class GenericHibernateDAO<T> extends HibernateDaoSupport 
    implements GenericDAO<T>{
     
    private Class<T> persistentClass;
     
    public GenericHibernateDAO(Class<T> persistentClass){
    this.persistentClass=persistentClass;
    }
     
    public Class<T> getPersistentClass(){
    return persistentClass;
    }
     
    public T findById(Integer id) {
    return (T)getHibernateTemplate().get(getPersistentClass(), id);
    }
     
    @SuppressWarnings("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);
    }
    }
     
    View Code

    希望首页能再次通过,我修改下。

    总结:带分页功能的SSH整合,DAO层经典封装
      考虑前台,一条线的传到后台,然后分工必须明确。
      DAO层的封装,可见java底层的魅力。
    共同开发,共同努力。
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/Alandre/p/3366557.html
Copyright © 2011-2022 走看看