venerdì 25 giugno 2010

Apache Derby: query SQL

Derby: creazione del database e delle tabelle
  1. Dopo aver caricato il driver JDBC in maniera analoga a quanto accade con gli altri DBMS:

    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

    È necessario istanziare la connessione, questo non avviene impostando indirizzo ip e porta (non avrebbe senso) ma specificando la directory nella quale mettere il database:

    DriverManager.getConnection("jdbc:derby:" + path.getAbsolutePath() + ";create=true");

    nell'esempio viene specificato il path relativo della directory data/example; il parametro create=true/false indica come deve comportarsi Derby se nella directory non è presente un database.

  2. Ora il database può essere utilizzato via JDBC come qualunque altro DBMS, con l'accortezza di non aprire mai più connessioni contemporaneamente!
    Se si commentano le righe dalla 23 alla 28 e si esegue il programma, verrà creato un database (da Eclipse facendo un refresh nella cartella data si vedranno i nuovi file) con dentro una tabella "item".
Derby: query per inserimento e lettura dei dati
  1. Per ri-eseguire il programma è necessario commentare la riga 22 (altrimenti solleverebbe un'eccezione poiché le tabelle esistono già) e decommentare le righe dalla 23 alla 28.

  2. Il metodo invocato alla riga 23 inserisce nella tabella 100 righe con delle normali INSERT

  3. Anche le SELECT sono scritte in SQL e rispecchiamo la sintassi standard del linguaggio, la prima

    SELECT description FROM item where price = (select min(price) from item)

    non ha parametri e restitusce la descrizione dell'articolo meno costoso, mentre la seconda

    select count(*) as c from item where price <= ?

    ha un parametro e restituisce il numero di articoli con un prezzo minore uguale di threshold.

  4. Una piccola nota "stonata" (almeno dal mio punto di vista) è che Derby non accetta il "punto e virgola" alla fine del comando come da standard SQL.


Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Apache Derby: configurare Eclipse per iniziare un progetto
Codice d'esempio

venerdì 11 giugno 2010

Apache Derby: codice d'esempio





001 package com.blogspot.pilloledijava.derby;
002 
003 import java.io.File;
004 import java.math.BigDecimal;
005 import java.sql.Connection;
006 import java.sql.DriverManager;
007 import java.sql.PreparedStatement;
008 import java.sql.ResultSet;
009 import java.sql.SQLException;
010 import java.sql.Statement;
011 
012 public class DerbyExample {
013 
014   private static ExampleDbManager dbManager;
015 
016   /**
017    @param args
018    */
019   public static void main(String[] args) {
020     try {
021       dbManager = new ExampleDbManager(new File("data/example"));
022       dbManager.createTable();
023       dbManager.insertSample(100);
024       final String all = dbManager.getCheapest();
025       System.out.println("Cheapest item description: " + all);
026       final int count = dbManager.countCheaperThen(BigDecimal
027           .valueOf(5.0));
028       System.out.println("Cheap item: " + count);
029 
030       System.out.println();
031       System.out
032           .println("Apache Derby example: http://pilloledijava.blogspot.com/");
033       System.out.println("Enjoy !!!!");
034 
035     catch (Exception e) {
036       e.printStackTrace();
037       System.out
038           .println("Apache Derby example: http://pilloledijava.blogspot.com/");
039       System.out.println("Something wrong, sorry...");
040     finally {
041       try {
042         if (dbManager != null)
043           dbManager.close();
044       catch (SQLException e) {
045         // nothing in finally statement
046       }
047     }
048 
049   }
050 
051   /**
052    * Derby connection wrapper
053    
054    @author pdj
055    
056    */
057   public static class DbManager {
058 
059     protected final Connection connection;
060 
061     /**
062      * Embedded derby connection wrapper
063      
064      @param path
065      *            database location
066      @throws ClassNotFoundException
067      @throws SQLException
068      */
069     public DbManager(final File paththrows ClassNotFoundException,
070         SQLException {
071       // load Derby driver
072       Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
073       // instantiate derby connection, if necessary creates database
074       connection = DriverManager.getConnection("jdbc:derby:"
075           + path.getAbsolutePath() ";create=true");
076     }
077 
078     /**
079      * Close connection
080      
081      @throws SQLException
082      */
083     public void close() throws SQLException {
084       connection.close();
085     }
086 
087   }
088 
089   /**
090    * Example query
091    
092    @author pdj
093    
094    */
095   public static class ExampleDbManager extends DbManager {
096 
097     public ExampleDbManager(final File paththrows ClassNotFoundException,
098         SQLException {
099       super(path);
100     }
101 
102     /**
103      * Create item table
104      
105      * run one time!
106      
107      @throws SQLException
108      */
109     public void createTable() throws SQLException {
110       Statement createStatement = null;
111       try {
112         createStatement = connection.createStatement();
113         createStatement
114             .execute("create table item(id integer primary key generated always as identity, description varchar(50) not null, price numeric(10,2)) ");
115       finally {
116         if (createStatement != null)
117           createStatement.close();
118       }
119     }
120 
121     /**
122      * Insert a lot of dummy item
123      
124      @param count
125      @throws SQLException
126      */
127     public void insertSample(final int countthrows SQLException {
128       PreparedStatement insertStatement = null;
129       try {
130         insertStatement = connection
131             .prepareStatement("insert into item (description, price) values(?, ?)");
132         for (int i = 0; i < 100; i++) {
133           final String randomName = "item_" + Math.random();
134           insertStatement.setString(1, randomName);
135           final BigDecimal randomPrice = BigDecimal.valueOf(
136               (long) (Math.random() 1000)2);
137           insertStatement.setBigDecimal(2, randomPrice);
138           insertStatement.execute();
139         }
140       finally {
141         if (insertStatement != null)
142           insertStatement.close();
143       }
144     }
145 
146     /**
147      * Return the description of the cheapest item
148      
149      @return
150      @throws SQLException
151      */
152     public String getCheapest() throws SQLException {
153       Statement createStatement = null;
154       try {
155         createStatement = connection.createStatement();
156         final ResultSet rs = createStatement
157             .executeQuery("SELECT description FROM item where price = (select min(price) from item)");
158         try {
159           return rs.next() ? rs.getString("description"null;
160         finally {
161           if (rs != null)
162             rs.close();
163         }
164       finally {
165         if (createStatement != null)
166           createStatement.close();
167       }
168     }
169 
170     /**
171      * Count item cheaper the threshold
172      
173      @param threshold
174      @return
175      @throws SQLException
176      */
177     public int countCheaperThen(final BigDecimal threshold)
178         throws SQLException {
179       PreparedStatement createStatement = null;
180       try {
181         createStatement = connection
182             .prepareStatement("select count(*) as c from item where price <= ?");
183         createStatement.setBigDecimal(1, threshold);
184         final ResultSet rs = createStatement.executeQuery();
185         try {
186           return rs.next() ? rs.getInt("c"null;
187         finally {
188           if (rs != null)
189             rs.close();
190         }
191       finally {
192         if (createStatement != null)
193           createStatement.close();
194       }
195     }
196 
197   }
198 
199 }




Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Apache Derby: configurare Eclipse per iniziare un progetto
Query SQL: tutorial passo-passo

Apache Derby: configurare Eclipse per iniziare un progetto

In questo post verrà spiegato come configurare Eclipse per poter eseguire il codice d'esempio:

  1. Creare un nuovo "Java project"

  2. Creare una directory "lib" (immagine) ed una directory "data" nel progetto


  3. Scaricare l'ultima versione della libreria (db-derby-10.6.1.0-lib.tar.gz) da qua http://db.apache.org/derby/derby_downloads.html#Latest+Official+Release

  4. Estrarre il file derby.jar nella directory lib create in precedenza


  5. Da Eclipse fare un refresh sulla directory lib ed aggiungere il file derby.jar al build path (tasto destro su derby.jar -> Build Path -> Add to Build Path)



Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Codice d'esempio
Query SQL: tutorial passo-passo

Apache Derby: il DBMS portabile (Introduzione)

Apache Derby (http://db.apache.org/derby) è un RDBMS (sistema di gestione di database relazionale) scritto completamente in Java e rilasciato sotto "Apache License, Version 2.0", quindi open source e completamente gratuito.
L'attuale versione (10.6.1.0) supporta quasi tutte le caratteristiche "obbligatorie" richeste da SQL-99/SQL-2003 ed alcune di quelle opzionali (http://wiki.apache.org/db-derby/SQLvsDerbyFeatures).

Rispetto al più blasonato MySQL, al più performante PostgreSQL ed ai più costosi Oracle e SQLServer, Derby ha una caratteristica veramente interessante per lo sviluppo di programmi monoutente: è portabile, cioè non è necessario installare un "server" perché Derby può leggere e scrivere direttamente dal filesystem. In questo modo è possibile sviluppare software da mettere, ad esempio, in una chiavetta e utilizzarlo su qualunque pc in cui sia installata una jre. Il prezzo da pagare per questa comodità è la "mono-connessione": non è possibile infatti utilizzare più connessioni contemporanee sullo stesso database. Nel caso sia necessario avere più connessioni è possibile installare Derby Network Server rinunciando però alla portabilità (o quantomeno ad una portabilità semplice); personalmente però, in un ambiente client/server, preferisco PostgreSQL perché più completo e performante.

I prossimi post spiegheranno passo-passo come utilizzare Derby con Eclipse.
Apache Derby: configurare Eclipse per iniziare un progetto
Codice d'esempio
Query SQL: tutorial passo-passo