ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
18876
18876
EMPFEHLEN
-
14.03.07 23:43 #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ß TomJava 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
-
Thx a lot.
Nimm ich gleich mal in meine Favoriten
Macht das das gleiche wie ein SHOW TABLES?Code :1
connection.getMetaData().getTables("%", "%", "%", new String[] { "TABLE" });
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
-
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.
-
Hallo,
warum muss derby.jar runtergeladen und eingebunden werden, wenn es schon heißt es ist in das JDK6 eingegliedert?
Vg Erdal
-
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.
-
30.01.08 23:44 #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ß TomJava 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
-
Hey vielen Dank.. das sind genau die Infos die ich gesucht hatte..
-
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)
-
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();
-
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
-
18.09.09 14:58 #11Mister 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
-
18.09.09 18:01 #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ß TomJava 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
-
21.09.09 11:05 #13Mister 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!
-
21.09.09 14:43 #14Mister 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?
-
21.09.09 15:59 #15Mister 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
-
Kleines Beispiel zum Thema Java 3D
Von Thomas Darimont im Forum JavaAntworten: 1Letzter Beitrag: 13.11.08, 19:35 -
Kleines Beispiel für die Verwendung eines java Beans in einer JSP
Von Thomas Darimont im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 27.08.08, 21:30 -
Beispiel für die Verwendung von OSGi Services auf Basis von Equinox
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 17.03.07, 15:00 -
Interessanter IBM Artikel zur Verwendung von Apache Derby in Eclipse Plugins
Von Thomas Darimont im Forum Java Technology NewsAntworten: 0Letzter Beitrag: 18.01.07, 17:46 -
Verwendung von Ebenen (beispiel) [Anfänger]
Von Salzman im Forum CSSAntworten: 4Letzter Beitrag: 25.12.03, 23:10






Zitieren
Login





