SQL-Datenbankabfrage in ArrayList speichern java?
Ich habe eine Datenbank mit 4 Eigenschaften (username,passwd,usrid,blocked). Die Datenbank heißt jolas und die tabelle jolas_user. nun möchte ich aller blockierten nutzer username in eine arraylist speichern. (blockiert ist eine 1 in blocked). Nun versuche ich es hiermit
public ArrayList<String> banned_user()
{
ArrayList <String> banned = new ArrayList<String>();
try {
String query = "select username from jolas_user where blocked = '"+1+"'";
rs = st.executeQuery(query);
for (int i = 1; i == maxusrID(); i++) {
username = rs.getString("username");
banned.add(i,username);
}
}catch (Exception ex){
System.out.println(ex);
}
return banned;
}
Nur mein Problem ist, dass nichts rauskommt und nichts abgespeichert wird. Das ganze ist mit jdbc gemacht. Kann mir einer helfen bitte...
4 Antworten
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;
}
Das war nur nen Beispiel wie es gehen kann musst das natürlich noch anpassen.
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.
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ß
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...
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ß
Was die List angeht solltest Du auch einfach das hier nutzen:
banned.add(username);
Mit dem Index ist einfach Unsinn ;)
Gruß
ja schon, die datenbank könnte man ja auch so exportieren
stimmt. nur keine ahnung wie es sonst machen soll
Ohne Debugger ist einfach nervig. Ansonsten sind Integration-Tests auch nicht schlecht.
ja gut integrationstest soweit muss ich nicht gehen. es ist nur ein kleines/großes projekt für die oberstufe
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?
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
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. 🙈
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?
Das du versuchst, die Liste irgendwo auszugeben, nicht deren Elemente.
da kommt eine nullpointer exception