关于java的传参,牵涉到数据库~~~~~~~~~~~

在我做一个关于图书系统查询的时候发现一个问题,我查询图书可以通过书名,作者,ISBN,出版社等查询
比如可以只通过书名,或者通过书名与作者,或者是书名,作者,出版社
那么也就是说我的search函数的参数个数是不定的,而且参数的类型也不定
而java不支持默认参数
那么我要写的函数将会包括search(string author),search(string book),search(string author,string book)....
假设最多有3个参数还好办,只要写3+2+1=6个函数重载,那么如果最多有4个参数,5个参数呢,岂不是要写很多函数的重载?
==========================================================
有人解答:两种办法
1.用map接所有的参数 参数就传这个map 然后在方法里循环这个map 判断不为空的 添加 条件查询语句
2.在一个方法把所有参数都穿过 如method(参数1,参数2,参数3,。。。)
然后在方法判断 不为空的添加查询语句
===========================================================
我现在要在数据库中搜索哦,是用JDBC连SQLserver。
如果我判断书名不为空,则我写
sql="SELECT * FROM Book WHERE title=\'"+title;
ResultSet r=excuteQuery(sql);
这样能找到满足title条件的结果集,但是再判断作者呢?
我总不能在得到的结果集中查找吧?
请好心人赐教~~~~~~~~~~~~

首先你可以使用PreparedStatement这个类,用法如下——
Connection con ;(创建数据库链接)
PreparedStatement ps = con.prepareStatement("select * from Book where title=?");
ps.setString(1, "title");
ps.execute();

用法就是这样,这个比Statement类要安全点。。。。

置于你的第一个方法重载的问题,你可以定义这样的方法,search(int i, String... args)。。。

这是一种可变参数列表用法,前面的参数i,表示你要调用哪个SQL语句,直接用switch来进行帅选就行了;后面的args其实是个数组,用来存储你传进去的参数。。。。

例如这样search(1, "king", "book"),这样就相当于调用1号SQL语句,作者名为king,书名为book,当然,这样的设定由你自己来确定,如下——
public void search(int i, String... args) {
String sql = null;
switch(i) {
case 1:sql = "select * from Book where author=? and book=?";break;
}
//接着就可以使用PreparedStatement类来查询数据了
}

可能我说的不太清楚,你查询一下PreparedStatement的用法,还有Java可变参数列表的用法,这样能很好地解决你的问题。。。。

总的来说,你的SQL语句可以多变的,而整个方法的结构可以不用改变,只要执行不同的SQL语句就能得到不同的结果。。。。

希望这些对你有帮助,可以上Q找我,410430209,呵呵。。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-06
呵呵。小问题。有点实际经验就很好解决了。。
String sql = "SELECT * FROM Book WHERE 1=1";
if(书名不为空){
sql = sql + " and title = " + 书名;
}
if(作者不为空){
sql = sql + " and author=" + 作者;
}
----
经验解决。呵呵。本回答被提问者采纳
第2个回答  2010-12-06
Map map = new HashMap();
map = XXXXX (); XXXXX ();为lz 从页面获取信息后封装Map的方法
如:页面上有10个复选框 ,而用户选择了3个 点查询事件,以 品牌 thingpad CPU i5,内存 4G
为例
那么 map 应该放了3对值

有了map 下面拼接 sql 语句
定义 方法 public String getSql (map) {
String sql = ;
StringBuffer buffer = new StringBuffer();
buffer.append(“select * from 表 where 1= 1”);
Set set = map.ketSet();
Iterator i = set.iterator();
while (i.hasNext()) {
String value = i.next();
buffer.append(" and ");
buffer.append(" " +value );
buffer.append(" = ");
buffer.append( map.get(value ););
}
sql = buffer.toString();
//结果应该为 select * from 表 where 1=1 and 品牌 = “thinkpad” and CPU = “i5” and 内存 = 4G
return sql;

然后在用JDBC去执行这个sql ,就会查询出结果
有的单词好像写的不对。lz 在 看看
第3个回答  2010-12-06
我感觉用 PreparedStatement ps = con.prepareStatement("select * from Book where title=?");
这样的也不是太恰当,因为lz现在的问题是参数不确定,sql 查询where后的条件就也确定不了。

我一般都这么处理的,方法中传参也用Map的方式。拿到Map后再拼接sql参数

Map map = new HashMap();
map.put("p1","aaa");
map.put("p2","bbb");
.....

然后根据Map中参数拼接sql 参数
String sql ="select * from book whre 1=1";
if (null != map.get("p1")) sql = sql + " and p1='"+(String)map.get("p1")+"'";
if (null != map.get("p2")) sql = sql + " and p2='"+(String)map.get("p2")+"'";
...
sql = sql + " order by .....“;

这样的话不用重载n个方法了,多个参数就这里多加个if判断即可。
第4个回答  2010-12-06
String sql = "select * from book where 1=1";

if (checkTitle)
sql = sql + " and title=\'"+title + "\'";
if (checkAuthor)
sql = sql + " and author=\'"+author+ "\'";

依次类推 把条件拼起来 且符合语法
相似回答