Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java调用的MySQL查询-配置;其中;参数_Java_Mysql - Fatal编程技术网

从Java调用的MySQL查询-配置;其中;参数

从Java调用的MySQL查询-配置;其中;参数,java,mysql,Java,Mysql,我正在从独立的java应用程序连接到mysql数据库。我的应用程序使用几个过滤器来确定将从数据库中选择哪些数据 在某些情况下,我希望以忽略其“WHERE”参数的方式构造select命令,并从db中选择所有值 这是我的例子: String query = "SELECT * from messages WHERE type='" + type + "' ORDER BY id DESC"; 变量type可以包含与my db中项目的Varchar相匹配的特定类型。但是,用户可以将类型设置为“all

我正在从独立的java应用程序连接到mysql数据库。我的应用程序使用几个过滤器来确定将从数据库中选择哪些数据

在某些情况下,我希望以忽略其“WHERE”参数的方式构造select命令,并从db中选择所有值

这是我的例子:

String query = "SELECT * from messages WHERE type='" + type + "' ORDER BY id DESC";
变量type可以包含与my db中项目的Varchar相匹配的特定类型。但是,用户可以将类型设置为“all values”(或者类似的,我希望这足够清楚),在这种情况下,查询将从db中选择所有值(它将忽略where参数)

我知道我可以通过简单地在代码中放入一些if语句并在每个分支中调用不同的select命令来实现这一点,但如果使用了多个规范(参数中的属性),这将是非常无效的

例如:

String query = "SELECT * from messages WHERE type='" + type + "' AND time='" + time + "'  ORDER BY id DESC";

我甚至不确定这是否可能做到。如果没有,很抱歉关于dumm的问题。。。提前谢谢

您可以创建类型类和时间类等等。此类将包含一个名为
getSQL()
的函数,该函数返回类型或在所有类型的情况下返回“”

我认为您必须通过代码来完成,而SQL中没有任何东西可以完成您想要做的事情。通常,人们使用类似于Hibernate的ORM,并以更安全的方式构造查询(以避免SQL注入),而不是使用字符串连接


在Hibernate中就是这样做的:

WHERE子句允许您根据几个谓词过滤数据集。不指定它意味着不进行过滤,因此您将添加任何谓词的所有可能值

如果将<>代码> 子句作为谓词,谓词作为谓词或原子谓词集合,则可以通过遍历谓词巢来生成子句并生成所需字符串。如果字符串返回为空,只需删除

WHERE
子句即可

interface Predicate {
    public String toString();
}

// further derive this class for specific predicates
class AtomPredicate implements Predicate {
    public AtomPredicate(){}
    public toString() {}
}

 // basic predicate set 
class SetPredicate implements Predicate {
    public SetPredicate(String connector){this.connector = connector;}
    private ArrayList<Predicate> set;
    private String connector;
    public toString(){
        String res, tmp;
        int i;
        if (set.size() == 0) return "";
        while (res.size() == 0 && i < set.size()) {
            res = set[i++].toString();
        }
        for (; i < set.size(); ++i) {
            tmp = set[i].toString();
            if (tmp.size() > 0) 
                res += connector + " " + tmp; 
        }
        if (res.size() > 0) 
            return "(" + res + ")";
    }

    class WhereClause {
        public WhereClause() {}
        private Predicate predicate;
        public toString(){ 
            String res = predicate.toString();
            if (res.size() > 0) return "WHERE " + res;
            return "";
        }
    }
接口谓词{
公共字符串toString();
}
//进一步为特定谓词派生此类
类AtomPredicate实现谓词{
公共AtomPredicate(){}
公共toString(){}
}
//基本谓词集
类SetPredicate实现谓词{
公共SetPredicate(字符串连接器){this.connector=connector;}
私有数组列表集;
专用串连接器;
公共toString(){
字符串res,tmp;
int i;
if(set.size()==0)返回“”;
而(res.size()==0&&i0)
res+=连接器+“”+tmp;
}
如果(分辨率大小()>0)
返回“(“+res+”)”;
}
类别条款{
public where子句(){}
私有谓词;
公共toString(){
String res=谓词.toString();
if(res.size()>0)返回“WHERE”+res;
返回“”;
}
}
你可以从基本的大纲开始,并根据需要扩展。但是,你应该首先尝试寻找一个现有的解决方案,比如在另一个答案中链接的jboss库,以避免重新发明轮子