最新上架分页时-多表查询问题--笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flower_CSDN/article/details/81584661

– 图书分类表
desc t_booktype;
+——–+———+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——–+———+——+—–+———+——-+
| bookid | int(11) | NO | PRI | NULL | |
| typeid | int(11) | NO | PRI | NULL | |
+——–+———+——+—–+———+——-+
由于图书和分类之间是多对多的关系,所以图书和分类之间是通过中间表来存储的,所以在遍历出图书信息之后我还需要根据图书的Id到图书分类表中查询出对应的typeid,然后再根据typeid去到分类表然后查找出对应的typename.

<div id="newBooks">
            <c:if test="${newBookList.size()>0}">
                    <c:forEach items="${newBookList}" var="book">
                            <div id="mbook">
                                <img src="img/girl.jpg" width="85%" height="340px" onload="findBookTypeById(${book.id})"/> <font>
                                    <br />书名: &lt;&lt;${book.name}&gt;&gt; <br />作者:${book.auth}
                                    <br />分类:<label id="typeName"></label>
                                    <br />更新时间:<fmt:formatDate
                                type="date" value="${bookmap.key.onlinetime}" />
                                    <br />简介:${book.brief}
                                </font>
                            </div>
                    </c:forEach>
            </c:if>
        </div>
function findBookTypeById(id){
    $.ajax({
        type : "post",
        url : "selectNameById",
        data : {
            bookid: id
        },
        dataType : "text",
        success : function(data){
            $("#typeName").empty().html(data);
            alert(id);
            }
        });
}

在分页查询的时候,刚开始我是先查找出所有的图书然后展示到前台,然后在遍历的时候拿到图书的id然后想通过Ajax去找它的分类,但是就是想不出来它的触发条件,不能在页面加载完毕之后,因为不一定有bookList,这些book的div还没有出来呢,所以也获取不到bookid,就算获取到了也无法设置到相应的控件中,因为无法获取到相应的控件,因为控件还没有被加载出来。
然后又想着在后台直接遍历booklist然后查出对应的分类然后存在list里面,在前台遍历的时候进行嵌套,但是发现嵌套遍历出来的结果就是booklist.sze()乘typeList.size().但是又不能同时遍历两个List,所以我就放弃了在后台进行获取。
然后就一直想着要用Ajax进行获取,但就是找不到合适的触发条件,然后就改成了当每个图片加载完之后触发一次。但是Ajax是循环执行了,但是每次给分类的label设置html内容的时候,都是在重复设置第一个div的分类label,说明它虽然是循环调用的,但是在获取元素的时候始终获取的是第一个分类的label,我有想过在list遍历之前设置一个变量然后将变量的的值赋给图书分类label的id,这样再通过js获取的时候就能确保获取的是不同的label,但我感觉问题可能不在这里,说不定是图片加载的问题。而且感觉不喜欢在JSP里面弄Java程序片,刚学的时候用来着,现在就是有种莫名的反感。想来想去感觉在前台弄这些写东西还是好复杂啊!而且我觉得我其实不太喜欢太多的使用Ajax总感觉它会影响页面加载的速度,之前做首页的时候这种感觉就有点明显。
所以又想着还是在后台进行获取,不能用两个list那我可以用Map啊,使用HahMap,SpringMVC虽然是多线程,默认是单例模式的,所有的请求只会创建一个Controller,但是由于没有共享的属性所以是线程安全的。其实按我的理解是每次请求都是重新发起的,集合也是每次都重新进行创建的,所以就不存在共享和并发访问的的问题,所以用HashMap我觉得是没有问题的,还有我不喜欢用Hashtable因为它采用的是同步方法进行同步,我觉得效率比较低,其实也都是跟多线程有关吧,这里跟多线程也没关系,也不用考虑这些。要真是多线程用ConcurrentHashMap才好呢,锁分段,对这个ConcurrentHashMap好感大大的。
用HashMap将book作为键,分类作为值,(注意,反过来就不行了,因为分类可能会重复,书就被覆盖)然后在前台进行遍历。
现在想想自己还真是挺智障的,一个智障曲折蜿蜒的心路历程。

/**
     * 跳转到最新上架页面
     * @return
     */
    @RequestMapping(value="newBookMore",method=RequestMethod.GET)
    public String newBookMore(int currentPage,HttpServletRequest request) {
        Page<TBook> page=PageHelper.startPage(currentPage, 8);
        List<TBook> newBookList=bookServ.orderByOnlineTime();
        request.setAttribute("total", page.getTotal());//传递总页数
         //每本书作为键,值为对应的分类,Map集合具有去重性,如果将两者反过来,那么由于分类会重复,书就会被覆盖掉
         Map<TBook,String> bookMap=new HashMap<TBook,String>();
            for(TBook book:newBookList) {
                bookMap.put(book, typeServ.selectNameById(book.getId()));
            }
        request.setAttribute("bookMap", bookMap);
//      request.getServletContext().setAttribute("total", page.getTotal());
        return "book/newBookMore";
    }
<div id="newBooks">
            <c:if test="${bookMap.size()>0}">
                <c:forEach items="${bookMap}" var="bookmap">
                    <div id="mbook">
                        <img src="img/girl.jpg" width="85%" height="340px" /> <font>
                            <br />书名: &lt;&lt;${bookmap.key.name}&gt;&gt; <br />作者:${bookmap.key.auth}
                            <br />分类:${bookmap.value} <br />更新时间:<label id="updateTime">${bookmap.key.onlinetime}</label>
                            <br />简介:${bookmap.key.brief}
                        </font>
                    </div>
                </c:forEach>
            </c:if>
        </div>
    </div>

猜你喜欢

转载自blog.csdn.net/flower_CSDN/article/details/81584661
今日推荐