CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2EE / EJB / JMS

请帮我看一下,我的模糊查询问题出在哪里

楼主supersky1()2006-06-01 12:37:34 在 Java / J2EE / EJB / JMS 提问

大家好:  
          下面是我在做一个站内查询遇到的问题,请各位指点一下。  
   
  1.问题页面中用到的字段:topic(标题)     varchar,  
                                                  content(内容)     text;  
   
  2.在a.jsp页面中有如下语句:  
          <form   action="search.jsp"   method=post   >  
              本站搜索:   <input   name=content   size=16   style="font-size:   12px">  
                                  <input   name=Submit   type=submit   value=GO>  
   
  3.在search.jsp页面中的相关语句:  
        <%     String   search   =   new   String(request.getParameter("content"));  
                Newsdo   newsdo   =   new   Newsdo();                
                Collection   c   =   newsdo.searchNews(search);  
                Iterator     iterator   =   c.iterator();              
                if   (c.size()   ==   0)   {  
        %>  
  <tr><td   width='50%'>没有你所要的记录</td></tr>  
        <%  
                }//  
              while   (iterator.hasNext())   {  
  News   news   =   (News)   iterator.next();  
        %>  
        <tr>  
            <td><%=news.getTopic()%></td>  
        </tr>  
          ....  
   
  4.在search.jsp页面中用到的JavaBean——Newsdo中searchNews()方法的相关语句:  
          public   Collection   searchNews(String   search){  
              ...  
          try{  
                  ...  
              dbc.prepareStatement("select   *   from   news   where   topic   like   ?   or   content   like   ?    
                                                        order   by   id   desc");  
              dbc.setString(1,   new   String(("%"+search+"%").getBytes("ISO8859_1"),"GBK"));  
   
              dbc.setString(2,   new   String(("%"+search+"%").getBytes("ISO8859_1"),"GBK"));  
   
              rs   =   dbc.executeQuery();  
   
              while   (rs.next())   {  
                  news.setId(rs.getInt("id"));  
                  ....  
                  }  
              catch   (Exception   e)   {  
  System.err.println("newsdo.search.rs:"+e);  
                  }  
                ....  
   
  5.运行:  
  即使输入的关键字确实存在于数据库中的某个标题或内容中,然而在显示页面中显示的始终是  
            ”没有你要的记录“;  
  然后控制台显示的是:   newsdo.search.rs:java.lang.NullPointerException  
   
          不知道我是否已讲清楚我所遇到的问题,我已经找了很多资料,也不能解决,请各位帮忙指导一下。  
         
  问题点数:20、回复次数:19Top

1 楼Lucy222(小露)回复于 2006-06-01 12:42:46 得分 0

据我所知like   ?   or   content   like   ?应该改为  
  like   '%?%'   or   content   like   '%?'Top

2 楼Lucy222(小露)回复于 2006-06-01 12:43:28 得分 2

错了  
  like   '%?%'   or   content   like   '%?%'Top

3 楼waiting007(威霆)回复于 2006-06-01 15:41:09 得分 0

Lucy222(小露)是女孩吧。哈哈。  
  只知其一不知其二。Top

4 楼Lucy222(小露)回复于 2006-06-01 15:57:30 得分 0

只知其一?那其二是什么,既然还有其二你知道干嘛不说?Top

5 楼forevertraveller(ftraveller)回复于 2006-06-01 16:48:27 得分 0

java.lang.NullPointerException异常,和查询本身没关系Top

6 楼harston(顽石)(风停了,雨停了,一路泥泞~)回复于 2006-06-01 18:05:50 得分 0

Lucy222(小露)   (   )   信誉:88     2006-6-1   15:57:31     得分:   0      
     
     
         
  只知其一?那其二是什么,既然还有其二你知道干嘛不说?  
   
       
     
   
  select   *   from   news   where   topic   like   ?   or   content   like   ?   order   by   id   desc  
   
  可能说你不知其2的意思是(我也不知道你晓得不?)他用的?是用来设置PrepareStatement   的参数的,楼主是想通过  
              dbc.setString(1,   new   String(("%"+search+"%").getBytes("ISO8859_1"),"GBK"));  
   
              dbc.setString(2,   new   String(("%"+search+"%").getBytes("ISO8859_1"),"GBK"));  
  把%设置进去  
   
  不知道转码的   时候%会不会被转码,如果被转了,楼主的意图就没有达到,%只能用英文的那种Top

7 楼supersky1()回复于 2006-06-02 00:28:43 得分 0

按照小露说的,也不对  
  出现另一个错误  
  ewsdo.search.rs:java.sql.SQLException:   [Microsoft][SQLServer   2000   Driver   for   JDBC]Invalid   parameter   binding(s).Top

8 楼liaoxiaoqi(天涯)回复于 2006-06-02 01:40:28 得分 18

dbc.setString(1,   new   String(("%"+search+"%").getBytes("ISO8859_1"),"GBK"));  
  dbc.setString(2,   new   String(("%"+search+"%").getBytes("ISO8859_1"),"GBK"));  
  改为:  
  String   strsearch   =   new   String((search).getBytes("ISO8859_1"),"GBK");  
  strsearch   =   "'%"   +   strsearch   +   "%'";  
  dbc.setString(1,   strsearch);  
  dbc.setString(2,   strsearch);  
   
   
   
   
  Top

9 楼supersky1()回复于 2006-06-02 08:59:31 得分 0

天崖的建议解决了异常问题,就是说现在执行搜索后,控制台不再报异常,但是页面显示部分还是没出来,仍然为“没有你要的记录”。。。郁闷了Top

10 楼liaoxiaoqi(天涯)回复于 2006-06-02 10:04:18 得分 0

你直接在数据库端执行SQL语句看看是否有数据返回  
  select   *   from   news   where   topic   like   '%查询内容%'   or   content   like   '%查询内容%'         order   by   id   descTop

11 楼supersky1()回复于 2006-06-02 18:10:00 得分 0

to   天崖:  
          可以的。  
          我在SQL   Server中的查询分析器内用如上查询语句是有结果的。  
           
          有个好消息是,在尝试了天崖的第一次建议后,我换了另一种方法,结果是可以达到预期目标了,具体思路是:直接在   点击了按钮后所指向的search.jsp页面中执行查询语句,相关代码如下:  
          。。。  
  <%  
          String   search   =   new   String(request.getParameter("content"));  
          String   search1=new   String(search.getBytes("ISO8859_1"),"GBK");  
          String   sql="select   *   from   news   where   topic   like   '%"+search1+"%'or   content           like   '%"+search1+"%'   order   by   id   desc";  
          ResultSet   rs=dbc.executeQuery(sql);  
          while(rs.next())     {  
  %>  
  <tr>  
          <td><%=rs.getString("topic")%></td>  
  </tr>  
            ...  
  <%}%>  
              运行后,查询结果是正确的。  
   
              但是这段代码是不经过那个Javabean的,通过bean处理的那个方法仍然行不通,会不会是  
                                        strsearch="'%"+strsearch+"%'";  
  这个语句中的外面的那个双引号引起的?不知道问题在哪。。。。。。Top

12 楼liaoxiaoqi(天涯)回复于 2006-06-02 18:16:51 得分 0

这说明问题出在你封装的JavaBean.  
  你把Newsdo的代码贴出来。Top

13 楼supersky1()回复于 2006-06-02 19:41:36 得分 0

import   ...  
  public   class   Newsdo   {  
              public   Collection   searchNews(String   search)   {  
                    DBConnect   dbc   =   null;  
  Collection   c   =   new   ArrayList();  
                    ResultSet   rs   =   null;  
  try   {  
  dbc   =   new   DBConnect();  
  News   news   =   new   News();  
                                      String   strsearch=new   String((search).getBytes("ISO8859_1"),"GBK");  
                                      rs   =   dbc.executeQuery("select   *   from   news   where   topic       like   '%"+strsearch+"%'   or   content   like   '%"+strsearch+"%'   order   by   id   desc");  
  news   =   null;  
  while   (rs.next())   {  
   
  news.setId(rs.getInt("id"));  
  news.setTopic(rs.getString("topic"));  
  news.setContent(rs.getString("content"));  
  。。。  
  c.add(news);  
  news   =   null;  
  }  
  }    
  catch   (Exception   e)   {  
  System.err.println("newsdo.search.rs:"+e);  
  }    
  finally   {  
  try   {  
  if   (rs   !=   null)   {  
  rs.close();  
  }  
  dbc.close();  
  }    
  catch   (Exception   e)   {  
          System.err.println("newsdo.search.close:"+e);  
  }  
  }  
  return   c;  
  }  
  Top

14 楼mysticality(影子传说)回复于 2006-06-02 19:55:51 得分 0

prepareStatement   可以进行模糊查询?Top

15 楼liaoxiaoqi(天涯)回复于 2006-06-02 20:23:35 得分 0

prepareStatement   可以进行模糊查询。  
   
  3.在search.jsp页面中的相关语句:  
        <%     String   search   =   new   String(request.getParameter("content"));  
                Newsdo   newsdo   =   new   Newsdo();                
                //Collection   c   =   newsdo.searchNews(search);这里改一下  
                Collection   c   =   new   ArrayList();  
                c   =   (ArrayList)newsdo.searchNews(search);  
                Iterator     iterator   =   c.iterator();              
                if   (c.size()   ==   0)   {  
        %>  
  <tr><td   width='50%'>没有你所要的记录</td></tr>  
        <%  
                }//  
              while   (iterator.hasNext())   {  
  News   news   =   (News)   iterator.next();  
        %>  
        <tr>  
            <td><%=news.getTopic()%></td>  
        </tr>  
          ....  
  Top

16 楼mysticality(影子传说)回复于 2006-06-02 20:28:24 得分 0

String   dbType   =   "MySql";  
                          String   driver   =   "com.mysql.jdbc.Driver";  
                          String   url   =   "jdbc:mysql://localhost:3306/jdbctest";  
                          String   username   =   "root";  
                          String   password   =   "root";  
                          Class.forName(driver);  
                          Connection   con   =   null;  
                        con   =   java.sql.DriverManager.getConnection(url,   username,   password);  
   
                          String   sql   =  
                                          "select   *   from   address   where   street   like       ?";  
                          java.sql.PreparedStatement   ps   =   con.prepareStatement(sql);  
                          String   street   =   "a";  
                          street   =   "%"   +   street   +   "%";  
                          ps.setString(1,   street);  
                          java.sql.ResultSet   rs   =   ps.executeQuery();  
                          while   (rs.next())   {  
                                  System.out.println(rs.getString("street"));  
                          }  
                          rs.close();  
                          ps.close();  
                          con.close();  
   
   
   
  insert   into   address   (street,city)   values   ('aaa','beijing');  
  insert   into   address   (street,city)   values   ('abc','beijing');  
  insert   into   address   (street,city)   values   ('aab','beijing');  
   
   
  CREATE   table   ADDRESS  
  (  
  ID   bigint   auto_increment   primary   key   NOT   NULL,    
  STREET   char(40),  
  city   char(20),  
  state   char(2),  
  zip   char(10)  
  );  
  得到  
  aaa  
  abc  
  aab  
   
  的确可以模糊查询,我搞定了Top

17 楼supersky1()回复于 2006-06-02 20:36:00 得分 0

出来了  
  把     news=new   News();放到while(rs.next()){   ...     }   里面就可以了,就是不知道该怎么解释  
                   
  谢谢天崖,也谢谢其他几位提意见的朋友     ^_^  
   
  希望以后可以象天崖一样去帮助别人  
  也希望其他高手们看到了自己能解决的问题时,尽可能提一些的能帮助别人的话,以不至于浪费自己的时间,也避免了间接的打击别人。。。呵呵  
  Top

18 楼qingyuan18(zealot_tang)回复于 2006-06-02 20:41:58 得分 0

你的a.jsp中搜索文本框中输入的是中文是吧?  
  request.setCharaterEncoding("GBK");Top

19 楼supersky1()回复于 2006-06-02 23:21:16 得分 0

呵呵,不是这个原因,就我上面说的已经可以正确执行了Top

相关问题

关键词

得分解答快速导航

  • 帖主:supersky1
  • Lucy222
  • liaoxiaoqi

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo