Java if语句

4
public void searchKlijenta(KlijentiFormEvent klijentiFormEvent) throws SQLException {

    String nazivK = klijentiFormEvent.getNaziv();
    String adresaK = klijentiFormEvent.getAdresa();
    String gradK = klijentiFormEvent.getGrad();
    String drzavaK = klijentiFormEvent.getDrzava();
    String telefonK = klijentiFormEvent.getTelefon();
    String faxK = klijentiFormEvent.getFax();
    String mailK = klijentiFormEvent.getMail();
    String mobitelK = klijentiFormEvent.getMobitel();
    String oibK = klijentiFormEvent.getOib();
    String ugovorK = klijentiFormEvent.getUgovor();
    String osobaK = klijentiFormEvent.getOsoba();

    if (nazivK.length() == 0) 
        nazivK = null;
    if (adresaK.length() == 0) 
        adresaK = null;
    if (gradK.length() == 0) 
        gradK = null;
    if (drzavaK.length() == 0) 
        drzavaK = null;
    if (telefonK.length() == 0) 
        telefonK = null;
    if (faxK.length() == 0) 
        faxK = null;
    if (mailK.length() == 0) 
        mailK = null;
    if (mobitelK.length() == 0) 
        mobitelK = null;
    if (oibK.length() == 0) 
        oibK = null;
    if (ugovorK.length() == 0) 
        ugovorK = null;
    if (osobaK.length() == 0) 
        osobaK = null;


    klijentiSearchModel.clear();

    String sql = "select * from zavrsni.klijenti where naziv like '"+nazivK+"' or adresa like '"+adresaK+"' or grad like '"+gradK+"' or drzava like '"+drzavaK+"' or telefon like '"+telefonK+"' or fax like '"+faxK+"' or mail like '"+mailK+"' or mobitel like '"+mobitelK+"' or oib like '"+oibK+"' or ugovor like '"+ugovorK+"' or osoba like '"+osobaK+"' ";
    Statement selectStmt = con.createStatement();
    ResultSet result = selectStmt.executeQuery(sql);

    while(result.next()) {
        int id = result.getInt("id");
        String naziv = result.getString("naziv");
        String adresa = result.getString("adresa");
        String grad = result.getString("grad");
        int posBr = result.getInt("posBr");
        String drzava = result.getString("drzava");
        String telefon = result.getString("telefon");
        String fax = result.getString("fax");
        String mail = result.getString("mail");
        String mobitel = result.getString("mobitel");
        String oib = result.getString("oib");
        String ugovor = result.getString("ugovor");
        String osoba = result.getString("osoba");

        KlijentiModelSearch klijentSearch = new KlijentiModelSearch(id, naziv, adresa, grad, posBr, drzava, telefon, fax, mail, mobitel, oib, ugovor, osoba);
        klijentiSearchModel.add(klijentSearch);
    }

    result.close();
    selectStmt.close();

}

我能否将这段代码写得更短?我在考虑使用"if"语句?

也许可以通过while循环来实现?

这是用于在数据库中搜索客户端的方法。这个方法工作得很好,但我想将这个if语句写得更短。

谢谢。

编辑已解决:

public void traziKlijenta(KlijentiFormEvent klijentiFormEvent) throws SQLException {

    String nazivK = returnNullIfEmptys(klijentiFormEvent.getNaziv());
    String adresaK = returnNullIfEmptys(klijentiFormEvent.getAdresa());
    String gradK = returnNullIfEmptys(klijentiFormEvent.getGrad());
    String drzavaK = returnNullIfEmptys(klijentiFormEvent.getDrzava());
    String telefonK = returnNullIfEmptys(klijentiFormEvent.getTelefon());
    String faxK = returnNullIfEmptys(klijentiFormEvent.getFax());
    String mailK = returnNullIfEmptys(klijentiFormEvent.getMail());
    String mobitelK = returnNullIfEmptys(klijentiFormEvent.getMobitel());
    String oibK = returnNullIfEmptys(klijentiFormEvent.getOib());
    String ugovorK = returnNullIfEmptys(klijentiFormEvent.getUgovor());
    String osobaK = returnNullIfEmptys(klijentiFormEvent.getOsoba());

    klijentiSearchModel.clear();

    String sql = "select * from zavrsni.klijenti where naziv like '%"+nazivK+"%' or adresa like '%"+adresaK+"%' or grad like '%"+gradK+"%' or drzava like '%"+drzavaK+"%' or telefon like '%"+telefonK+"%' or fax like '%"+faxK+"%' or mail like '%"+mailK+"%' or mobitel like '%"+mobitelK+"%' or oib like '%"+oibK+"%' or ugovor like '%"+ugovorK+"%' or osoba like '%"+osobaK+"%' ";
    Statement selectStmt = con.createStatement();
    ResultSet result = selectStmt.executeQuery(sql);

    while(result.next()) {
        int id = result.getInt("id");
        String naziv = result.getString("naziv");
        String adresa = result.getString("adresa");
        String grad = result.getString("grad");
        int posBr = result.getInt("posBr");
        String drzava = result.getString("drzava");
        String telefon = result.getString("telefon");       
        String fax = result.getString("fax");
        String mail = result.getString("mail");
        String mobitel = result.getString("mobitel");
        String oib = result.getString("oib");
        String ugovor = result.getString("ugovor");
        String osoba = result.getString("osoba");

        KlijentiModelSearch klijentSearch = new KlijentiModelSearch(id, naziv, adresa, grad, posBr, drzava, telefon, fax, mail, mobitel, oib, ugovor, osoba);
        klijentiSearchModel.add(klijentSearch);
    }

    result.close();
    selectStmt.close();

}
private String returnNullIfEmptys(String value) {
    if (value == null || value.length() == 0) {
        return null;
    }
    return value;
}

3
如果您的变量是存储在列表或数组中而不是单独命名的,您可以使用循环完成所有操作。或者,您可以编写一个名为“nullIfEmpty”的方法,然后编写“nazivK = nullIfEmpty(nazivK);”等代码。 - khelwood
1
顺便说一句:这样的代码是糟糕设计的症状。不要只看这段代码;退后一步,让更有经验的人审查你项目中的更多内容。你展示的东西肯定只是冰山一角;-) - GhostCat
快速问题,通过将空字符串设置为null,您想实现什么? - user902383
将空字符串设置为null并不是正确的做法,因为你构建SQL语句的方式不对。你需要逐个构建SQL语句子句,但只有在相应的字符串不为空时才添加每个子句。此外,使用PreparedStatement,这样就不会出现SQL注入问题。 - Dawood ibn Kareem
@user902383,我有一个搜索客户的表单,如果某个文本字段为空,我不想在数据库中搜索空字段。也就是说,在搜索表单中必须输入一些文本。 - Hrvoje
显示剩余4条评论
4个回答

4

根据你的实际代码,@khelwood在评论问题中提出的建议是最佳方法。
其他解决方案会增加额外的开销,并改变你的设计,但并没有带来附加值。

public static String returnNullIfEmpty(String value){
   if (value == null || value.length() == 0){
      return null;
   }
     return value;
}

那么您可以这样调用它:
nazivK = returnNullIfEmpty(nazivK);
adresaK= returnNullIfEmpty(adresaK);

编辑

根据您问题的修改,您可以将处理过程包括在从klijentiFormEvent对象检索值的时间内:

String nazivK =  returnNullIfEmpty(klijentiFormEvent.getNaziv());
String adresaK = returnNullIfEmpty(klijentiFormEvent.getAdresa());
...

在我的方法声明 "public void searchKlijenta(KlijentiFormEvent klijentiFormEvent)" 中,klijentiFormEvent 是来自我的字段(String naziv = nazivField.getText()..)的数据,所以你的代码不能实现我想要的功能。检查语句必须在 SQL 语句之前进行。如果 if 语句运行,则 null 必须在 SQL 语句中。我有一个用于搜索客户的表单,如果某个文本字段为空,我不想在数据库中搜索空字段,即搜索表单中必须输入一些文本。 - Hrvoje
是的,现在可以了,谢谢。 我有一个问题,哪个更好?
  1. 您调用方法的解决方案:telefonK = returnNullIfEmptys(telefonK); 还是
  2. nazivK = (nazivK.length() == 0) ? null : nazivK;
- Hrvoje
第一个更好,因为你不会重复逻辑。如果你必须改变它,你只需要在一个地方做就可以了。此外,在第二个解决方案中,你重复了3次nazivK变量。这意味着当你添加一个新的控件时,你必须复制粘贴一个现有的指令并三次更改变量名。这更容易出错。 - davidxxx

0

你只需要将你的数组/列表...无论那些东西是什么...放入另一个数组或列表中。

然后你遍历这个数组/列表。

完成了。

提示:你的命名可以大幅度改进。你的名称应该表明变量背后的"东西"实际上是什么。


0

你也可以使用 Map<String, List<?>> 来存储你的列表/数组/字符串。例如,使用 List

    Map<String, List<?>> map = new HashMap<>();
    map.put("nazivK", new ArrayList<>());
    map.put("adresaK", new ArrayList<>());
    //.....
    //replace all lists with null
    map.replaceAll((s, list) -> list.isEmpty() ? null : list);

    //or just remove it
    for(Iterator<Map.Entry<String, List<?>>> it = map.entrySet().iterator(); it.hasNext(); ) {
        Map.Entry<String, List<?>> entry = it.next();
        if(entry.getValue().isEmpty()) {
            it.remove();
        }
    }

0

正如GhostCat所建议的那样,将您的值放入数组/列表中。您可以像这样做(我假设这些值是字符串):

/* Order in array nazivK, adresaK, gradK, drzavaK, telefonK,
   faxK, mailK, mobitelK, oibK, ugovorK, osobaK */
   String values[] = new String[11];
   for (String val: values) {
       if (val == null || val.length() == 0) {
           val = null;
       }
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接