Avatar billede c88 Nybegynder
03. september 2002 - 11:50 Der er 18 kommentarer

Embedded database

Hej Eksperten..

Jeg har nu i snart en uge læst om Java, databaser, JDBC, DBMS osv. men har ikke kunne få noget i praksis til at virke.

For det første aner jeg ikke hvilken database jeg skal vælge. PointBase virker okey, hvad er jeres erfaringer? Databasen skal bruges direkte sammen med én applikation - ingen server/klient - dvs. embedded?

Jeg har "Forte for Java 4" og det deri medfølgende PointBase, men har udfra hvad jeg har læst ikke været i stand til at få det til at fungere.

Det jeg ønsker er et meget lille simpelt eksempel på hvordan jeg opretter en database samt tabel, indsætter data og trækker det ud igen. Så simpelt som muligt således at jeg kan komme igang med at afprøve alle de mange ting jeg har læst om. Det kan godt være meget svært at forstå en programmerings-bog uden at kunne afprøve det. Derfor håber jeg at i kan hjælpe mig med dette.

I må bære over med mig da jeg er helt ny til Java, men jeg har dog en del erfaring inden for diverse scriptingssprog og har ofte arbejdet med relationsdatabaser.

På forhånd mange tak..
Avatar billede disky Nybegynder
03. september 2002 - 11:59 #1
Hejsa

Jeg ville personligt ikke bruge Pointbase, jeg bruger næsten altid MySQL som du kan finde på www.mysl.org inklusiv en JDBC driver så du kan snakke med den.

Jeg har lavet den database handler klasse så man kan snakke med basen:
download en jdbc driver, du kan finde en via www.mysql.com

og brug så denne klasse til at connecte,

import java.sql.*;

/**
*
* @author  srr
* @version
*/
public class dbHandler extends Object
{
   
    private Connection con=null;

    /** Creates new DataBase */
    public dbHandler()
    {
    }

    public boolean open(String dbDriverName, String dbClassName, String user, String pass)
    {           
//        System.out.println(\"************************************************************************\");
        try
        {
            if(con==null)
            {
                Class.forName(dbDriverName).newInstance();
                con = DriverManager.getConnection(dbClassName, user, pass);
//                System.out.println(\"con = \"+con);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (InstantiationException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        return true;
    }
   
    public void close()
    {
        if(con!=null)
        {
            try
            {
                con.close();
                con=null;
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
    }
   
    public int doUpdate(String sql)
    {
        if(con!=null)
        {
            try
            {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
//                System.out.println(\"SQL Update = \"+(System.currentTimeMillis()-time)+\" ms  \"+sql);
                return stat.executeUpdate(sql);       
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
        return 0;
    }

    public ResultSet doQuery(String sql)
    {
        if(con!=null)
        {
            try
            {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
//                System.out.println(\"SQL Update = \"+(System.currentTimeMillis()-time)+\" ms  \"+sql);
                return stat.executeQuery(sql);       
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
        return null;
    }
}





og denne klasse til at bruge den med


public class Database extends dbHandler
{
   
    /** Creates new Database */
    public Database()
    {
    }

    public boolean open()
    {
        return super.open(\"org.gjt.mm.mysql.Driver\",\"jdbc:mysql://SERVERNAME/DATABASENAVN\",\"USERNAME\",\"PASSWORD\");
    }
}

ret det med uppercase

Hvis du så vil hente navn og id ud fra en tabel der hedder 'venner' gør du f.eks. følgende:

Du har en klasse der hedder 'ven' som gemmer venners navn og id, og har get/set metoder til dem.

List venner=new ArrayList(); //her lander dine venner
Database db=new Database();
String query="select navn,id from venner";
db.open();
ResultSet res=db.doQuery(query);
while(res.hasNext())
{
  Ven ven=new ven();
  ven.setNavn(res.getString("navn"));
  ven.setID(res.getInt("id"));
  venner.add(ven); 
}
db.close();

**SLUT

Nu indeholder listen venner, et objekt af typen ven for hver post der var i tabellen 'venner' i databasen.

Hvis du har spørgsmål bare fyr løs :)

Jeg kan desværre ikke teste eksemplet, da jeg ikke har adgang til en MySQL database herfra :(
Avatar billede r9 Nybegynder
03. september 2002 - 11:59 #2
MySQL og java fungere perfekt.
Hent en jdbc driver til mySQL her: http://mmmysql.sourceforge.net/


Disky's velkendte Database handler virker perfekt til at åbne, indsætte og opdater databasen.

import java.sql.*;
import java.util.Vector;

public class DbHandler extends Object
{

    private Connection con=null;


    public DbHandler()
    {
    }

    public boolean open(String dbDriverName, String dbClassName, String user, String pass)
    {
        try
        {
            if(con==null)
            {
                Class.forName(dbDriverName).newInstance();
                con = DriverManager.getConnection(dbClassName, user, pass);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (InstantiationException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        return true;
    }

    public void close()
    {
        if(con!=null)
        {
            try
            {
                con.close();
                con=null;
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
    }

    public int doUpdate(String sql)
    {
        if(con!=null)
        {
            try
            {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
                System.out.println("SQL Update = "+(System.currentTimeMillis()-time)+" ms  "+sql);
                return stat.executeUpdate(sql);
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
        return 0;
    }



    public Vector doQuery(String sqlUdtryk) {
        ResultSet rs = null;
        Vector data = new Vector();
        try {
            Statement stmt = con.createStatement();
            rs = stmt.executeQuery(sqlUdtryk);
            ResultSetMetaData rsmd = rs.getMetaData();

            int numberOfColumns = rsmd.getColumnCount();

              while(rs.next()) {
                  if(numberOfColumns > 1) {
                    for(int i = 1; i <= numberOfColumns; i++) {
                        data.add(rs.getString(i));
                    }
                }
                  else {
                    data.add(rs.getString(1));
                }
            }
        } catch(SQLException e) {
        }
        return data;
    }
}
Avatar billede r9 Nybegynder
03. september 2002 - 12:00 #3
ups.

Jeg havde ikke lige set dit indslag Disky, sorry.
Avatar billede c88 Nybegynder
03. september 2002 - 12:56 #4
Det lyder dejlig nemt at benytte MySQL eftersom, at jeg har benyttet denne databaseserver meget. Problemet ligger jo så i at det så også ér en databaseSERVER hvilket jeg helst vil væk fra.

Når den applikation jeg udvikler skal distribueres og folk andre end mig skal i gang med at benytte den, skal det gerne være nemt at installere. Med MySQL skal man jo i gang med at installere og configurere databaseserveren.

Det jeg leder efter er mere en simpel form for fil-baseret database. Lidt som Access men gratis som MySQL. Findes der ikke en driver som kan kommunikere med normale tekst-filer (f.eks. tab-separerede) som var det database-tabeller?
Avatar billede disky Nybegynder
03. september 2002 - 12:59 #5
Fy R9.

Den doQuery() vil jeg ikke lække navn til, der er flere ting i den jeg ikke kan lide.
1. Man returnerer IKKE en Vector men en List :)
2. Den er for generel og returnerer en Vector tilbage med en post per tabel entry, istedet for en post per post i DB'en :)

Men resten af klassen ser rigtig fin ud :-)))
Avatar billede disky Nybegynder
03. september 2002 - 13:01 #6
C88:

Jeg kender ikke nogen, men jeg ville nok selv lave en der anvender XML som fil format.
Avatar billede r9 Nybegynder
03. september 2002 - 13:03 #7
disky:

Hvorfor er en List bedre?
Performance el. hva?
Avatar billede c88 Nybegynder
03. september 2002 - 13:15 #8
disky: Det lyder egentligt som en meget god idé. Jeg har dog aldrig benyttet xml før - kun læst en smule om det. Er det muligt at benytte xml-filer som var det en relationsdatabase? Jeg læste noget om det engang i forbindelse med php, hvor mange kunne lave SQL-forespørgelser på xml-filer - er dette ligeledes muligt i Java?
Avatar billede disky Nybegynder
03. september 2002 - 13:53 #9
r9:

Hvis du f.eks. har et program der altid angiver typen af Vector,ArrayList, osv som List. Så kan du ved at ændre en linie skifte data handler type f.eks.

List liste=new ArrayList();

Alle andre steder i dit program er typen List.
Hvis du nu pludselig opdager du ikke skal bruge en ArrayList, men f.eks. en LinkedList, skriver jeg bare
List liste=new LinkedList();

Og vupti så spiller det.

Du skal derimod og rette de 87 steder du har defineret retur typer og parameter typer.

p.s. Sun foreslår faktisk man går det på denne måde.

Man angiver altid super klassens interface som type.

Forresten performer Vector dårligere end ArrayList da den er synchronized.
Avatar billede disky Nybegynder
03. september 2002 - 13:54 #10
c88:
En XML er bare en flad fil, så du skal selv holde styr på alting, jeg kender ikke lige til en måde at gøre det på uden selv at skulle kode det. :( Eller installere en Database.
Avatar billede j-hansen Nybegynder
03. september 2002 - 15:36 #11
Først undskyld at jeg brder ind i denne udemærket diskusion.
Men disky jeg vil hører om du vil lave nogle "små" opgaver for mig det næste halve års tid, samt forklaring hertil. Dette vil selvfølig blive mod betaling.
Avatar billede disky Nybegynder
03. september 2002 - 15:39 #12
kontakt mig på disky@hotmail.com eller ICQ #1413069 så kan vi snakke om det :)
Avatar billede r9 Nybegynder
03. september 2002 - 19:30 #13
disky:

Jeg kan godt se din pointe med at det er lettere at ændre i koden senere, hvis man skifter datatype.

Men hvis man har en ordenligt udviklingsværktøj, som kan refactor ordenlig, så tager det under 10 sekunder at ændre navne, referencer o.l. i flere 1000 linjer kode.
Avatar billede disky Nybegynder
03. september 2002 - 19:48 #14
Det er korrekt, men det er stadigvæk ud fra SUN's specifikation og almindelig objektorienteret kotume.
Avatar billede c88 Nybegynder
19. oktober 2002 - 17:24 #15
For at komme lidt videre med dette projekt har jeg indtil videre droppet at benytte mig af en embedded database og forsøger i stedet på jeres opfordring, at bruge MySQL, indtil jeg engang på et senere tidspunkt finder en bedre løsning..

Ud fra diskys eksempel har jeg forsøgt mig med:

import java.sql.*;

public class firstDB {
    public static void main(String[] args) {
        System.out.println("LISTE OVER ALLE EJENDOMME I DATABASEN");
        System.out.println("------------------------------------------------------");

        Database db = new Database();
        db.open();

        ResultSet res = db.doQuery("SELECT Adresse FROM huseftersyn");

        while(res.hasNext()) {
            System.out.println(res.getString("Adresse"));
        }
        db.close();
    }
}


som desværre giver denne fejl:

  C:\java\db>javac firstDB.java
  firstDB.java:13: cannot resolve symbol
  symbol  : method hasNext  ()
  location: interface java.sql.ResultSet
                  while(res.hasNext()) {
                        ^
  1 error
Avatar billede disky Nybegynder
20. oktober 2002 - 00:26 #16
Den hedder ikke .hasNext() men bare .next() :-)
Avatar billede c88 Nybegynder
20. oktober 2002 - 14:05 #17
okey, så får jeg blot nye fejl:

C:\java\db>javac firstDB.java
firstDB.java:13: unreported exception java.sql.SQLException; must be caught or declared to be thrown
                while(res.next()) {
                        ^
firstDB.java:14: unreported exception java.sql.SQLException; must be caught or declared to be thrown
                        System.out.println(res.getString("Adresse"));
                                              ^
2 errors
Avatar billede disky Nybegynder
20. oktober 2002 - 14:16 #18
ret:


        while(res.hasNext()) {
            System.out.println(res.getString("Adresse"));
        }

til

try
{
        while(res.next()) {
            System.out.println(res.getString("Adresse"));
        }
}
catch(SQLException e)
{
}
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