我们先弄买家方面的模块,这个收藏夹非常得简单。
一,添加收藏
//添加商品收藏,只需要把前台传过来的商品信息存到用户得收藏夹数据库中即可。
@RequsetMapping(value = "/xxx/xxx/add_goods_favorite")
public void add_goods_favorite(HttpServletRequest request, HttpServletResponse response,String goods_id){
//需要判断用户是否登陆,这里就要用到上一篇文章讲的登陆机制,这里还是用到了我自己写的工具类 用于取session得。
User user = (User) LoginContext.getSessionValueByLogin(request);
//判断用户登陆成功后,查找数据库中这个用户是否已经添加过此商品得收藏。(注意数据类型得转换)
Map map = new HashMap();
map.put("user_id",user.getId());
map.put("goods_id",Long.parseLong(goods_id));
List list = this.favoriteService.query("select obj from Favorite obj where obj.user.id=:user_id and obj.goods_id=:goods_id",map,-1,-1);
if(list.size() == 0){
//这里也可以简单得改成收藏店铺,就不一一举例了
Goods goods = this.goodsService.getObjById(Long.parseLong(goods_id));
Favorite obj = new Favorite();
obj.setAddTime(new Date());
obj.setType(0);//type为0是商品,为1是店铺
obj.setUser(this.userService.getObjById(user.getId()));
obj.setGoods(goods);
this.favoriteService.save(obj);
returnSuccessData(request,response,"收藏成功");
return;
}
}
二,查看收藏夹
@RequsetMapping(value = "/xxx/xxx/favorite_goods")
public void favorite_goods(HttpServletRequest request, HttpServletResponse response, String currentPage,String orderBy,String orderType){
//这里说明一下参数,currentPage是用来看第几页的,orderBy是排序依据,orderType排序类型(正序或者倒序)
//判断用户是否登陆
...
FavoriteQueryObject qo = new FavoriteQueryObject(currentPage,orderBy,orderType);
qo.addQuery("obj.type",new SysMap("type",Integer.valueOf(0)),"=");
qo.addQuery("obj.user.id",new SysMap("type",Integer.valueOf(0)),"=");
IPageList plist = this.favoriteService.list(qo);
returnData(response,getArray(plist));
return;
}
下面我们简单讲解一下我怎么设计的Hibernate分页(如果写的不清楚,可以自己写一个分页查询):
我们知道sql 或者 hql语句在查询的时候是可以分页的。
完整的hql语句是这样的:select /update/delete ...... from ..... where......group by......having....order by....asc/desc
这样我们创建一个QueryObject做为父类
public class QueryObject{
protected Interger currentPage = Integer.valueOf(0);
protected String orderBy;
protected String orderType;
protected Map params = new HashMap();
protected String queryString = "1=1";
set/get方法...
public QueryObject(String currentPage,Map<String,Object>map,String orderBy,String ordeType){
//这里设置完页码,然后去判断排序依据,排序类型是否没有值,如果为null就写一个默认的排序方式。
setCurrentPage(Integer.valueOf(Integer.parseInt(str)));
if(orderBy == null || orderBy.equals("")){
setOrderBy("addTime");
map.put("orderBy","addTime");
}else{
setOrderBy(orderBy);
map.put("orderBy",orderBy);
}
if(orderType == null || orderType.equals("")){
setOrderType("desc');
map.put("orderType","desc");
}else{
setOrderType(orderType);
map.put("orderType",orderType);
}
}
//还有一个很重要的addQuery方法,这个主要是封装了hql语句
public IQueryObject addQuery(String field, SysMap para, String expression){
if(field != null && para != null){
this.queryString = (this.queryString + "and" + field + " " + handleExpression(expression) + ":" + para.getKey().toString());
this.params.put(para.getKey(),para.getValue());
}
return this;
}
}
因为有很多的类,很多的表,所以我需要区分查询的是那张表,我们可以做一个GenericPageList类去区分你要查找的表\
public class GenericPageList extends PageList{
protected String scope;
protected Class cls;
public GenericPageList(Class cls, String scope,Map paras,IGenericDAO dao){
this.cls = cls;
this.scope = scope;
IQuery query = new GenericQuery(dao);
query.setParaValues(paras);
setQuery(query);
}
public void doList(int currentPage, int pageSize){
String totalSql = "select COUNT(obj) from" + this.cls.getName() + "obj where " + this.scope;
super.doList(pageSize, currentPage ,totalSql, this.scope);
}
}
public class PageList{
public void doList(int pageSize, int pageNo, String totalSQL, String queryHQL){
List rs = null;
this.pages = ((this.rowCount + pageSize - 1) / pageSize);
int intPageNo = pageNo > this.pages ? this.pages : pageNo;
this.query.setFirstResult((intPageNo - 1) * pageSize);
this.query.setMaxResults(pageSize);
rs = this.query.getResult(queryHQL);
this.result = rs;
}
}
这里不能写的太明确了,因为项目不能公开的,很抱歉。就是分页这块需要大家去理解怎么去分页,为什么要分页。这里就请各位自己写分页吧233 因为我的主要目的还是让大家明白项目流程,具体代码自己写出来的比复制粘贴的要好很多,这样才能学到自己的东西。