关于JSP 使用prepareStatement进行综合查询的问题

本人想实现一个查询,要求是根据用户输入条件进行综合查询,例子详细如下:数据库内四个列usertimeiptext表单四个输入栏,如果用户在表单user内输入内容,即在数据... 本人想实现一个查询,要求是根据用户输入条件进行综合查询,例子详细如下:
数据库内 四个列 user time ip text
表单四个输入栏,如果用户 在表单user内输入内容,即在数据库查询user相似于关键字的记录,如果用户既输入user又输入time,即在数所库查询user相似关键字以及time相似关键字的记录,以此类推
现在我能将变化的SQL语句写出来,但问题是,stmt.setString()这句是变化不定的,该如何写?因为并不知道用户会在输入哪个关键字,所以除了判断用户所有的输入情况之外,好像无法动态决定stmt.setString()的写法,但判断用户所有输入情况太麻烦,只有4个也许能实现,但如果有N个,怎么办?
在线等,完美解决问题的200分献上
elietian 说得我似懂非懂,,能再说清楚些吗
键盘上的蛤蟆 强人哦,呵呵,虽然我没用你的办法试,我用Statement解决了问题,但你给我一种JS有点无敌的感觉,,呵呵,3Q,我一会用你的方法试下
展开
 我来答
帐号已注销
2007-08-13 · TA获得超过816个赞
知道小有建树答主
回答量:816
采纳率:0%
帮助的人:678万
展开全部
我的经验,以下为示例
String strSql="select * from tab where 1=1";//这是无条件查询语句,用个1=1只是为了把 where 引出来并能和后面的 and 连接上;
if (user!="") strSql += "and user=" + user;//用户每多填一个输入栏, SQL 语句中就会添加一个 and 条件查询
if (time!="") strSql += "and time=" + time;//即使有N个输入栏也只需如次写 N+1 行代码,我想N应该小于15吧
。。。
还有哪种办法比这样做所需的代码量还少呢?
另外关于“判断用户所有输入情况太麻烦”。因为有的条件并不是简单的判断是否等于就行了,有的要用大小比较,有的要用模糊比较,有的要用函数,所以还是要一个一个做的
elietian
2007-07-26 · TA获得超过1065个赞
知道小有建树答主
回答量:835
采纳率:0%
帮助的人:679万
展开全部
在form或者说你的servlet里检查use等4个变量
加入用户输入了前3个但是text没有输入
那么你这样写
if(user==null||user.equals("")){
user="2>1";
}
....这里一样的
if(text==null||text.equals("")){
text="2>1";
}
smtp不变的情况下或把text当作2>1,其实就相当于不在数据库中检查text
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
贯真
2007-07-26 · TA获得超过2698个赞
知道大有可为答主
回答量:1022
采纳率:0%
帮助的人:1100万
展开全部
为什么要用PreparedStatement?
像这种未知查询几个字段的,直接在你写变化的sql的时候加上条件比较好。
比如说:
String whCondtion = " where 1=1";
if (aD_User.getUser_id() != null
&& aD_User.getUser_id().equals("") == false) {
whCondtion = whCondtion + " and " + FLD_USER_ID + " = '" +
aD_User.getUser_id() + "'";
}
if (aD_User.getUser_name() != null
&& aD_User.getUser_name().equals("") == false) {
whCondtion = whCondtion + " and " + FLD_USER_NAME + " = '" +
aD_User.getUser_name() + "'";
}
if (aD_User.getUser_passwd() != null
&& aD_User.getUser_passwd().equals("") == false) {
whCondtion = whCondtion + " and " + FLD_USER_PASSWD + " = '" +
aD_User.getUser_passwd() + "'";
}

String sql = "select * from " + TBNAME + whCondtion + sOrderBy;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
洪秋梵雅GB
2007-07-27 · TA获得超过4875个赞
知道小有建树答主
回答量:901
采纳率:0%
帮助的人:948万
展开全部
前台多选条件封装成 where字句提交给后台查询,下面是个例子,我刚写的,累哦,希望可以帮到你

<html>
<style>
tr.head, th.head {
color:white;
cursor:default;
}

tr.head td, th.head td {
background: #5091e9 url(../images/bar.gif) repeat-x top;
padding: 0;
text-align:center;
height:20px;
}

tr.row {
cursor:pointer;
}

tr.tracking {
cursor:pointer;
color:white;
}

tr.tracking td {
background-color:#8be;
}

tr.rowSelected td {
background-color:#bdf;
}

tr.rowSelected {
cursor:default;
}
</style>
<SCRIPT LANGUAGE="JavaScript">
<!--
/**
* Make a map like java.
* You can use this map like this :
* var myMap = new Map();
* myMap.put("key","value");
* var key = myMap.get("key");
*/
function Map() {

this.elements = new Array();

this.size = function() {
return this.elements.length;
}

this.Map = function( k, v ){
this.put( k, v );
}

this.isEmpty = function() {
return (this.elements.length < 1);
}

this.clear = function() {
this.elements = new Array();
}

this.put = function(_key, _value) {
this.elements.push({key:_key, value:_value});
}

this.remove = function(_key) {
var bln = false;

try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
this.elements.splice(i, 1);
return true;
}
}
} catch(e) {
bln = false;
}
return bln;
}

this.get = function(_key) {
try{
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
return this.elements[i].value;
}
}
}catch(e) {
return null;
}
}

this.element = function(_index) {
if (_index < 0 || _index >= this.elements.length) {
return null;
}
return this.elements[_index];
}

this.containsKey = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
bln = true;
}
}
}catch(e) {
bln = false;
}
return bln;
}

this.containsValue = function(_value) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].value == _value){
bln = true;
}
}
} catch(e) {
bln = false;
}
return bln;
}

this.values = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
arr.push(this.elements[i].value);
}
return arr;
}

this.keys = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
arr.push(this.elements[i].key);
}
return arr;
}
}
//-->
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript">
<!--

function add(){
var c = document.all.c.value;
var op = document.all.op.value;
var value = document.all.v.value;
var lx = document.all.c.options[ document.all.c.selectedIndex ].lx;
if( value == "" )
return;

var condition = "";
if( op != "like" )
if( lx == "n" ){ //数字类型
if( !isNumber( value ) ){
alert("请输入正确数字类型");
return;
}
condition = getAnd() + " "+ c + " " + op + " " + value;
}else if( lx == "s" )
condition = getAnd() + c + " " + op + " '" + value + "'";
else{
alert("类型错误");
return;
}
else{
if( lx == "n" ){
alert("数字类型不能like");
return;
}
var condition = getAnd() + c + " " + op + " '%"+value+"%'";

}
var opt = new Option(condition, condition);
document.all.items.options.add(opt);
}
function getAnd() {
if (items.options.length == 0) {
return " where ";
} else {
return " and ";
}
}
function del(){
if( items.selectedIndex < 0 ){
return;
}
if( items.selectedIndex == 0 && items.options.length >= 2){
var opt = items.options[1];
opt.value = opt.value.replace("and","where");
items.options[1] = new Option(opt.value,opt.value);
}
items.options.remove(items.selectedIndex);
}
function cler(){
while( items.options.length != 0){
items.options.remove(0);
}
}

function sub(){
var condition = "";
for( var i = 0; i < items.options.length; i++ ){
condition = condition + " " +items.options[i].value;
}
alert(condition);
}

function isNumber( v ){
var z = /^(\d*|\-?[1-9]+[0-9]*|\-?[1-9]+[0-9]*\.\d+|\-?[0-9]*\.\d+)$/;
return (v.match(z));
}
//-->
</SCRIPT>
<body>
<table>
<tr>
<td>
<select id="c">

</select>
<select id="op">
<option value="=">=</option>
<option value="<"><</option>
<option value="<="><=</option>
<option value=">">></option>
<option value=">=">>=</option>
<option value="like">like</option>
<select>
<input type="text" id="v">
<input type="button" value="添加" onclick="add()">
<input type="button" value="删除" onclick="del()">
<input type="button" value="清空" onclick="cler()">
<input type="button" value="查看条件" onclick="sub()">
</td>
</tr>
<tr>
<td>
<SELECT id="items" size="8" style="width:500px;" multiple>

</SELECT>
</td>
</tr>
<SCRIPT LANGUAGE="JavaScript">
<!--
//此处加如 所选择列 map.put( 列名, 类型< s:字符串, n:数字> )
var map = new Map();
map.put( "user", "s" );
map.put( "time", "n" );
map.put( "ip", "s" );
map.put( "text", "s" );
var keys = map.keys();

var element = document.all.c;
for( var i = 0; i < keys.length; i++ ){
var option = new Option( keys[i], keys[i] );
option.setAttribute("lx", map.get( keys[i] ));

document.all.c.options[i] = option ;
}
//-->
</SCRIPT>
</body>
</html>
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
woommy
2007-07-31 · TA获得超过363个赞
知道答主
回答量:113
采纳率:0%
帮助的人:67.5万
展开全部
这个问题很简单啊,你先写一个sql语句放进prepareStatement
可以这样写:select * from table where user like ? and ip like ? and time like ? and text like ?
然后setString的时候根据request.getParameter("...")的值是否==null设置参数,比如user这个字段,如果用户没有输入,那么String user = request.getParameter("user")肯定==null 你判断一下之后如果为null,让user="";然后setString(1, "%"+user+"%");
这样假如用户输入了user为hello,那语句变成user like '%hello%',如果用户没有输入user,那语句变成user like '%%' 不影响查询结果 你试试,希望能帮到你。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xunan_best
2007-08-03
知道答主
回答量:59
采纳率:0%
帮助的人:0
展开全部
前几天刚做过.判断接收的输入栏的值就可以,如果为空,就不在SQL语句中出现这一列.具体代码如下:
String things=request.getParameter("things");
String thing_address=request.getParameter("thing_address");
String ren=request.getParameter("ren");
String str="";
if(str==""){
if(things==null || things=="" || things.equals(null) || things.equals("")){
str="";
}else{
str="WHERE things like '%"+things+"%' ";
}
}
if(str==""){
if(thing_address==null ||thing_address=="" ||thing_address.equals(null) ||thing_address.equals("")){
str=str;
}else{
str="WHERE thing_address = '"+thing_address+"'";
}
}else{
if(thing_address==null ||thing_address=="" ||thing_address.equals(null) ||thing_address.equals("")){
str=str;
}else{
str=str+" and thing_address = '"+thing_address+"'";
}
}

if(str==""){
if(ren==null ||ren=="" ||ren.equals(null) ||.equals("")){
str=str;
}else{
str="WHERE ren = '"+ren+"'";
}
}else{
if(ren==null ||ren=="" ||ren.equals(null) ||ren.equals("")){
str=str;
}else{
str=str+" and ren = '"+ren+"'";
}
}

传入的SQL语句为:String sql1="SELECT * FROM 表名 "+str+"";
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式