Avatar billede Jonas Nybegynder
06. oktober 2011 - 22:24 Der er 10 kommentarer og
1 løsning

Begynder: tilslut til JDBC

Hejsa

Jeg sidder og leger lidt med javabog.dks jdbc kapitel...
Jeg kan godt lide ideen om at splitte sin database conn ud i en klasse og så oprette en klasse til hver af sine tabeller. Jeg har prøvet med at oprette følgende klasser:

dbConn
Test
Hent

Fra dbConn har jeg fået forbindelsen til databasen til at virke - det testede jeg ved at prøve en simpel "opret tabel" query. Nu forsøger jeg så at gøre klar til at kalde den fra "Hent"-klassen. Min metode til det i dbConn ser således ud:

    public void test101(Test t) {
        try {
            stmt.executeUpdate("insert into test (id,symbol) values(" + t.i +",'" + t.symbol +"')");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Min Test klasse ser således ud:


public class Test {
    String symbol;
    int i;
   
    public Test(int i2, String s) {
        symbol = s;
        i = i2;
    }

}


Og min metode i Hent klassen ser således ud:

                String symbol = "kegle";
                Random r = new Random();
                int n = 1000;
                int i = r.nextInt(n);
                System.out.println(i);
                dbf.test101( new Test(i, symbol) );
                System.out.println(i + symbol);

Men når jeg forsøger at køre den får jeg en nullPointerException... Er der en der kan se hvorfor? Jeg kan simpelthen ikke gennemskue det :)

Jeg tænker det er et rookie problem;)
Avatar billede arne_v Ekspert
06. oktober 2011 - 23:49 #1
Hvilken linie giver NullPointerException?

Hvis det er:

stmt.executeUpdate("insert into test (id,symbol) values(" + t.i +",'" + t.symbol +"')");

saa er det nok stmt som er null, fordi paa en eller anden maade er det ikke samme stmt som du har lavet.
Avatar billede arne_v Ekspert
06. oktober 2011 - 23:49 #2
Hvis du poster hele koden er det nemmere at sige praecist.
Avatar billede Jonas Nybegynder
07. oktober 2011 - 09:08 #3
Hej Arne,

Jeg tror faktisk måske godt du kan have ret - Eclipse siger, at jeg i min dbConn() klasse (hvad kalder man den?) ikke benytter stmt variablen til noget... Og det er jo løgn, da jeg bruger den i metoden længere nede, så måske har jeg deklareret den forkert? - jeg postede ikke hele koden, fordi jeg tænkte det var uoverskueligt :) Men her kommer min dbConn klasse:

import java.sql.*;

public class dbConn{
        private Statement stmt;
       
        public dbConn() {
                try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test102","root","password");
            Statement stmt = conn.createStatement();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InstantiationException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }


public void test101(Test t) {
                try {
                        stmt.executeUpdate("insert into test (id,symbol) values(" + t.i +",'" + t.symbol +"')");
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }
       
}
Avatar billede arne_v Ekspert
07. oktober 2011 - 16:29 #4
public class dbConn{
        private Statement stmt; // <---- her opretter du en instans variabel ved navn smtmt
     
        public dbConn() {
                try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test102","root","password");
            Statement stmt = conn.createStatement(); // <---- her opretter du en lokal variabel med samme navn, men den har intet med den anden stmt at goere!!
Avatar billede arne_v Ekspert
07. oktober 2011 - 16:29 #5
Saa:

public class dbConn{
        private Statement stmt;
     
        public dbConn() {
                try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test102","root","password");
            stmt = conn.createStatement();
Avatar billede arne_v Ekspert
07. oktober 2011 - 16:30 #6
Jeg er ioevrigt ikke helt glad for konstruktionen hvor connection ogsaa er en lokal variabel.
Avatar billede Jonas Nybegynder
07. oktober 2011 - 17:51 #7
Ahhhhr. Så jeg har simpelthen deklareret variablen to gange... Dumt!!:)

Hvorfor er du ikke glad for at connection er en lokal variabel? Jeg har lært det i javabog.dk kapitel 16 eksemplet....

Jeg tester det i morgen tidlig - men smid et svar så jeg kan give dig point! Tak for hjælpen med skarpt øje!!
Avatar billede arne_v Ekspert
07. oktober 2011 - 18:02 #8
Hvordan faar du closet den connection naar du ikke har en ref til den?

Og det er slemt ikke at close sine database connections!
Avatar billede arne_v Ekspert
07. oktober 2011 - 18:02 #9
og et svar
Avatar billede Jonas Nybegynder
07. oktober 2011 - 19:20 #10
Ehhhrm.... Det ved jeg sgu ikke liiiige....:) Hvordan gør man det normalt? Hvad ville du gøre?
Avatar billede Jonas Nybegynder
08. oktober 2011 - 10:32 #11
Så fik du point :) Jeg har nu forsøgt at lukke mine connections efter hvergang jeg kører programmet. Jeg opretter et nyt spørgsmål til at spørge om den mest optimale løsning på mit åben/lukke connections :)

http://www.eksperten.dk/spm/948830
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester