Как игнорировать нулевые значения? - PullRequest
0 голосов
/ 23 декабря 2019

В моей базе данных я получил 4 поля данных, у меня также есть метод (getWalletName), где я отправляю SQL-запрос, чтобы получить только один фрагмент данных из 4, но после получения и отображения результата. Я могу видеть другие данные рядом с желаемым, который я хочу, вот так:

SELECT Name FROM wallets WHERE Location ='ROOME' ;

[unknown,unknown,unknown,Omar]

Где я хочу, чтобы это отображалось так [Omar], имейте в виду, чтобы не изменять мои конструкторы, потому что они нужны мне длябыть таким. Я пробовал код в wallet классе ниже, но не работал! Любая помощь будет высоко ценится

класс кошелька:

public class wallet {
private String Name;
private String Location;
private String Tag;
private String Reader;


public wallet(String Name , String Location, String Tag, String Reader)
{       
    this.Name = Name;
    this.Location = Location;
    this.Tag = Tag; 
    this.Reader = Reader;   

}


public wallet(String Reader)
{       
    this.Reader = Reader;
    this.Name = "unknown";
    this.Location = "unknown";
    this.Tag = "unknown";   
}

public wallet(String Location,String Tag) {
    this.Location = Location;
    this.Tag = Tag;
}

public String getWalletName()
{
    return Name;
}
public void setWalletName(String Name)
{
    this.Name = Name;
}

public String getWalletLocation()
{
    return Location;
}
public void setWalletLocation(String Location)
{
    this.Location = Location;
}

public String getWalletTag()
{
    return Tag;
}
public void setWalletTag(String Tag)
{
    this.Tag = Tag;
}


@Override
public String toString()
{
     StringBuilder sb = new StringBuilder();

        if(Objects.nonNull(this.Name)) {
            sb.append(this.Name+",");
        }
        if(Objects.nonNull(this.Location)) {
            sb.append(this.Location+",");
        }
        if(Objects.nonNull(this.Tag)) {
            sb.append(this.Tag+",");
        }
        if(Objects.nonNull(this.Reader)) {
            sb.append(this.Reader);
        }

        return sb.toString();
}   

}

Метод getWalletName:

public ArrayList<wallet> getWalletName(String Location) throws SQLException {
    System.out.println("----------------");
    System.out.println("Retrieve the wallet name");

    //Connection dbConnection = null;
    //Statement statement = null;
    ResultSet resultset = null;     
    String query = "SELECT Name FROM wallets WHERE Location ='" + Location + "' ;";
    ArrayList<wallet> WalletsList = new ArrayList<>();      
    try {
        getConnection();
        //statement = dbConnection.createStatement();
        System.out.println(query);
        resultset = stmt.executeQuery(query);

        while (resultset.next()) {

            String Name =  resultset.getString("Name");
            WalletsList.add(new wallet (Name));
        }
    } 
    finally {

    //  closeConnection();

        if (resultset !=null){
            resultset.close();
        }
        if (stmt !=null) {
            stmt.close();
        }

        if (resultset !=null) {
            closeConnection();
        }
    }
    return WalletsList;

}

Ответы [ 3 ]

0 голосов
/ 23 декабря 2019

Если вы не хотите менять конструктор, используйте только один способ:

class wallet {
    private String Name;
    private String Location;
    private String Tag;
    private String Reader;


    public wallet(String Name, String Location, String Tag, String Reader) {
        this.Name = Name;
        this.Location = Location;
        this.Tag = Tag;
        this.Reader = Reader;

    }


    public wallet(String Reader) {
        this.Reader = Reader;
        this.Name = "unknown";
        this.Location = "unknown";
        this.Tag = "unknown";
    }

    public wallet(String Location, String Tag) {
        this.Location = Location;
        this.Tag = Tag;
    }

    public String getWalletName() {
        return Name;
    }

    public void setWalletName(String Name) {
        this.Name = Name;
    }

    public String getWalletLocation() {
        return Location;
    }

    public void setWalletLocation(String Location) {
        this.Location = Location;
    }

    public String getWalletTag() {
        return Tag;
    }

    public void setWalletTag(String Tag) {
        this.Tag = Tag;
    }


    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        if (isPrintableValue(this.Name)) {
            sb.append(this.Name + ",");
        }
        if (isPrintableValue(this.Location)) {
            sb.append(this.Location + ",");
        }
        if (isPrintableValue(this.Tag)) {
            sb.append(this.Tag + ",");
        }
        if (isPrintableValue(this.Reader)) {
            sb.append(this.Reader);
        }

        return sb.toString();
    }

    protected boolean isPrintableValue(String value) {
        return (value != null && !value.equals("unknown"));
    }
}

public class Test {

    public static void main(String[] args) {
        wallet wallet = new wallet("Omar");
        System.out.println(wallet);
    }
}

Ouput:

Omar
0 голосов
/ 24 декабря 2019

Я предлагаю альтернативную версию для toString() для класса кошелька, возможно, более компактную:

public String toString() {
    StringBuilder sb = new StringBuilder();

    sb.append("[");
    sb.append(checkValue(this.Name,","));
    sb.append(checkValue(this.Location,","));
    sb.append(checkValue(this.Tag,","));
    sb.append(checkValue(this.Reader,""));
    sb.append("]");

    return sb.toString();
}

protected String checkValue(String value, String separator) {
    return (value != null && !value.equals("unknown")) ? (value+separator) : "";
}

Более того, сначала я предлагаю использовать CamelCase для записи имен методов, переменных, классов, пакетов и констант. : это стандартная запись (вы не обязаны, она работает так же, но это более понятно для сообщества разработчиков). Поэтому было бы лучше, если бы каждое слово или аббревиатура начиналось с заглавной буквы или первого слова со строчной буквы, а все оставалось с заглавной буквы. Во-вторых, я предлагаю пользователю PreparedStatement вместо простого Statement, потому что это предпочтительнее по соображениям безопасности: динамическое построение Statement уязвимо для внедрения SQL-кода (а с помощью PreparedStatement вы можете избежать синтаксических ошибок, возникающих при цитировании значений в предикатах).

Таким образом, вместо:

String query = "SELECT Name FROM wallets WHERE Location ='" + Location + "' ;";

Вы можете попытаться использовать:

String query = "SELECT Name FROM wallets WHERE Location = ? ";

вместе с чем-то вроде (при условии, что conn это ваше соединение с БД):

try {
    String query = "SELECT Name FROM wallets WHERE Location = ? ";
    try (PreparedStatement stmt = conn.prepareStatement(query); ResultSet resultset = stmt.executeQuery(query)) {
        while (resultset.next()) {
            String Name = resultset.getString("Name");
            WalletsList.add(new wallet(Name));
        }
    }
} catch (SQLException sQLException) {
    sQLException.printStackTrace();
}

Обратите внимание, что я использовал синтаксис try-with-resource, чтобы избежать проблем с закрытием результирующего набора и операторов (т. Е. Предложение finally с resultset.close (), stament.close () и т. Д., Которое является многословным, а иногда иможет привести к некоторым ошибкам кодирования, если не будет правильно встречаться).

Лучше всего это будет

0 голосов
/ 23 декабря 2019

Поместите это ниже String Name = resultset.getString("Name");, это должно сделать

If resultset.getString("Name") != null {
    WalletsList.add(new wallet (Name));
}
...