【问题标题】:Retrieve database in java using JTextField to search使用JTextField检索java中的数据库进行搜索
【发布时间】:2014-02-26 19:49:09
【问题描述】:

所以,我想检索用户将使用文本字段搜索某些列的数据库信息,如下所示:

column1 查找用户输入, column2 找到用户输入, column3 找到用户输入,

我遇到的问题是sql语句:

String sql = "select * from table where column = '" + textfield1.getText() + "'";

如果 textfield1 为空,它将只检索不包含任何内容的条目。

我试图检索的内容将有 6 个文本字段,这意味着数据库中有 6 个列。使用 java 我需要很多 if 语句

还有其他方法可以缩短吗?

编辑 -- 更多信息 --

if 语句将从:

if (!(t1.getText().equals("")) && !(t2.getText().equals("")) && !(t3.getText().equals(""))
&& !(t4.getText().equals("")) && !(t5.getText().equals("")) && (t6.getText().equals("")))

一直到

if (t1.getText().equals("") && t2.getText().equals("") && t3.getText().equals("")
&& t4.getText().equals("") && t5.getText().equals("") && t6.getText().equals("")

涵盖了6个输入字段的所有可能组合,所有这些语句的重点是忽略空文本字段但提供相应的sql语句。

除了把它们都写下来之外,我不知道如何计算可能的组合(我开始了,太多了)。

【问题讨论】:

  • 如果两个 JTextView 不为空怎么办?
  • 不太清楚你想要什么,请详细说明或提供更多代码。

标签: java sql


【解决方案1】:

我真的不明白为什么那些ifs,您应该详细说明您的问题,但我会尽力提供帮助。

好吧,如果您想从数据库中检索所有内容,您可以使用 LIKE:

String sql = "select * from table where column like '%" + textfield1.getText() + "%'";

这样您将获得包含文本的所有内容,这意味着,如果该字段是 empty,它将带来所有结果,我想这是最好的方法,以避免不必要的 if 子句。

另一件事,检查你应该使用的空字段:

t1.getText().trim().isEmpty()

但是如果你让他们写空格,LIKE 对你没有帮助,那么你需要 .trim() 你所有的文本然后你的空格将被忽略。

【讨论】:

  • like 操作符可以正常工作,谢谢你提醒我它的存在哈哈。
  • 谢谢 :) 我们在这里为您提供帮助,很高兴知道它对您有用!
【解决方案2】:

以下可以更简洁地表述,但要明确一点:

JTextField ts = new JTextField[6];

Set<String> values = new HashSet<>(); // Removes duplicates too.
for (JTextField t : ts) {
    String text = ts.getText().trim();
    if (!text.isEmpty()) {
        values.add(text);
    }
}

// Build the WHERE condition of a PreparedStatement
String condition = "";
for (String value : values) {
    condition += condition.isEmpty() ? "WHERE" : " OR";
    condition += " column = ?";
}

String sql = "select * from table " + condition;
PreparedStatement stm = connection.prepareStatement(sql);
int index = 1; // SQL counts from 1
for (String value : values) {
    stm.setString(index, value);
    ++index;
}
ResultSet rs = stm.executeQuery();

PreparedStatement 的使用使得转义 '(和反斜杠等)不再需要,并且还可以防止 SQL 注入(参见维基百科)。

【讨论】:

  • 感谢您的回复
【解决方案3】:

我有一个问题,我想根据多个 jtext 字段搜索数据,我哪里出错了,因为这仅显示具有第一个 id 的一行

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    String sql="SELECT Employee.EmpID,Employee.Fname,Employee.Mname,Employee.Sname,Employee.DoB,Employee.Phone,"
                    + "Employee.Email,Employee.Nationality,Employee.Desegnition,Employee.NSSF,Employee.WCF,"
                    + "Employee.BSalary,Allowance.medical,Allowance.Bonus,Allowance.others,Allowance.tov,Allowance.TA,"
                    + "Attendece.Hrs from Employee,Allowance,Attendece WHERE "
                    + "Employee.EmpID=Allowance.EmpID and Attendece.EmpID=Allowance.EmpID AND Employee.EmpID=? AND Attendece.Dt=?";
     try{



             pd=conn.prepareStatement(sql);
             pd.setString(1,id.getText());
             pd.setString(2,Date1.getText());
             r=pd.executeQuery();



             //setting the text fields
        if(r.next())
        {
        String a=r.getString("EmpID");
        eid.setText(a);
        String b=r.getString("Fname");
        fname.setText(b);
        String c=r.getString("Mname");
        mname.setText(c);
        String d=r.getString("Sname");
        sname.setText(d);
        String e=r.getString("DoB");
        dob.setText(e);
        String f=r.getString("Desegnition");
        Des.setText(f);
         String g=r.getString("Bsalary");
        bsal.setText(g);
          String h=r.getString("Phone");
       phone.setText(h);
          String i=r.getString("Email");
        email.setText(i);
          String j=r.getString("Nationality");
        nationality.setText(j);
          String k=r.getString("Desegnition");
        Des.setText(k);
          String l=r.getString("NSSf");
        nssf.setText(l);
          String m=r.getString("WCF");
        wcf.setText(m);
         String n=r.getString("tov");
        oh.setText(n);
         String o=r.getString("Bonus");
        bn.setText(o);
         String p=r.getString("medical");
        md.setText(p);
         String q=r.getString("others");
        ot.setText(q);
         String s=r.getString("TA");
        ta.setText(s);
         String t=r.getString("Hrs");
        hrs.setText(t);

        int day;
        day=Integer.parseInt(t)/8;
        days.setText(Integer.toString(day));

        double week=day/7;
        weeks.setText(Double.toString(week));

        }
        r.close();
        pd.close();



    }catch(Exception e)
    {



    }

【讨论】:

  • 您为什么要发布您的问题作为答案?与创建新问题相比,人们更难找到您的帖子(并提供有用的反馈)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2018-04-27
  • 2011-01-12
相关资源
最近更新 更多