⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 详细分析一.txt

📁 开源论坛实现
💻 TXT
📖 第 1 页 / 共 5 页
字号:
						c.addOrder(Order.desc("postNum"));
					}
				}

				return c.list();
			}
		});
	}
其中用到了条件查询(Criteria Query),参考http://blog.sina.com.cn/u/4a5e7dc401000878  和http://hi.baidu.com/yaolihui/blog/item/7c77b58286a56792f703a663.html,而public List findBoardIdsByParentID(final long pid, final int useStat, final int hidden, final int orderType)采用了构造HQL语句的方式来完成查询!根据parentID预取得Board序列:
	public int getNextOrder(long pid) {
		List l = getHibernateTemplate().find(LOAD_NEXT_ORDER, new Long(pid));
		if (l != null && !l.isEmpty()) {
			if (l.get(0) == null) {
				return 5;
			} else {
				return ((Integer) l.get(0)).intValue() + 5;
			}
		} else {
			return 5;
		}
	}
public int getPostSumNum(final int mainorall, final int useStat, final int hidden) {
		int sum = 0;

		List list = getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session s) throws HibernateException {
				Criteria c = s.createCriteria(Board.class);
				if (mainorall == 0) {
					c.setProjection(Projections.projectionList().add(Projections.sum("mainPostNum")));  //求mainPostNum的和为结果
				}
				if (mainorall == 1) {
					c.setProjection(Projections.projectionList().add(Projections.sum("postNum")));//求postNum的和为结果
				}
				if (useStat != -1) {
					c.add(Restrictions.eq("useStat", new Integer(useStat)));
				}
				if (hidden != -1) {
					c.add(Restrictions.eq("isHidden", new Integer(hidden)));
				}
				return c.list();
			}
		});
		if (!list.isEmpty()) {
			Object obj = (Object) list.get(0);//注:结果集只有一个字段
			if (obj != null) {
				sum = ((Integer) obj).intValue();
			}
		}
		return sum;
	}

	public List findBoardsInIDs(final List ids, final int useStat, final int hidden) {
		return getHibernateTemplate().executeFind(new HibernateCallback() {
			@SuppressWarnings("unchecked")
			public Object doInHibernate(Session s) throws HibernateException {
				Criteria c = s.createCriteria(Board.class);
				if (ids == null) {  //ids为空
					List idss = new ArrayList();
					idss.add(new Long(0));
					c.add(Restrictions.in("id", idss));
				} else if (ids.isEmpty()) {//ids为empty
					ids.add(new Long(0));
					c.add(Restrictions.in("id", ids));
				} else {
					c.add(Restrictions.in("id", ids));//Restrictions.in
				}
				if (useStat != -1) {
					c.add(Restrictions.eq("useStat", new Integer(useStat)));
				}
				if (hidden != -1) {
					c.add(Restrictions.eq("isHidden", new Integer(hidden)));
				}
				c.addOrder(Order.asc("orders"));
				return c.list();
			}
		});
	}

	public List findBoardsNeedCount(final int useStat, final int hidden) {
		return getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session s) throws HibernateException {
				Criteria c = s.createCriteria(Board.class);

				c.add(Restrictions.or(Restrictions.eq("boardType", new Integer(3)), Restrictions.eq("boardType",
						new Integer(4))));//Restrictions.or 3,4的都需要count

				if (useStat != -1) {
					c.add(Restrictions.eq("useStat", new Integer(useStat)));
				}
				if (hidden != -1) {
					c.add(Restrictions.eq("isHidden", new Integer(hidden)));
				}
				c.addOrder(Order.desc("mainPostNum"));
				c.addOrder(Order.desc("postNum"));
				return c.list();
			}
		});
	}

public List findBoardsByParentID(final long pid, final int useStat, final int hidden) {
		return getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session s) throws HibernateException {
				Criteria c = s.createCriteria(Board.class);
				c.add(Restrictions.eq("parentID", new Long(pid)));//条件!
				if (useStat != -1) {
					c.add(Restrictions.eq("useStat", new Integer(useStat)));//附加条件!
				}
				if (hidden != -1) {
					c.add(Restrictions.eq("isHidden", new Integer(hidden)));
				}
				return c.list();
			}
		});
	}

	public List findBoardsIdByParentIDInUse(long pid) {
		return this.getHibernateTemplate().find(LOAD_IDS_IN_USE, new Long(pid));
	}
OK!分析完毕!当然,对于具体的方法是怎么被用上的,要看web层了.
接下来,看下BookMarkFactory接口,是个工厂接口.它只有一个一个公有方法, public BookMark getInstance(String userId);其实现为BookMarkFactoryImp,它产生一个BookMark bean,不过是同步的! public synchronized BookMark getInstance(String userId) {
    return new BookMark();//返回的是com.laoer.bbscs.bean.BookMark
  }
另有一个实现:BookMarksFactoryImp:(有个私有属性:int modNum及其get/set方法)
public synchronized BookMark getInstance(String userId) {
    try {
      return (BookMark) Class.forName(BBSCSUtil.getClassName("BookMark", userId, this.getModNum())).
          newInstance();
    }
    catch (ClassNotFoundException ex) {
      logger.error(ex);
      return null;
    }
    catch (IllegalAccessException ex) {
      logger.error(ex);
      return null;
    }
    catch (InstantiationException ex) {
      logger.error(ex);
      return null;
    }

  }
这里用到了com.laoer.bbscs.common包中的工具类:BBSCSUtil.java
	public static String getClassName(String className, String userID) {
		int num = Math.abs(userID.hashCode());
		className = Constant.BEANPERFIX + className + (num % 10);//public static String BEANPERFIX = "com.laoer.bbscs.bean.";
		return className;
	}

	public static String getClassName(String className, String userID, int modnum) {
		int num = Math.abs(userID.hashCode());
		className = Constant.BEANPERFIX + className + (num % modnum);
		return className; //应该返回是就是com.laoer.bbscs.bean.BookMark0~~~9之间的class了
	}

	public static String getClassName(String className, long bid, int modnum) {
		className = Constant.BEANPERFIX + className + (bid % modnum);
		return className;
	}

而BookMarkService则完全负责这个业务!先看BEAN:
private String id;
	private String userID;
	private String bookMarkName;
	private String url;
	private String alt;
	private int isShare;
	private Date createTime;
<hibernate-mapping package="com.laoer.bbscs.bean">
  <class name="BookMark" table="bbscs_bookmark">
    <id name="id" column="ID" type="string" unsaved-value="null">
      <generator class="uuid"/>
    </id>
    <property column="UserID" length="40" name="userID" not-null="true" type="string"/>
    <property column="BookMarkName" length="255" name="bookMarkName" not-null="true" type="string"/>
    <property column="Url" length="255" name="url" type="string"/>
    <property column="Alt" length="255" name="alt" type="string"/>
    <property column="IsShare" length="1" name="isShare" type="int"/>
    <property column="CreateTime" name="createTime" not-null="true" type="timestamp"/>//timestamp类型!
  </class>
</hibernate-mapping>
看service接口中的方法:
public BookMark findBookMarkByIDUserID(String id, String userID);
public BookMark saveBookMark(BookMark bm) throws BbscsException;
  public long getBookMarkNumByUserID(String userID);
 public PageList findBookMarks(String userID, Pages pages);
public PageList findBookMarksByUserIDShare(String userID, int isShare, Pages pages);
public void removeBookMark(BookMark bm) throws BbscsException;
 public void removeBookMarkByIDUserID(String id, String userID) throws BbscsException;
我们看实现层:先注入BookMarkDAO对象.特别的是:
public PageList findBookMarks(String userID, Pages pages) {
    PageList pl = new PageList();
    if (pages.getTotalNum() == -1) {
      pages.setTotalNum(this.getBookMarkDAO().getBookMarkNumByUserID(userID));
    }
    pages.executeCount();

    List l = this.getBookMarkDAO().findBookMarks(userID, pages.getSpage(), pages.getPerPageNum()); //DAO层方法,Service层没有
    pl.setObjectList(l);
    pl.setPages(pages);
    return pl;
  }
  public PageList findBookMarksByUserIDShare(String userID, int isShare, Pages pages) {
    PageList pl = new PageList();
    if (pages.getTotalNum() == -1) {
      pages.setTotalNum(this.getBookMarkDAO().getBookMarkNumByUserIDShare(userID, isShare));
    }
    pages.executeCount();

    List l = this.getBookMarkDAO().findBookMarksByUserIDShare(userID, isShare, pages.getSpage(),
        pages.getPerPageNum());//DAO层方法,Service层没有
    pl.setObjectList(l);
    pl.setPages(pages);
    return pl;
  }
这里用到了2个分页功能的类:它们都在com.laoer.bbscs.service.web包中,一个Page一个PageList;
两个都是javaBEAN,不过可以带少量的业务逻辑处理功能.先看Pages:
int page=1;//页号
long totalNum=-1;//记录总数
int perPageNum=1;//每页显示记录数
int allPage=1;//总页数
int cpage=1;//当前页
int spage=1;//开始记录数
String fileName="";
boolean useUrlRewirte=false;
public Pages(int page, long totalNum, int perPageNum) {
		this.page = page;
		this.totalNum = totalNum;
		this.perPageNum = perPageNum;
		this.executeCount();
	}

public void executeCount() {
		this.allPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1) / this.perPageNum);
		int intPage = this.page;
		if (intPage > this.allPage) { // pages == 0
			this.cpage = 1;
		} else {
			this.cpage = intPage;
		}
		this.spage = (this.cpage - 1) * this.perPageNum;
	}
而PageList包括一个pages和List类型的objectList 及其set/get方法

  public PageList() {
  }
我们回到findBookMarks,先得到totalNum,再执行executeCount(),设置其值后,用this.getBookMarkDAO().findBookMark(userID,pages.getspage,pages.getPerPageNum())得到后赋给PageList的objectList和page对象.这样,就可以给web层用List去遍历了,当然也要配合page.
我们直接进入DAO接口层:(其实它完全为service层服务,整体上差不多不过有些方法却不一样)
public BookMark saveBookMark(BookMark bm);
public BookMark findBookMarkByIDUserID(String id,String userID);
public long getBookMarkNumByUserID(String userID);
public List findBookMark(final String userID,final int firstResult,final int maxResults);
public long getBookMarkNumByUserIDShare(String userID, int isShare);
public List findBookMarksByUserIDShare(final String userID, final int isShare, final int firstResult,final int maxResults);//final int类型,方法体里不可改变
public void removeBookMark(BookMark bm);
public void removeBookMarkByIDUserID(String id, String userID);
看它的实现BookMarkHibernateDAO.java:(private static final String类型)
private static final String LOAD_BY_ID_USERID = "from BookMark where id = ? and userID = ?";
  private static final String GET_NUM_BY_USERID = "select count(*) from BookMark where userID = ?";
  private static final String LOADS_BY_USERID =
      "from BookMark where userID = ? order by createTime desc";
  private static final String REMOVE_BY_ID_USERID =
      "delete from BookMark where id = ? and userID = ?";
  private static final String GET_NUM_BY_USERID_ISSHARE =
      "select count(*) from BookMark where userID = ? and isShare = ?";
  private static final String LOADS_BY_USERID_ISSHARE =
      "from BookMark where userID = ? and isShare = ? order by createTime desc";
我们看其中的一些方法(根据UserID取得BookMark数量)
public long getBookMarkNumByUserID(String userID) {
    List l = this.getHibernateTemplate().find(GET_NUM_BY_USERID, userID);
    if (l == null || l.isEmpty()) {
      return 0;
    }
    else {
      return ( (Long) l.get(0)).longValue();
    }
  }
另外一个方法:(根据UserID和isShare取得BookMark列表)
  public List findBookMarksByUserIDShare(final String userID, final int isShare,
               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -