按條件模糊查詢及分頁查詢

1、查詢助手
 1 package cn.buaa.core.util;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 
 7 public class QueryHelper {
 8     
 9     //from子句
10     private String fromClause = "";
11     //where子句
12     private String whereClause = "";
13     //orderBy子句
14     private String orderByClause = "";
15     
16     private List<Object> parameters;
17     
18     //排序常量
19     public static String ORDER_BY_DESC = "DESC"; //降序
20     public static String ORDER_BY_ASC = "ASC"; //升序
21     /**
22      * 構造from子句(有別名)
23      * @param clazz 實體類
24      * @param alias 實體類對應的別名
25      */
26     public QueryHelper(Class clazz,String alias){
27         fromClause = "From " + clazz.getSimpleName() + " " +alias ;
28         System.out.println(fromClause);
29     }
30     /**
31      * 構造from子句(無別名)
32      * @param clazz 實體類
33      */
34     public QueryHelper(Class clazz){
35         fromClause = "From " + clazz.getSimpleName() ;
36     }
37     
38     /**
39      * 構造where子句
40      * @param condition 查詢條件語句:例如:i.title like ?
41      * @param params 查詢條件語句中?對應的查詢條件的值: 例如:%標題%
42      */
43     public void  addCondition(String condition , Object... params ){
44         if(whereClause.length()>1){//非第一個查詢條件
45             whereClause += " AND " + condition;
46         }else{//第一個查詢條件
47             whereClause += " WHERE " + condition;
48         }
49         
50         //設置查詢條件值到查詢條件集合中
51         if(parameters == null){
52             parameters = new ArrayList<Object>();
53         }
54         if(params != null){
55             for(Object param : params){
56                 parameters.add(param);
57             }
58         }
59         
60     }
61     
62     /**
63      * 構造order by子句
64      * @param property 排序屬性:如:i.createTime
65      * @param order 排序順序,如:DESC 或 ASC
66      */
67     public void addOrderByProperty(String property,String order){
68         if(orderByClause.length()>1){//非第一個排序屬性
69             orderByClause += " ," + property + " " + order;
70         }else{//第一個排序屬性
71             orderByClause += " ORDER BY " + property + " " + order;
72         }
73     }
74     //查詢hql語句
75     public String getQueryListHql(){
76         
77         return  fromClause + whereClause + orderByClause ;
78     }
79     
80     //查詢統計數的hql語句
81     public String getQueryCountHql(){
82         
83         return "SELECT COUNT( * )  " +  fromClause + whereClause;
84     }
85     
86     //查詢hql語句中?對應的查詢條件值集合
87     public List<Object> getParameters(){
88         
89         return parameters;
90     }
91 }

2、dao邏輯處理代碼

@Override
    public PageResult getPageResult(QueryHelper queryHelper, int pageNo, int pageSize) {
        Query query = getSession().createQuery(queryHelper.getQueryListHql());
        List<Object> parameters = queryHelper.getParameters();
        if(parameters != null){
            for(int i= 0;i<parameters.size();i++){
                query.setParameter(i, parameters.get(i));
            }
        }
        if(pageNo<1) pageNo =1;
        query.setFirstResult((pageNo-1)*pageSize);
        query.setMaxResults(pageSize);
        List items =  query.list();
        
        //獲取總記錄數
        Query queryCount = getSession().createQuery(queryHelper.getQueryCountHql());
        if(parameters != null){
            for(int i= 0;i<parameters.size();i++){
                queryCount.setParameter(i, parameters.get(i));
            }
        }
        long totalCount = (long) queryCount.uniqueResult();
        return new PageResult(totalCount, pageNo, pageSize, items);
    }
    

3、action調用處理代碼

 1         protected PageResult pageResult;
 2     private int pageNo;
 3     private int pageSize;
 4         。。。。
 5 
 6 // 列表頁面
 7     public String listUI() throws Exception {
 8         // 加載分類集合
 9         ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
10         QueryHelper queryHelper = new QueryHelper(Info.class,"i");
11         try {
12             if(info != null){
13                 if(StringUtils.isNotBlank(info.getTitle())){
14                     //搜索框亂碼問題解決
15                     info.setTitle(URLDecoder.decode(info.getTitle(),"utf-8"));
16                     queryHelper.addCondition("i.title like ? ", "%" + info.getTitle() + "%");
17                 }
18                 queryHelper.addCondition("i.state = ?", "1");
19             }
20             //根據創建時間降序排序
21             queryHelper.addOrderByProperty(" i.createTime ", QueryHelper.ORDER_BY_DESC);
22             //infoList = infoService.findObjects(queryHelper);
23             pageResult = infoService.getPageResult(queryHelper,getPageNo(),getPageSize());
24         } catch (Exception e) {
25             throw new ActionException("action出現異常:" + e.getMessage());
26         }
27         return "listUI";
28     }    

4、struts配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="info-action" namespace="/nsfw" extends="base-default">
        <action name="info_*" class="cn.buaa.nsfw.info.action.InfoAction"
            method="{1}">
            <result name="{1}">/WEB-INF/jsp/nsfw/info/{1}.jsp</result>
            <result name="list" type="redirectAction">
                <param name="actionName">info_listUI</param>
                <!-- 搜索框搜索值回顯 -->
                <param name="info.title">${strTitle}</param>
                <param name="pageNo">${pageNo}</param>
                <!-- 解決搜索框框亂碼 -->
                <param name="encode">true</param>
            </result>
        </action>
    </package>
</struts>

5、jsp顯示頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>信息發佈管理</title>
    <script type="text/javascript">
  //全選、全反選
    function doSelectAll() {
        // jquery 1.6 前
        //$("input[name=selectedRow]").attr("checked", $("#selAll").is(":checked"));
        //prop jquery 1.6+建議使用
        $("input[name=selectedRow]").prop("checked",
                $("#selAll").is(":checked"));
    }
    
    //添加
      function doAdd(){
          document.forms[0].action="${basePath}nsfw/info_addUI.action";
          document.forms[0].submit();
      }
      //編輯
      function doEdit(id){
          document.forms[0].action="${basePath}nsfw/info_editUI.action?info.infoId=" + id;
          document.forms[0].submit();
      }
    //刪除
      function doDelete(id){
          document.forms[0].action="${basePath}nsfw/info_delete.action?info.infoId=" + id;
          document.forms[0].submit();
      }
  //多選刪除
      function doDeleteAll(){
          document.forms[0].action="${basePath}nsfw/info_deleteSelected.action";
          document.forms[0].submit();
      }
  //異步發佈信息,信息的id及將要改成的信息狀態
  function doPublic(infoId,state){
      //1、更新信息狀態
      $.ajax({
          url:"${basePath}nsfw/info_publicInfo.action",
            data:{"info.infoId":infoId,"info.state":state},
            type:"post",
            success:function(msg){
                //2、更新狀態欄,操作欄的顯示值
                if("更新狀態成功" == msg){
                    if(state == 1){//說明信息狀態已被改成發佈,狀態欄顯示發佈,操作欄顯示停用
                        $("#show_"+infoId).html("發佈");
                        $("#oper_"+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',0)">停用</a>');
                    }else{
                        $("#show_"+infoId).html("停用");
                        $("#oper_"+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',1)">發佈</a>');
                    }
                }else{
                  alert("更新信息狀態失敗!");
                }
            },
            error:function(){
                alert("更新信息狀態失敗!");
            }
      });
  }
  
  var list_url = "${basePath}nsfw/info_listUI.action";
  function doSearch(){
          //重置頁號
          $("#pageNo").val(1);
          document.forms[0].action= list_url ;
        document.forms[0].submit();
  }
    </script>
</head>
<body class="rightBody">
<form name="form1" action="" method="post">
    <div class="p_d_1">
        <div class="p_d_1_1">
            <div class="content_info">
                <div class="c_crumbs"><div><b></b><strong>信息發佈管理</strong></div> </div>
                <div class="search_art">
                    <li>
                        信息標題:<s:textfield name="info.title" cssClass="s_text" id="infoTitle"  cssStyle="width:160px;"/>
                    </li>
                    <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li>
                    <li style="float:right;">
                        <input type="button" value="新增" class="s_button" onclick="doAdd()"/>&nbsp;
                        <input type="button" value="刪除" class="s_button" onclick="doDeleteAll()"/>&nbsp;
                    </li>
                </div>

                <div class="t_list" style="margin:0px; border:0px none;">
                    <table width="100%" border="0">
                        <tr class="t_tit">
                            <td width="30" align="center"><input type="checkbox" id="selAll" onclick="doSelectAll()" /></td>
                            <td align="center">信息標題</td>
                            <td width="120" align="center">信息分類</td>
                            <td width="120" align="center">創建人</td>
                            <td width="140" align="center">創建時間</td>
                            <td width="80" align="center">狀態</td>
                            <td width="120" align="center">操作</td>
                        </tr>
                        <s:iterator value="pageResult.items" status="st">
                            <tr <s:if test="#st.odd"> bgcolor="f8f8f8" </s:if> >
                                <td align="center"><input type="checkbox" name="selectedRow" value="<s:property value='infoId'/>"/></td>
                                <td align="center"><s:property value="title"/></td>
                                <td align="center">
                                    <s:property value="#infoTypeMap[type]"/>    
                                </td>
                                <td align="center"><s:property value="creator"/></td>
                                <td align="center"><s:date name="createTime" format="yyyy-MM-dd HH:mm"/></td>
                                <td id="show_<s:property value='infoId'/>" align="center"><s:property value="state==1?'發佈':'停用'"/></td>
                                <td align="center">
                                    <span id="oper_<s:property value='infoId'/>">
                                    <s:if test="state==1">
                                        <a href="javascript:doPublic('<s:property value='infoId'/>',0)">停用</a>
                                    </s:if>
                                    <s:else>
                                        <a href="javascript:doPublic('<s:property value='infoId'/>',1)">發佈</a>
                                    </s:else>
                                        
                                    
                                    </span>
                                    <a href="javascript:doEdit('<s:property value='infoId'/>')">編輯</a>
                                    <a href="javascript:doDelete('<s:property value='infoId'/>')">刪除</a>
                                </td>
                            </tr>
                        </s:iterator>
                    </table>
                </div>
            </div>
        <jsp:include page="/common/pageNavigator.jsp"/>
    </div>
</form>

</body>
</html>

6、分頁代碼jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"  uri="/struts-tags"%>
<div class="c_pate" style="margin-top: 5px;">
        <s:if test="pageResult.totalCount > 0">
        <table width="100%" class="pageDown" border="0" cellspacing="0"
            cellpadding="0">
            <tr>
                <td align="right">
                     總共<s:property value="pageResult.totalCount"/>條記錄,當前第<s:property value="pageResult.pageNo"/>頁,
                     共 <s:property value="pageResult.totalPageCount"/><s:if test="pageResult.pageNo > 1">
                                 &nbsp;&nbsp;  <a href="javascript:doGoPage(<s:property value="pageResult.pageNo-1"/>)">上一頁</a>
                    </s:if>                 
                    <s:if test="pageResult.pageNo < pageResult.totalPageCount">
                                 &nbsp;&nbsp;<a href="javascript:doGoPage(<s:property value="pageResult.pageNo+1"/>)">下一頁</a>
                       </s:if>&nbsp;<input id="pageNo" name="pageNo" type="text" style="width: 30px;" onkeypress="if(event.keyCode == 13){doGoPage(this.value);}" min="1"
                    max="" value="<s:property value="pageResult.pageNo"/>" /> &nbsp;&nbsp;
                </td>
            </tr>
        </table>    
        </s:if><s:else>
            暫無數據!
        </s:else>
        </div>
        <script type="text/javascript">
            //翻頁
            function doGoPage(pageNo){
                document.getElementById("pageNo").value = pageNo;
                document.forms[0].action =list_url;
                document.forms[0].submit();
            }
        </script>
        </div>

7、特別注意搜索框的回顯問題以及會先後亂碼的處理,還有struts配置文件的傳值問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章