JavaWeb不定条件查询

 

JavaWeb不定条件查询

标签: java web不定条件查询
  411人阅读  评论(0)  收藏  举报

[html]  view plain  copy
  1. <版权声明:本文为博主原创文章,未经博主允许不得转载  
[html]  view plain  copy
  1. <span style="font-size:18px;color:#000000;">在Web开发中会遇到不定条件查询,所谓不定条件就是在页面端有多个查询条件约束,而这些条件用户可以选择也可以不选择,这样就会造成SQL语句的变化,因此不能将SQL语句写死,另外这也给SQL语句的参数赋值造成了一定影响,前几天上课做一个简单小示例,我上网搜索了一下,发现网上的做法有很多,受CSDN上xulu_258的一篇博客(启发,我做了一下细化及一些改进页面端JSP如下</span>  

 
 
[html]  view plain  copy
  1.   
[html]  view plain  copy
  1. <%@ page pageEncoding="GBK" %>  
  2. <html>  
  3. <head>  
  4.   <title>MainPerson.jsp</title>  
  5.   <style type="text/css">@IMPORT url("/Neu_pro/css/style.css");</style>  
  6. </head>  
  7. <body>  
  8. <br>  
  9. <br>  
  10. <form action="/Neu_pro/queryperson.html" method="post">  
  11.  <!-- 数据查询条件区 -->   
  12.  <div class="query">  
  13.    <table>  
  14.      <caption>  
  15.               员工管理  
  16.        <hr>         
  17.      </caption>  
  18.      <tr class="title">  
  19.        <td colspan="100">查询条件</td>  
  20.      </tr>  
  21.      <tr>  
  22.        <td>姓名</td>  
  23.        <td>  
  24.          <input type="text" name="qpname">  
  25.        </td>  
  26.        <td>身份证</td>  
  27.        <td>  
  28.          <input type="text" name="qpnumber">  
  29.        </td>  
  30.      </tr>  
  31.      <tr>  
  32.        <td>学历</td>  
  33.        <td>  
  34.          <select name="qxl">  
  35.            <option value="">==不限==</option>  
  36.            <option value="1">高中以下</option>  
  37.            <option value="2">高中</option>  
  38.            <option value="3">专科</option>  
  39.            <option value="4">本科</option>  
  40.          </select>  
  41.        </td>  
  42.        <td>技术职称</td>  
  43.        <td>  
  44.          <select name="qjszc">  
  45.            <option value="">==不限==</option>  
  46.            <option value="01">初级职称</option>  
  47.            <option value="02">中级职称</option>  
  48.            <option value="03">副高级职称</option>  
  49.            <option value="04">高级职称</option>  
  50.          </select>  
  51.        </td>  
  52.      </tr>  
  53.      <tr>  
  54.        <td>工资[B]</td>  
  55.        <td>  
  56.          <input type="number" step="0.01" name="bsal">  
  57.        </td>  
  58.        <td>工资[E]</td>  
  59.        <td>  
  60.          <input type="number" step="0.01" name="esal">  
  61.        </td>  
  62.      </tr>  
  63.    </table>  
  64.  </div>  
  65.    
  66.  <!-- 数据迭代区(以表格形式显示查询结果) -->  
  67.  <div class="data">  
  68.   ${rows }  
  69.  </div>  
  70.    
  71.  <!-- 按钮区 -->  
  72.  <div class="button">  
  73.    <table>  
  74.      <tr>  
  75.        <td>  
  76.           <input type="submit" name="next" value="查询">  
  77.           <input type="submit" name="next" value="添加">  
  78.           <input type="submit" name="next" value="删除" disabled="disabled">  
  79.        </td>  
  80.      </tr>  
  81.    </table>  
  82.  </div>  
  83. </form>   
  84. </body>  
  85. </html>  

获取页面端数据的Servlet如下:
将页面端获取的数据放到数组中去,作为参数传给查询方法queryperson();
[java]  view plain  copy
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.   
  3.       
  4.     String pname=request.getParameter("qpname");  
  5.     String pnumber=request.getParameter("qpumber");  
  6.     String xl=request.getParameter("qxl");  
  7.     String jszc=request.getParameter("qjszc");  
  8.     String bsal=request.getParameter("bsal");  
  9.     String esal=request.getParameter("esal");  
  10.       
  11.     String val[]={pname,pnumber,xl,jszc,bsal,esal};  
  12.     PersonServices service=new PersonServices();  
  13.     try {  
  14.         List<Map<String,String>> rows=service.queryperson(val);  
  15.         request.setAttribute("rows", rows);  
  16.     } catch (Exception e) {  
  17.         // TODO Auto-generated catch block  
  18.         e.printStackTrace();  
  19.     }  
  20.       
  21.     }  
关键的数据库操作部分:
将页面端获取到的查询参数还原,然后用StringBuilder来new一个基本的查询语句,例如:"select * from person(表名) where 1=1", where 1=1是为了考虑到后面我们添加条件时直接用and,而不是在重复的使用if语句来判断用where还是and.   然后用if判断如果不为空则sql.append("and name=?"),依次类推。 同时,如果该条件不为空,则将改值放到List中,因为List的有序性,为我们以后的问号赋值提供了便利,赋值时我们只需要便利List即可,因为问号是和List中的参数值是一一对应的。

[java]  view plain  copy
  1. public List<Map<String,String>> queryperson(String...val)throws Exception  
  2.       
  3.     {  
  4.         Connection conn=null;  
  5.         PreparedStatement psmt=null;  
  6.         ResultSet rs=null;  
  7.         try{  
  8.               
  9.             String pname=val[0];  
  10.             String pnumber=val[1];  
  11.             String xl=val[2];  
  12.             String jszc=val[3];  
  13.             String bsal=val[4];  
  14.             String esal=val[5];  
  15.               
  16.             conn=DBUtils.getConnection();  
  17.               
  18.             List<Object> pars=new ArrayList<>();  
  19.             StringBuilder sql=new StringBuilder()  
  20.              .append("SELECT X.PID,X.PNAME,X.PNUMBER,X.PSEX,")  
  21.              .append("       TO_CHAR(X.PDATE,'YYYY-MM-DD') PDATE,")  
  22.              .append("       X.MZ,X.XL,X.PMAIL,X.PHONE")  
  23.              .append("  FROM PERSON X")  
  24.              .append(" WHERE 1=1")  
  25.             ;  
  26.             if(pname!=null&&pname.equals("")){  
  27.                 sql.append("AND pname like ?");  
  28.                 pars.add("%"+pname+"%");  
  29.                   
  30.             }  
  31.             if(pnumber!=null&&pnumber.equals("")){  
  32.                 sql.append("AND X.PNUMBER= ?");  
  33.                 pars.add(pnumber);  
  34.                   
  35.             }  
  36.             if(xl!=null&&xl.equals("")){  
  37.                 sql.append("AND X.XL= ?");  
  38.                 pars.add(xl);  
  39.                   
  40.             }  
  41.             if(jszc!=null&&jszc.equals("")){  
  42.                 sql.append("AND X.JSZC= ?");  
  43.                 pars.add(jszc);  
  44.                   
  45.             }  
  46.             if(bsal!=null&&bsal.equals("")){  
  47.                 sql.append("AND X.BSAL>= ?");  
  48.                 pars.add(bsal);  
  49.                   
  50.             }  
  51.             if(esal!=null&&esal.equals("")){  
  52.                 sql.append("AND X.ESAL<= ?");  
  53.                 pars.add(esal);  
  54.                   
  55.             }  
  56.                
  57.             sql.append(" ORDER BY X.PNAME");  
  58.             System.out.println(sql);  
  59.             System.out.println(pars);  
  60.             psmt=conn.prepareStatement(sql.toString());  
  61.             int index=1;  
  62.             for (Object  parm : pars) {  
  63.                 psmt.setObject(index++, parm);  
  64.             }  
  65.             rs=psmt.executeQuery();  
  66.             ResultSetMetaData rsmd=rs.getMetaData();  
  67.             int count=rsmd.getColumnCount();  
  68.             int init_size=((int)(count/0.75))+2;  
  69.               
  70.               
  71.             List<Map<String,String>> rows=new ArrayList<>();  
  72.               
  73.             Map<String,String> ins=null;  
  74.             while(rs.next()){  
  75.                 ins=new HashMap<>(init_size);  
  76.                 for(int i=1;i<=count;i++){  
  77.                     ins.put(rsmd.getColumnLabel(i).toLowerCase(),rs.getString(i));  
  78.                 }  
  79.                   
  80.                   
  81.                 rows.add(ins);  
  82.             }  
  83.             return rows;  
  84.               
  85.         }finally{  
  86.           
  87.               
  88.         }  
  89.         //return null;  
  90.     }  

查询结果的处理,查询出的结果我们利用ResultSetMetaData将结果集的每一行都封装到List<Map<String,String>>中,ResultSetMetaData是ResultSet的子类但是它保留结果集的完整结构,我们可以利用它获取每一列的名称,并且还能获得一共有多少列,方便我们计算Map的初始容量,但是由于map的无序性造成了封装的数据杂乱无章,在页面端无法有序显示,这一点我还没有解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值