📄 详细分析一.txt
字号:
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 + -