2017-07-19 152 views
1

我对编程非常陌生。我正在处理一个应用程序,它有6个字段供用户输入输入,并根据输入的输入,我必须从数据库查询行。根据用户输入设置查询数据库 - JAVA

这是我的形式 enter image description here

的形象和我有输入以下组合:

  • A-号码
  • B-号码
  • A-号码,B-号码
  • A-号码,开始日期/时间
  • 号码,Bnumber,开始日期/时间
  • B-号码,开始日期/时间
  • A-号码,开始日期/时间,结束日期/时间
  • B-号码,开始日期/时间,结束日期/时间
  • A-号码,B-号码,开始日期/时间,结束日期/时间

用户可以按照上述所有方式输入输入。我必须根据用户输入查询数据库。

比方说,用户输入A-号码,然后我的查询将

Select * from table_name where Anumber = 'input'

如果用户输入两个aNumber的和B-号码,然后我的查询将

Select * from table_name where Anumber = 'input' AND bnumber = 'input2'

章等.. 。

我在分享一些我的代码来认识别人我究竟在做什么和什么可以做得更好。

if (TextAnumber.isEmpty() && TextBnumber.isEmpty() && StrUserStartDate.isEmpty() && StrUserStartTime.isEmpty() 
       && StrUserEndDate.isEmpty() && StrUserEndTime.isEmpty()) { 
      JOptionPane.showMessageDialog(null, "Please Enter At Least One Input"); 
     } 

     if (StrUserStartDate.isEmpty() && !StrUserStartTime.isEmpty()) { 
      JOptionPane.showMessageDialog(null, "Please Enter Start Date"); 
     } 
     if (!StrUserStartDate.isEmpty() && StrUserStartTime.isEmpty()) { 
      JOptionPane.showMessageDialog(null, "Please Enter Start Time"); 
     } 

     if (StrUserEndDate.isEmpty() && !StrUserEndTime.isEmpty()) { 
      JOptionPane.showMessageDialog(null, "Please Enter End Date"); 
     } 
     if (!StrUserEndDate.isEmpty() && StrUserEndTime.isEmpty()) { 
      JOptionPane.showMessageDialog(null, "Please Enter End Time"); 
     } 

     if (!StrUserEndDate.isEmpty() && !StrUserEndTime.isEmpty() && StrUserStartDate.isEmpty() 
       && StrUserStartTime.isEmpty()) { 
      JOptionPane.showMessageDialog(null, "Please Enter Start Date/Time"); 
     } 

     if (!TextAnumber.isEmpty() && TextBnumber.isEmpty() && StrUserStartDate.isEmpty() && StrUserEndDate.isEmpty()) { 
      ResultSet rs = stmt.executeQuery(
        "select anumber,bnumber FROM CDR WHERE ANUMBER = '" + TextAnumber + "' ORDER BY ANUMBER"); 
      while (rs.next()) { 
       graphNodeA = rs.getString("ANUMBER"); 
       graphNodeB = rs.getString("BNUMBER"); 
       graph.addNode(graphNodeA); 
       graph.addNode(graphNodeB); 
       i++; 
       graph.addEdge("string" + i, graphNodeA, graphNodeB); 
      } 
     } 
     if (TextAnumber.isEmpty() && !TextBnumber.isEmpty() && StrUserStartDate.isEmpty() && StrUserEndDate.isEmpty()) { 
      ResultSet rs = stmt.executeQuery(
        "select anumber,bnumber FROM CDR WHERE ANUMBER = '" + TextBnumber + "' ORDER BY BNUMBER"); 
      while (rs.next()) { 
       graphNodeA = rs.getString("BNUMBER"); 
       graphNodeB = rs.getString("ANUMBER"); 
       graph.addNode(graphNodeA); 
       graph.addNode(graphNodeB); 
       i++; 
       graph.addEdge("string" + i, graphNodeA, graphNodeB); 
      } 
     } 
     if (!TextAnumber.isEmpty() && !TextBnumber.isEmpty() && StrUserStartDate.isEmpty() 
       && StrUserEndDate.isEmpty()) { 
      ResultSet rs = stmt.executeQuery("select anumber,bnumber FROM CDR WHERE ANUMBER = '" + TextAnumber 
        + "' AND BNUMBER = '" + TextBnumber + "' ORDER BY ANUMBER"); 
      while (rs.next()) { 
       graphNodeA = rs.getString("ANUMBER"); 
       graphNodeB = rs.getString("BNUMBER"); 
       graph.addNode(graphNodeA); 
       graph.addNode(graphNodeB); 
       i++; 
       graph.addEdge("string" + i, graphNodeA, graphNodeB); 
      } 
     } 

对于这一点,我使用If/Else这在我看来很复杂,也代码看起来很粗糙。

我在这里想要的是,如果这种问题有更好的解决方案吗? 我希望我在这里清除我的问题:)

+1

有什么问题吗?这可能更适合[Code Review](https://codereview.stackexchange.com/)。 – DCON

回答

0

为了改进代码,我的建议是使用Hibernate标准。它不仅可以改善您的代码,还可以防止您的应用程序问题,如SQL注入。例如说,为表对Hibernate类是CDR.java可以办理查询,如下图所示:

Criteria cr = session.createCriteria(CDR.class); 
    if (!TextAnumber.isEmpty()) { 
     cr.add(Restrictions.eq("ANUMBER", TextAnumber)); 
    } 
    if (!TextBnumber.isEmpty()) { 
     cr.add(Restrictions.eq("BNUMBER", TextBnumber)); 
    } 
    //make sure to format your date to the right format 
    if (!StrUserStartDate.isEmpty().isEmpty()) { 
     cr.add(Restrictions.gt("StartDate",StrUserStartDate)); 
    } 
    if (!StrUserEndDate.isEmpty().isEmpty()) { 
     cr.add(Restrictions.lt("EndDate",StrUserEndDate)); 
    } 

    List results = cr.list(); 

另一个改进是创建重复的代码的新方法,提高可读性和错误的固定。

更多关于Hibernate的参考文档在这里: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

这里是一个关于它的伟大的教程太: https://www.tutorialspoint.com/hibernate/hibernate_criteria_queries.htm