Java: hämta mysql data till en array och returnera den

Permalänk
Medlem

Java: hämta mysql data till en array och returnera den

Har kört fast en aning i mitt försök att hämta data från en Mysql databas till en array och sedan returnera den. Koden ser ut som nedan:

public Array getRows(String query) { try { s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = s.executeQuery(query); while(rs.next()) { rows[] = rs.getArray("text"); } } catch (Exception e) { System.err.println ("Error:" + e); } return rows; }

På raden: Array rows[] = rs.getArray("text");
Så får jag felet: "Type mismatch: cannot convert from Array to Array[]"

Jag förstår att jag inte har skapat min Array på rätt sätt, men jag förstår inte hur jag ska göra.

Hur ska jag göra för att lösa detta?
Jag vill alltså ha allt som finns i kolumnen "text" i min tabell till en array så jag kan printa ut den.

Permalänk
Medlem

int pos=0; while(rs.next()) { rows[pos] = rs.getString("text"); pos++ }

är det så du menar kanske?

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk
Medlem

Jasså, man måste ange ett id nummer för varje pryl man stoppar i Arrayen? Jag trodde man bara kunde göra som jag gjort, och sen fyller den på eftersom och ger första värdet id 0, nästa id 1 osv.

Permalänk
Medlem

använd arraylist ist? är enklare att arbeta med.

Visa signatur

P[a]cman äter spöken så ofta han kan.

citera mig, annars är risken överhängande att jag inte hittar tillbaka.

Permalänk
Medlem

Det fungerade inte. Får felmeddelande på raden som plockar hem raderna från databasen: "Type mismatch: cannot convert from String to ArrayList<String>".
Hittar inget om detta i dokumentationen.

Koden:

public ArrayList<String> getRows(String query) { try { s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = s.executeQuery(query); ArrayList<String> rows = new ArrayList<String>(); while(rs.next()) { rows = rs.getString("text"); } } catch (Exception e) { System.err.println ("Error:" + e); } return rows; }

Någon som har tips på hur man ska lösa det? Och hur returnerar jag en ArrayList?
För på min return får jag för tillfället felet: "rows cannot be resolved".

Permalänk
Medlem

rows.add(rs.getString("text"));

Så ska det se ut, man lägger in saker i ArrayListen

http://java.sun.com/javase/6/docs/api/java/util/ArrayList.htm...

Visa signatur

Modermodem från ONOFF och bildskärmsutrustning från Electrolux. US Robotics 28.8K telefonuppringd internetförbindelse. Har en förkärlek för tysk tjejpop.

Permalänk

Precis, du kan inte skapa en ArrayList och säga att ArrayListen = en sträng

Visa signatur

UNIX/Programmering.

Permalänk
Medlem

Jepp, jag såg det sen.

Dock kvarstår problemet att jag inte kan returnera min ArrayList.
Samma fel som ovan, cannot convert from String to ArrayList<String>.

Antar att det ska heta något annat det med som jag inte hittar i manualen?

Kod

public ArrayList<String> getRows(String query) { try { s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = s.executeQuery(query); ArrayList<String> rows = new ArrayList<String>(); while(rs.next()) { rows.add(rs.getString("text")); } } catch (Exception e) { System.err.println ("Error:" + e); } return rows; }

Permalänk
Hedersmedlem

Du skapar listan inne i try-blocket, men returnar utanför. Jag proggar inte Java själv, men jag skulle gissa att "rows" inte existerar utanför try-blocket. Flytta "ArrayList<String> rows = new ArrayList<String>();" till raden ovanför try och se.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Attans, det hade jag glömt... tack!
Nu fungerar allt, men jag får ett litet felmeddelande ändå på min loop som skriver ut resultatet.

Felmeddelande:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Eshop.main(Eshop.java:36)

Rad 36: System.out.println(result.get(i));

Någon som kan veta vad som menas med det? Jag hänvisar ju till ArrayListen "result", så det känns konstigt att den säger "Unknown Source" när jag dessutom får ut resultatet korrekt.

public static void main(String[] args) { ArrayList<String> result = new ArrayList<String>(); Conn conn = new Conn(); result = conn.getRows("SELECT * FROM test ORDER BY id"); for(int i=0; i <= result.size(); i++) { System.out.println(result.get(i)); } conn.close(); }

Permalänk

for(int i=0; i <= result.size(); i++)

Ta en titt på det där. Har du t.ex två element i arraylist så kommer .size() returnera 2, eller hur?

Men du försöker iterera över tre element, nämligen 0, 1 och 2.
Använd:

for(int i=0; i < result.size(); i++)

Edit: Visst skiljer sig väl fonterna inom de två code-taggarna mot varandra?

Permalänk
Medlem

När du använder dig av någon form av Collection, som t.ex. ArrayList eller Vector, så är det snyggaste och oftast det enklaste sättet att iterera igenom listan att använda en iterator:

import java.util.ArrayList; import java.util.Iterator; ... ArrayList<String> myList = new ArrayList<String>(); myList.add("Hello "); myList.add("World"); myList.add("!"); Iterator i = myList.iterator(); while(i.hasNext()) { System.out.println(i.next()); } ...

Så slipper du fula for-satser

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av @@mårten@@

for(int i=0; i <= result.size(); i++)

Ta en titt på det där. Har du t.ex två element i arraylist så kommer .size() returnera 2, eller hur?

Men du försöker iterera över tre element, nämligen 0, 1 och 2.
Använd:

for(int i=0; i < result.size(); i++)

Edit: Visst skiljer sig väl fonterna inom de två code-taggarna mot varandra?

Det löste det problemet.. och ja, fonterna skiljer sig visst. Skumt.

Men...

Citat:

Ursprungligen inskrivet av bjornie
När du använder dig av någon form av Collection, som t.ex. ArrayList eller Vector, så är det snyggaste och oftast det enklaste sättet att iterera igenom listan att använda en iterator:

import java.util.ArrayList; import java.util.Iterator; ... ArrayList<String> myList = new ArrayList<String>(); myList.add("Hello "); myList.add("World"); myList.add("!"); Iterator i = myList.iterator(); while(i.hasNext()) { System.out.println(i.next()); } ...

Så slipper du fula for-satser

... var ändå den snyggaste lösningen. Tack så mycket.

Väldigt imponerad över att det finns så många vettiga personer på Swec som verkligen vill hjälpa till istället för att skriva "RTFM". Visst hade jag hittat alla svar i API't, helt säkert. Men däremot så är det inte alltid så lätt att veta vad man ska leta efter.

Verkligen impad då det är första gången jag ställer programmeringsrelatrade frågor här.

Tack igen allihopa.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av bjornie
När du använder dig av någon form av Collection, som t.ex. ArrayList eller Vector, så är det snyggaste och oftast det enklaste sättet att iterera igenom listan att använda en iterator:

eller om man har java 5 eller senare kan man använda for eaach
snyggare tycker jag, och ett objekt mindre att behöva skapa i sin kod

ArrayList<String> myList = new ArrayList<String>(); myList.add("Hello "); myList.add("World"); myList.add("!"); for (String s : myList) { System.out.println(s); }

Visa signatur

P[a]cman äter spöken så ofta han kan.

citera mig, annars är risken överhängande att jag inte hittar tillbaka.

Permalänk
Medlem

Sweet.

Från en sak till en annan då, jag tycker det är onödigt att skapa en ny tråd.

Tänkte på när jag ska göra min layout nu, kommer väl gå åt hellskotta men man måste ju testa någon gång.
Har kollat över lite olika layouter och det som verkar passa bäst för mig är en Borderlayout, tror jag.

Men då till frågan. Jag antar att man kan ha andra slags layouter i en borderlayout? T.ex. i "panelen/fältet" till höger vill jag kanske ha en Grouplayout för att lägga upp t.ex. en sökfunktion eller så på ett snyggt sätt. Och i en mittersta "panelen/fältet" kanske en flowlayout?

Funkar det att ha det så? Ungefär som nästlade tabeller i HTML?

Permalänk
Medlem

japp!
layouten sätts ju på en pane till exempel och därför kommer det fungera som du skriver. likt flernivås-tabeller i html.

Visa signatur

P[a]cman äter spöken så ofta han kan.

citera mig, annars är risken överhängande att jag inte hittar tillbaka.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av pcman

eller om man har java 5 eller senare kan man använda for eaach
snyggare tycker jag, och ett objekt mindre att behöva skapa i sin kod

ArrayList<String> myList = new ArrayList<String>(); myList.add("Hello "); myList.add("World"); myList.add("!"); for (String s : myList) { System.out.println(s); }

Du skapar ju en String i loopen, så du skapar inte färre objekt. Jag vet inte heller hur instruktionerna för foreach-loopen fungerar, men i praktiken byts ju värdet på strängen i varje loop - det slipper du med en iterator. Jag hävdar fortfarande att en iterator är snyggaste lösningen

Permalänk
Medlem

tror att javas for each använder iterator under huven för de fungerar bara med collections som är iterable.

Visa signatur

P[a]cman äter spöken så ofta han kan.

citera mig, annars är risken överhängande att jag inte hittar tillbaka.

Permalänk
Medlem

ArrayList är långsammare (än en vanlig array) och behövs endast då man inte vet hur många objekt som behöver lagras. Dessutom så måste övriga klasser använda den då du returnerar den typen och tvingar således ner prestandan även fast det inte behövs.

För att lösa detta kan du göra:

public String[] getRows(String query) { ArrayList<String> rows = new ArrayList<String>(); //Kör sql-satsen, hämta resultat, stoppa in det i ArrayList:en return rows.toArray(); //Returnerar hela ArrayListen i form av en array av typen som specifierades vid instansieringen av ArrayList:en. I detta fall String. }

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

hur markant är prestandaförsämringen i och med en list i jämförelse med array?

Visa signatur

P[a]cman äter spöken så ofta han kan.

citera mig, annars är risken överhängande att jag inte hittar tillbaka.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Leedow
ArrayList är långsammare (än en vanlig array) och behövs endast då man inte vet hur många objekt som behöver lagras. Dessutom så måste övriga klasser använda den då du returnerar den typen och tvingar således ner prestandan även fast det inte behövs.

För att lösa detta kan du göra:

public String[] getRows(String query) { ArrayList<String> rows = new ArrayList<String>(); //Kör sql-satsen, hämta resultat, stoppa in det i ArrayList:en return rows.toArray(); //Returnerar hela ArrayListen i form av en array av typen som specifierades vid instansieringen av ArrayList:en. I detta fall String. }

Snälla någon, nu vet inte jag vad Sun garanterar för prestanda på just ArrayList, men dynamiska arrayer är generellt sett bara långsamma när du gör en insert, men ärligt talat är det inte riktigt relevant att säga att "x är snabbare än y, därför borde du använda x".

Anledningen till detta är givetvis att man inte skall lägga ned tid, eller offra flexibilitet och läsbarhet på att optimera där det inte behövs. Hur vet man då var det behövs? Enkelt, man profilerar sin kod, så man får reda på vad som tar lång tid! När man vet detta är det sedan enkelt att veta var man behöver optimera.

Just när det gäller att använda databaser skulle jag rekommendera att man använder Object-Relational Mapping. Det ger så mycket bättre kod. Till java har jag för mig att Hibernate är ganska bra.

Visa signatur

Mina boktips: Clean codeHead First Design PatternsHead First Object-oriented Analysis and Design
Innovation distinguishes between a leader and a follower. — Steve Jobs

Permalänk
Medlem

Väl formulerat, DrRotmos!

Hibernate fungerar väldigt bra med Java, ja. Annars är nya JPA väldigt intressant också med dess persistence-lösningar.