SQL-Datenbankabfrage in ArrayList speichern java?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Wenn musst du es mit next machen.

public ArrayList<String> banned_user()
    {
        ArrayList <String> banned = new ArrayList<String>();
Statement stmt = conn.createStatement();
               ResultSet bannednamesList = stmt.executeQuery("select username from jolas_user where blocked = '"+1+"'");
               try
               {
                   while (bannednamesList.next())
                   {
                       username = rs.getString("username");
                       banned.add(i,username);
                   }   
               }
 catch (Exception ex){
            System.out.println(ex);
        }
        return banned;
    }

Ich rate zum Einsatz von PreparedStatements.

List<String> banned = new ArrayList<>();
static final String SEL_BLOCKED_USERS = "SELECT username FROM jolas_user WHERE blocked = ?";

public void func() {
  Connection        cn = DriverManager.getConnection(<...>);
  PreparedStatement ps = cn.prepareSTatement(SEL_BLOCKED_USERS);
  ps.setBoolean(1, true);

  ResultSet rs = ps.executeQuery();
  int i = 0;
  while ( rs.next() )
    banned.add(++i, rs.getString("username");
}
 

Der EInfachheit halber habe ich die Fehlerbehandlung und das Schließen der Ressourcen mal weggelassen. Das solltest Du im Code selbstverständlich ergänzen.

Und bitte immer gegen das Interface implementieren, also List statt ArrayList verwenden.

Woher ich das weiß:Studium / Ausbildung

platofan23 
Beitragsersteller
 04.11.2018, 00:30

Danke, aber das ganze läuft mittlerweile schon ^^

0

Hallo platofan23,

so direkte Queries/connection im Code hab ich schon lange nicht mehr gesehen - alles Hibernate oder sonstiges Frameworks.

Zu deinem Problem,

1) hast Du mal mit nem Debugger reingeguckt? Das würde ich machen.

2) Wenn Du das Query außerhalb vom Code mal direkt auf der Datenbank absetzt, kommt da ein Resultat zurück?

3) i == maxusrID() sicher dass das stimmt? Ich würde eher i <= maxusrID() erwarten. Ich vermute deine for-Schleife wird nicht einmal durchlaufen

Punkt 3) ist übrigens ziemlich sicher das Problem. Punkt 1) mache ich bei den meisten Problemen. Mit nem Debugger findet man einfach sehr schnell solche Probleme.

Gruß


platofan23 
Beitragsersteller
 02.11.2018, 22:23

1 debugger ist schlecht, wenn es auf einem gemieteten server läuft

2 ja dann bekomm ich das was ich will

3 wenn ich das mit <= mache findet es die spalte nicht mehr...

0
AldoradoXYZ  02.11.2018, 22:26
@platofan23

Bei rechter Überlegung ist es auch unsinnig die MaxID zu nutzen. Du musst über alle Elemente des ResultSets laufen. Dafür kann man ja iterieren:

while (bannednamesList.next())

Wenn Du auf einem gemieteten Server entwickelst und deshalb nicht debuggen kannst, dann läuft was falsch. Lass den Code bei dir laufen und verbinde dich auf die externe DB. Geht das nicht? Dann mach dir ne Test-DB auf deinem System.

Ich kenne ja nicht die genauen Hintergründe, ob Hobby-Projekt oder beruflich. Im beruflichen Umfeld hättest Du sicherlich auch Integrationtests. Auf der anderen Seite würdest Du dann wohl nicht nacktes JDBC nutzen.

Aber egal wie, Du solltest dafür sorgen, dass Du ordentlich debuggen kannst, sonst macht das wirklich keinen Spaß.

Gruß

1
AldoradoXYZ  02.11.2018, 22:30
@AldoradoXYZ

Was die List angeht solltest Du auch einfach das hier nutzen:

banned.add(username);

Mit dem Index ist einfach Unsinn ;)

Gruß

1
platofan23 
Beitragsersteller
 02.11.2018, 23:07
@AldoradoXYZ

ja schon, die datenbank könnte man ja auch so exportieren

0
AldoradoXYZ  02.11.2018, 23:09
@platofan23

Ohne Debugger ist einfach nervig. Ansonsten sind Integration-Tests auch nicht schlecht.

1
platofan23 
Beitragsersteller
 02.11.2018, 23:11
@AldoradoXYZ

ja gut integrationstest soweit muss ich nicht gehen. es ist nur ein kleines/großes projekt für die oberstufe

0

1) Wozu ist hier die Konkatenation notwendig?

String query = "select username from jolas_user where blocked = '"+1+"'";

Der Wert 1 ist doch bereits konstant. Von daher ist

String query = "select username from jolas_user where blocked = '1'";

übersichtlicher.

2) Die Bedingung deiner Schleife wird vermutlich nicht zutreffen. Und wenn, gäbe es sicherlich nur einen Schleifendurchlauf. Überprüfe den Operator, den du in der Bedingung verwendest.

Was macht maxusrID wirklich bzw. was gibt die Methode zurück?

3) Die Variable banned ist doch eine Map? Wieso verwendest du da den Index als Key?


platofan23 
Beitragsersteller
 02.11.2018, 23:00

1) ja stimmt, dann ahbeich nicht gedacht

2) die methode soll eine arraylist mit den leuten geben wo in der spalte blocked eine 1 steht

3) die variable banned ist eine arraylist

0
regex9  02.11.2018, 23:07
@platofan23

2) Nein, ich meinte maxusrID. Doch wie dem auch sei, wie dir schon geraten wurde, solltest du über den gesamten ResultSet laufen.

3) Ah ja klar, das hätte ich sehen müssen. 🙈

1
platofan23 
Beitragsersteller
 02.11.2018, 23:18
@regex9

wenn ich das jetzt mit einer while schleife und mit next mache kommt bei mir noch das raus:

174240 java.util.ArrayList$Itr@2600f03c

174241 java.util.ArrayList$Itr@2600f03c

174242 java.util.ArrayList$Itr@2600f03c

174243 java.util.ArrayList$Itr@2600f03c

174244 java.util.ArrayList$Itr@2600f03c

174245 java.util.ArrayList$Itr@2600f03c

174246 java.util.ArrayList$Itr@2600f03c

174247 java.util.ArrayList$Itr@2600f03c

174248 java.util.ArrayList$Itr@2600f03c

174249 java.util.ArrayList$Itr@2600f03c

174250 java.util.ArrayList$Itr@2600f03c

174251 java.util.ArrayList$Itr@2600f03c

174252 java.util.ArrayList$Itr@2600f03c

174253 java.util.ArrayList$Itr@2600f03c

174254 java.util.ArrayList$Itr@2600f03c

174255 java.util.ArrayList$Itr@2600f03c

174256 java.util.ArrayList$Itr@2600f03c

174257 java.util.ArrayList$Itr@2600f03c

174258 java.util.ArrayList$Itr@2600f03c

174259 java.util.ArrayList$Itr@2600f03c

174260 java.util.ArrayList$Itr@2600f03c

174261 java.util.ArrayList$Itr@2600f03c

174262 java.util.ArrayList$Itr@2600f03c

174263 java.util.ArrayList$Itr@2600f03c

was bedeutet das?

0
regex9  02.11.2018, 23:20
@platofan23

Das du versuchst, die Liste irgendwo auszugeben, nicht deren Elemente.

1