tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
18876
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    hier mal ein kleines Beispiel wie man in einer Java 6 Anwendung die mitgelieferte Derby Datenbank verwenden kann.

    Damit das Beispiel läuft muss man das derby.jar in den Classpath legen:
    C:\Programme\Java\jdk1.6.0\db\lib\derby.jar

    Code 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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
     
    /**
     * @author Tom
     */
    public class DerbyEmbeddedDatabaseExample {
     
      /**
       * @param args
       */
      public static void main(String[] args) throws Exception {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        Properties properties = new Properties();
        properties.put("user", "user1");
        properties.put("password", "user1");
        Connection connection = DriverManager.getConnection("jdbc:derby:c:/TEMP/tutorialsDB;create=true", properties);
     
        createTableTestIfItDoesntExistYet(connection);
        populateTableTestIfItHasNotBeenPopulatedYet(connection);
        showContentsOfTableTest(connection);
        
        connection.close();
      }
     
      /**
       * @param connection
       * @throws SQLException
       */
      private static void showContentsOfTableTest(Connection connection) throws SQLException {
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("SELECT * FROM test");
        int columnCnt = resultSet.getMetaData().getColumnCount();
        boolean shouldCreateTable = true;
        while (resultSet.next() && shouldCreateTable) {
          for(int i = 1; i <= columnCnt;i++){
            System.out.print(resultSet.getString(i) +  " ");
          }
          System.out.println();
        }
        resultSet.close();
        statement.close();
      }
     
      private static void populateTableTestIfItHasNotBeenPopulatedYet(Connection connection) throws Exception {
     
        boolean shouldPopulateTable = true;
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("SELECT COUNT(*) FROM test");
        if (resultSet.next()) {
          shouldPopulateTable = resultSet.getInt(1) == 0;
        }
        resultSet.close();
        statement.close();
     
        if (shouldPopulateTable) {
          System.out.println("Populating Table test...");
          PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test VALUES (?,?)");
          String[] data = { "AAA", "BBB", "CCC", "DDD", "EEE" };
          for (int i = 0; i < data.length; i++) {
            preparedStatement.setInt(1, i);
            preparedStatement.setString(2, data[i]);
            preparedStatement.execute();
          }
          preparedStatement.close();
        }
      }
     
     
      private static void createTableTestIfItDoesntExistYet(Connection connection) throws Exception {
        ResultSet resultSet = connection.getMetaData().getTables("%", "%", "%", new String[] { "TABLE" });
        int columnCnt = resultSet.getMetaData().getColumnCount();
        boolean shouldCreateTable = true;
        while (resultSet.next() && shouldCreateTable) {
          if (resultSet.getString("TABLE_NAME").equalsIgnoreCase("TEST")) {
            shouldCreateTable = false;
          }
        }
        resultSet.close();
        if (shouldCreateTable) {
          System.out.println("Creating Table test...");
          Statement statement = connection.createStatement();
          statement.execute("create table test (id int not null, data varchar(32))");
          statement.close();
        }
      }
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  2. #2
    jeipack jeipack ist offline Mitglied Brokat
    Registriert seit
    Feb 2007
    Beiträge
    391
    Thx a lot.
    Nimm ich gleich mal in meine Favoriten

    Code :
    1
    
    connection.getMetaData().getTables("%", "%", "%", new String[] { "TABLE" });
    Macht das das gleiche wie ein SHOW TABLES?
    Ahja nach der Beschreibung können die ersten zwei Pattern (die ersten zwei "%") durch null ersetzt werden, so werden trozdem alle miteinbezogen, es wird aber nicht zuerst nach einer Übereinstimmung gesucht.

    Gruss
     

  3. #3
    Vatar Vatar ist offline Mitglied Brokat
    Registriert seit
    Feb 2004
    Ort
    Reykjavik
    Beiträge
    434
    Ich bevorzuge hierfür immer eine DataSource, da ich es persönlich etwas übersichtlicher finde.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    public void startDatabase(String location)  {
        ds = new EmbeddedDataSource();
        ds.setCreateDatabase("create");
        ds.setDatabaseName(location); // location = "C:/Test/DB"
        try {
            ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
     
    public void stopDatabase(){
        ds.setShutdownDatabase("shutdown");
        try {
            ds.getConnection();
        } catch (SQLException e) {
            // SQLException wird immer geworfen, da nach dem Beenden keine Connection mehr
            // vorhanden ist. Designbedingte Exception
        }
    }

    Wer das ganze mal auf einem Handy/PDA laufen lassen will braucht das EmbeddedDataSource nur durch ein EmbeddedSimpleDataSource zu ersetzen.
     
    99% der Fehler befinden sich zwischen Stuhl und Tastatur

    Island

  4. #4
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo,

    warum muss derby.jar runtergeladen und eingebunden werden, wenn es schon heißt es ist in das JDK6 eingegliedert?


    Vg Erdal
     

  5. #5
    thieste thieste ist offline Grünschnabel
    Registriert seit
    Jan 2008
    Beiträge
    2
    Hallo,

    das Beispiel funktioniert ja ganz gut aber.. das mit den properties user und password.. haut irgendwie nicht hin..

    Wenn ich den Benutzer/Passwort ändere oder auch ganz weglasse.. wird trotzdem der Tabelleninhalt ausgeben.. sind password und user nicht genau dafür da.. dass das nicht passiert.. create=true habe ich nach dem ersten "Lauf" auf false gestellt.. damit nicht ne neue DB angelegt wird.
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    das war ja auch nur ein kleines einfaches Beispiel
    Schau mal hier: (JavaDB = Apache Derby)
    http://today.java.net/pub/a/2007/03/...-security.html

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    thieste thieste ist offline Grünschnabel
    Registriert seit
    Jan 2008
    Beiträge
    2
    Hey vielen Dank.. das sind genau die Infos die ich gesucht hatte..
     

  8. #8
    MusYa MusYa ist offline Grünschnabel
    Registriert seit
    Jun 2007
    Beiträge
    2
    hey,

    mit dem Derby DB klappt es wunderbar bis auf die DELETE-Anweisung. Ich habe 2 Varianten schon durchprobiert, aber bei keinem von den 2 Varianten hat es klappen wollen. Kann mir jemand dabei weiterhelfen?

    Code :
    1
    2
    3
    4
    
            Statement stmt = connection.createStatement();
            String sql = "DELETE FROM myTableName WHERE colName='a'";
            stmt.executeUpdate(sql);
            stmt.close();

    und

    Code :
    1
    2
    3
    4
    5
    
            Statement stmt = connection.createStatement();
            String sql = "DELETE FROM myTableName WHERE colName=?";
            PreparedStatement pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, "a");
            deleteCount = pstmt.executeUpdate();

    Immer wieder bekomme ich denselben Fehler:
    "java.sql.SQLSyntaxErrorException: Column 'A' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'A' is not a column in the target table."
    Geändert von MusYa (18.12.08 um 12:19 Uhr)
     

  9. #9
    MusYa MusYa ist offline Grünschnabel
    Registriert seit
    Jun 2007
    Beiträge
    2
    hey,

    ich hab es hinbekommen. Ich musste nur noch clearParameters(); hinzufügen.

    Code :
    1
    2
    3
    4
    5
    
    PreparedStatement pstmt = con.prepareStatement("DELETE FROM bilgi WHERE ColName = ?");
    pstmt.clearParameters();
    pstmt.setString(1, "a");
    pstmt.executeUpdate();
    pstmt.close();
     

  10. #10
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Zitat Zitat von flashray Beitrag anzeigen
    Hallo,

    warum muss derby.jar runtergeladen und eingebunden werden, wenn es schon heißt es ist in das JDK6 eingegliedert?
    Vg Erdal
    Ich wollte mich der Frage mal anschließen, da ich gerade mal versucht habe die jar Dateien zu finden, die ich in einer Java 6 Umgebung eigetnlich vermutet hätte.

    Muss man derby tatsächlich nachinstallieren auch bei Java 6?
    Wenn ja, was ist dann eigetnlich von Java 6 dann übernommen worden bezogen auf Derby?

    mit nachbohrenden Grüßen

    Takidoso
     

  11. #11
    Mister D Tutorials.de Gastzugang
    Hallo,

    ich stehe vor dem Problem (auch schon das ganze Netz abgesucht), dass ich meine (embedded) Datenbank gerne in dem *.jar file ausliefern möchte.

    Leider gibt es dabei aber noch ein Problem:
    Der Absolute Pfad in der getConnection(..) verhindert dies! Mit dem relativen Pfad klappts aber auch noch nicht so recht. Die erzeugte DB soll unter $TARGET\db liegen

    Fall1: absoluter pfad ==> ok
    verbindung = DriverManager.getConnection("jdbc:derby:I:/workspace/test/App/db/app2008");

    Fall2 : relativ zum $TARGET\bin- ordner ==> FEHLER
    verbindung = DriverManager.getConnection("jdbc:derby:../../db/app2008");

    Wie muss der realitve pfad dür heissen?
    Was muss ich bzgl. DERBY_INSTALL und der CLASSPATH-Var. beachten um die DB dann in dem *jar File nach aussen hin weitergeben zu können?

    Danke schon mal für Eure Hilfe
     

  12. #12
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    bei mir funktioniert folgendes Szenario:
    1) Obiges Beispiel laufen lassen (damit die Datenbank erstellt wird)
    2) Datenbank URL umstellen auf: "jdbc:derby:./tutorialsDB"
    3) DerbyEmbeddedDatabaseExample als ausführbares Jar exportieren (derby.jar etc. in zusätzlichem Verzeichnis mitliefern) -> Export as runnable jar / copy required libraries into sub-folder.
    4) In Schritt 1 erstellte Datenbank (Verzeichnis) in das Zielverzeichnis des unter 3) erstellten jars kopieren.

    Schon sollte es Funktionieren.

    Wenn du die db wirklich im Jar File ablegen willst könntest du mal versuchen diese über eine spezielle jar-File URL anzusprechen:
    jar:file:/test.jar!tutorialsDB
    Kann sein, dass du dann die DB im Read-Only Modus starten musst um Fehler zu vermeiden.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  13. #13
    Mister D Tutorials.de Gastzugang
    Hallo Thomas,

    vielen Dank für deine Antwort. Beruhigend zu wissen, dass es schon geht.

    Ich werde es demnächst mal auf diesem Wege versuchen.

    Happy coding!
     

  14. #14
    Mister D Tutorials.de Gastzugang
    Da fällt mir noch was ein:

    In der eigentlichen App. könnte der User ja den Pfad zur DB konfigurierbar festlegen und genau dort wartet dann zb. das selbstkopierte Datenbankverz. samt aller Files auf den Zugriff. Das sollte das Problem der Weitergabe erstmal einfach lösen.

    Letztendlich muss es aber auch möglich sein, die DB vor den Blicken des Users verstecken zu können. Kennt vielleicht jemand diesbzgl. Tutorials im Netz?
     

  15. #15
    Mister D Tutorials.de Gastzugang
    @Thomas

    Jetzt bin ich etwas schlauer.
    Also die Weitergabe per DB-Directory funktioniert nun super (Danke auch für die Eclipse-Tipps).

    Allerdings scheint es bei der aktuellen Derby Version zu einer Abweichung in der Betrachtung des Application-Root-Directory's zu kommen?
    Denn im Gegensatz zur Doku, die beschreibt, das "../meineDB" den Pfad zur $APP\meineDB sein sollte, ist es nun einfach: meineDB (siehe unten)

    statt : "jdbc:derby:./meineDB" ==> "jdbc:derby:meineDB";
    Derby Version 10.5

    @all
    liesse sich das von jemanden bestätigen ?
     

Ähnliche Themen

  1. Kleines Beispiel zum Thema Java 3D
    Von Thomas Darimont im Forum Java
    Antworten: 1
    Letzter Beitrag: 13.11.08, 19:35
  2. Kleines Beispiel für die Verwendung eines java Beans in einer JSP
    Von Thomas Darimont im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 27.08.08, 21:30
  3. Antworten: 0
    Letzter Beitrag: 17.03.07, 15:00
  4. Interessanter IBM Artikel zur Verwendung von Apache Derby in Eclipse Plugins
    Von Thomas Darimont im Forum Java Technology News
    Antworten: 0
    Letzter Beitrag: 18.01.07, 17:46
  5. Antworten: 4
    Letzter Beitrag: 25.12.03, 23:10