[Java] Database klasse

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

voor een project moet ik een database class maken, een klasse die verschillende methoden bevat die op hun beurt verschillende queries uitvoeren.
Voor het verbinden met de database is flink wat code nodig: username, password, try-catch blok etc.
Als ik dit bij elke methode moet doen zal dit de kwaliteit van de code niet verbeteren.

Nu is mijn vraag: is het mogelijk om een connect-methode te maken, zodat je die bij elke 'query-methode' enkel hoeft aan te roepen om te verbinden.

Ik heb het zelf al eens geprobeerd maar dan kom ik in de knoop met de variabelen (die niet gevonden kunnen worden) zoals:
Statement stat = conn.createStatement();

Bij voorbaat dank.

Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 16-09 23:49
Volgens mij moet het mogelijk zijn om methodes te draaien zonder daarvoor eerst een object te moeten maken, misschien op die manier.
En op welke manier wil je gebruik maken van een database? Sla er desnoods even de Java documentatie op na.

[ Voor 3% gewijzigd door ShitHappens op 02-12-2009 19:36 ]


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 16-09 20:34
ShitHappens schreef op woensdag 02 december 2009 @ 19:34:
Volgens mij moet het mogelijk zijn om methodes te draaien zonder daarvoor eerst een object te moeten maken, misschien op die manier.
En op welke manier wil je gebruik maken van een database? Sla er desnoods even de Java documentatie op na.
Iets met static? DB classe gewoon 4 verschillende methodes maken. executeSelectQuery, executeUpdateQuery, executeDeleteQuery, executeInsertQuery. En natuurlijk je isOpen enz methodes. En daarnaast je component model en views gescheiden houden zodat er geen SQL in je views staan.

[ Voor 0% gewijzigd door xzaz op 02-12-2009 19:57 . Reden: edit: dat zijn er 4 ]

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu dit als database class:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.sql.*;

public class Database
{
    private static void maakVerbinding()
    {
        // Naam van de database
        String dbname = "testdb";
        // User & password, nu nog de default
        String user = "root";       
        String password = "admin";
        
        // Link naar de database en de driver
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/";
        url = url + dbname;
        Connection conn = null;
        Statement stat = conn.createStatement();

        try
        {
            // Verbinding met de database maken
            Class.forName(driver).newInstance();
                conn = DriverManager.getConnection(url,user,password);
        }
        catch(Exception e)
        {
                e.printStackTrace();
                System.out.println(e.toString());
        }
    }
}

Hoe kan ik het dan zo krijgen dat ik deze methode elke keer kan aanroepen en dat de variabelen (conn, stat) worden 'onthouden', dat ik die dus niet nog eens moet maken in elke methode.

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Zoek eens op private variables in Java.

Eerste hit op Google:
http://java.sun.com/docs/...ava/javaOO/variables.html

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
Hoe kan ik het dan zo krijgen dat ik deze methode elke keer kan aanroepen en dat de variabelen (conn, stat) worden 'onthouden', dat ik die dus niet nog eens moet maken in elke methode.
Je zou van de klasse Database een singleton kunnen maken.

Je zou ook eens kunnen kijken naar connections pooling. http://java.sun.com/devel...ming/JDCBook/conpool.html
Een implementatie is bijv. http://commons.apache.org/dbcp/.

Je zou ook eens kunnen kijken naar JPA. Hibernate, EclipseLink of Toplink bieden implementaties van JPA

[ Voor 18% gewijzigd door Cobalt op 02-12-2009 20:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus als ik 2 private variabelen maak dan zou het in principe moeten lukken?

Zoals dit:

public class Database
{
private Statement stat;
private Connection conn;

public static void maakVerbinding()
{
...
}
}

Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
Ja, zolang de instantie van de klasse Database blijft bestaan. Als de instantie weg is en je een nieuwe instantie maakt van Database dan moet je opnieuw die connectie maken daarom zou ja naar een singleton pattern moeten kijken of Connection conn static moeten maken.

[ Voor 27% gewijzigd door Cobalt op 02-12-2009 20:31 ]


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 16-09 20:34
Verwijderd schreef op woensdag 02 december 2009 @ 20:26:
Dus als ik 2 private variabelen maak dan zou het in principe moeten lukken?

Zoals dit:

public class Database
{
private Statement stat;
private Connection conn;

public static void maakVerbinding()
{
...
}
}
Lees je eerst eens in wat bijvoorbeeld static, private, public doen. Je wilt dat de verbinding die je aanmaakt "Conn" een attribute is van de classe, dus zal ik hem statisch maken. Daarnaast heb je hem alleen nodig binnen je classe en zal je hem daarbuiten niet gebruiken (mag ik hopen) dus private.

Dus: private static Connection conn;

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • vbmot
  • Registratie: April 2003
  • Laatst online: 28-07 08:44
Ik denk dat je het beste een nieuwe Connection kunt laten returnen door de maakVerbinding() method. Vanuit je query methods roep je simpelweg de maakVerbinding() aan en vervolgens kun je op basis van de returned connection je database acties uitvoeren. Vergeet niet om je Connection instances netjes te closen als je ermee klaar bent.

Houd wel in gedachten dat dit een suboptimale methode is en je liefst werkt met een pool van connections, maar dat is optimalisatie.

Ook maar dat ik dat weet!


Acties:
  • 0 Henk 'm!

  • vbmot
  • Registratie: April 2003
  • Laatst online: 28-07 08:44
Cobalt schreef op woensdag 02 december 2009 @ 20:23:
[...]


Je zou van de klasse Database een singleton kunnen maken.

Je zou ook eens kunnen kijken naar connections pooling. http://java.sun.com/devel...ming/JDCBook/conpool.html
Een implementatie is bijv. http://commons.apache.org/dbcp/.

Je zou ook eens kunnen kijken naar JPA. Hibernate, EclipseLink of Toplink bieden implementaties van JPA
Als je Database z'n eigen connections laat managen (dus naief telkens opnieuw maken of pooling gebruiken) kun je er inderdaad het beste een singleton van maken. Als Database maar een Connection heeft zal het niet goed gaan als je die 'tegelijkertijd' wil gaan gebruiken.

Ook maar dat ik dat weet!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, ik ben nu aardig opgeschoten. Ik heb zoals xzaz zei de attributen private static gemaakt, zo dus:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.sql.*;
import java.sql.Driver;

public class Database
{
    private static Statement stat;
    private static Connection conn;
    private static ResultSet result;


    // Deze methode maakt de connectie met de database
    private static void maakVerbinding()
    {
        String dbname = "testdb";
        String user = "root";       
        String password = "admin";
        
        // Link naar de database en de driver
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/";
        url = url + dbname;
        Connection conn = null;
    
        try
        {
            Statement stat = conn.createStatement();
            Class.forName(driver).newInstance();
                conn = DriverManager.getConnection(url,user,password);
        }
        catch(Exception e)
        {
                e.printStackTrace();
                System.out.println(e.toString());
        }
    }

    public static boolean Test(int i, int k)
    {
        try
        {       
            maakVerbinding();
            String query = "SELECT userid, username FROM Gebruikers";
            result = stat.executeQuery(query);

            while (result.next())
            {
                System.out.print(result.getString("userid") + " " + result.getString("username");
                System.out.println();
            }
            return true;
        }
        catch(SQLException exception)
        {
            return false;
        }
    }
}


Ik loop nu wel weer tegen een probleem aan. Ik heb zojuist een nieuwe methode gemaakt en hij geeft een NullPointException of de regels:

Statement stat = conn.createStatement();
maakVerbinding();
result = stat.executeQuery(query);

Wat doe ik hier fout?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Gebruik eens de [ code=java ] tag, dit is niet te lezen.

Acties:
  • 0 Henk 'm!

  • Tubby
  • Registratie: Juni 2001
  • Laatst online: 23:42

Tubby

or not to be

xzaz had het over private variabelen en een paar static methode's, dat zou in de buurt komen van een bruikbare class, mocht je dit werkend krijgt heb je iig een single threaded applicatie.

wat jij in grote lijnen wilt (of zou moeten willen) is het DAO design pattern
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Verder kun je je connections beter laten managen door een connection pooling package.

tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN


Acties:
  • 0 Henk 'm!

  • C.J.V.
  • Registratie: Februari 2009
  • Laatst online: 21-07 10:35
op het moment dat je stat een waarde wilt toekennen dmv conn heeft conn nog de waarde null.
volgens mij is het voldoende om regel 28 bovenin je try scope te zetten...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
C.J.V. schreef op woensdag 02 december 2009 @ 21:50:
op het moment dat je stat een waarde wilt toekennen dmv conn heeft conn nog de waarde null.
volgens mij is het voldoende om regel 28 bovenin je try scope te zetten...
Ik heb die regel helemaal bovenaan de try-blok gezet en ik kreeg inderdaad een aantal meldingen minder.
De melding die blijft is nog steeds de NullPointException bij
Java:
1
result = stat.executeQuery(query);

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op woensdag 02 december 2009 @ 21:59:
[...]


Ik heb die regel helemaal bovenaan de try-blok gezet en ik kreeg inderdaad een aantal meldingen minder.
De melding die blijft is nog steeds de NullPointException bij
Java:
1
result = stat.executeQuery(query);
Logisch, want de stat in maakVerbinding() zit in een andere scope dan je stat op regel 6.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Als je trouwens in zo'n klein stukje code al zo veel fouten maakt (en je doet nog meer gekke dingen overigens), dan vraag ik me serieus af waarvoor je dit aan het maken bent. Is het een opdracht voor school? Vind je het gewoon leuk? Wat is het doel?

Als het voor school is: lees eerst je boek en ga daarna pas dingen maken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geloof het of niet, ik doe een universitaire opleiding.
Maar ik ben me er volledig van bewust dat ik veel fouten maak, dus ik denk ook dat ik maar beter eerst de boeken in moet duiken.

Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Regel 26 geeft een null pointer omdat regel 22.
Kijk eens wat je op regel 22 doet.

edit:
Ik loop weer eens achter de feiten aan.
Kijk inderdaad ook eens waar je alle variabelen aanmaakt.

[ Voor 39% gewijzigd door Jegorex op 03-12-2009 00:33 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op woensdag 02 december 2009 @ 22:37:
Geloof het of niet, ik doe een universitaire opleiding.
Maar ik ben me er volledig van bewust dat ik veel fouten maak, dus ik denk ook dat ik maar beter eerst de boeken in moet duiken.
Ow, dat geloof ik best hoor. Ik zie hier ook genoeg studenten dit soort dingen doen.

Maar als je het boek leest, dan weet ik zeker dat je al veel verder komt. Verder kan ik je aanraden geen dingen te doen waarvan je niet snapt wat ze doen. Waarom heb je overal het woord static staan, snap je wat het doet? Waarom heb je import java.sql.* én import java.sql.Driver? Waarom heb je bovenaan in je klasse een Connection, Statement en ResultSet, maar maak je in de methode maakVerbinding() nieuwe aan met exact dezelfde naam? Waarom is er wel een maakVerbinding(), maar geen sluitVerbinding()?

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Verwijderd schreef op woensdag 02 december 2009 @ 22:37:
Geloof het of niet, ik doe een universitaire opleiding.
Maar ik ben me er volledig van bewust dat ik veel fouten maak, dus ik denk ook dat ik maar beter eerst de boeken in moet duiken.
Het is heel belangrijk eerst de basis van object-georienteerd programmeren te begrijpen voordat je met 'moeilijke' zaken als databaseconnecties begint. De meeste uni's geven je wel de mogelijkheid een Java cursus bij een HBO instelling te doen (of besteden het uit als 'vak') waar je over 't algemeen eerst de basis onder de knie krijgt.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Sowieso moet je erop letten dat je je databaseverbindingen ook weer afsluit aan het einde van je query. Dus:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void myMethod() {
  Connection conn;
  Statement state;
  ResultSet rs;

  try {
    conn = getConnection();
    state = conn.createStatement();
    rs = state.executeQuery("SELECT * FROM pietjePuk");
    // doe iets met RS.
  } catch (SQLException e) {
     // log de exception
  } finally {
     // altijd je connection sluiten, zelfs bij exceptions, anders raakt je connection pool leeg.
     if (rs != null) rs.close();
     if (state != null) state.close();
     if (conn != null) conn.close();
  }
}


Da's een beetje de standaard JDBC 'verbinding -> query -> afsluiten' blok.

Maar als ik jou was zou ik eerst even OO programmeren 101 doen. Leg System.out.println() bijvoorbeeld eens uit - wat is System, wat is out (en van welk type), wat doet println, noem ze maar op.

En dan de rest. Static? Private? Public? Protected? Scope? Member variable? Method? Try/catch/finally?

Pak boek, open pagina 1, lees. Volg alle voorbeelden, en ga dan pas bezig met databases. En dan de basiscursussen en tutorials databases en Java volgen, en beter nog, begrijpen.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
De connectie openen en sluiten voor elke query? Dat lijkt me niet handig. Gewoon aan het begin openen, dan één of meerdere queries uitvoeren en helemaal aan het einde pas sluiten.

Het opzetten en sluiten van een connectie is best "kostbaar", dat doe je niet per query.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

HuHu schreef op donderdag 03 december 2009 @ 13:23:
De connectie openen en sluiten voor elke query? Dat lijkt me niet handig. Gewoon aan het begin openen, dan één of meerdere queries uitvoeren en helemaal aan het einde pas sluiten.

Het opzetten en sluiten van een connectie is best "kostbaar", dat doe je niet per query.
Je wilt de verantwoordelijkheid voor de connection zo veel mogelijk in je data laag houden. Wanneer je het openen en sluiten zelf in je service laag moet gaan bijhouden maak je je software alleen maar ingewikkelder. Het is handiger om connectionpooling te gebruiken

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Hydra schreef op donderdag 03 december 2009 @ 12:01:
[...]


Het is heel belangrijk eerst de basis van object-georienteerd programmeren te begrijpen voordat je met 'moeilijke' zaken als databaseconnecties begint. De meeste uni's geven je wel de mogelijkheid een Java cursus bij een HBO instelling te doen (of besteden het uit als 'vak') waar je over 't algemeen eerst de basis onder de knie krijgt.
QFT. Lees (en begrijp!) eerst nog eens grondig je OOP cursus door, dat gaat je heel wat werk besparen ;)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
YopY schreef op donderdag 03 december 2009 @ 13:12:
Maar als ik jou was zou ik eerst even OO programmeren 101 doen. Leg System.out.println() bijvoorbeeld eens uit - wat is System, wat is out (en van welk type), wat doet println, noem ze maar op.
Beetje slecht voorbeeld, System.out is natuurlijk zo on-OO als het maar kan ;)

https://niels.nu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar is het mogelijk om de code zoals ik eerder had gepost werkend te krijgen?
Ik heb naar Connection pooling gekeken, maar dat lijkt mij op dit moment te moeilijk.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 03 december 2009 @ 18:10:
Maar is het mogelijk om de code zoals ik eerder had gepost werkend te krijgen?
Vast wel. Heb je zelf al iets geprobeerd te veranderen aan die code om het werkend te krijgen naar aanleiding van de reacties hier? We gaan het in elk geval niet even snel voor je fixen; voor snelle kant en klare oplossingen kun je beter naar de afhaalchinees gaan. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1