请帮我看一下,我的模糊查询问题出在哪里
大家好:
下面是我在做一个站内查询遇到的问题,请各位指点一下。
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




