ibatis SQL Maps Tutorial



Documenti analoghi
Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Concetti fondamentali dei database database Cos'è un database Principali database

Architettura MVC-2: i JavaBeans

Il Web-Service SDMX dell ISTAT

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A Esercitazione 08 DAO e Hibernate

Introduzione JDBC interfaccia java.sql driver caricare i driver

Sviluppo Applicazioni Mobile Lezione 12 JDBC. Dr. Paolo Casoto, Ph.D

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

Introduzione alla teoria dei database relazionali. Come progettare un database

Mac Application Manager 1.3 (SOLO PER TIGER)

Configurazione di base. Dott. Doria Mauro

Corso su LINQ Lezione 16. Introduzione

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

DBMS (Data Base Management System)

EXPLOit Content Management Data Base per documenti SGML/XML

Lezione 8. Metadati, Viste e Trigger

Applicazione JobScheduler su DB SQL Milano, lì 14/09/2009

Concetto di Funzione e Procedura METODI in Java

Database 1 biblioteca universitaria. Testo del quesito

Progetto ittorario Anno scol

IL MIO PRIMO SITO: NEWS

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

2104 volume III Programmazione

Il software di gestione immobiliare più facile da usare. Modulo Web v5.2.

OSSIF WEB. Manuale query builder

JDBC versione base. Le classi/interfacce principali di JDBC

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

Modulo 4: Ereditarietà, interfacce e clonazione

risulta (x) = 1 se x < 0.

Questa guida vi illustrerà i principali passaggi da eseguire per l'inserimento dei Bandi di gara.

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

TUTORIAL DI DOCMAN RC2 PER UTILIZZATORI FINALI di

Guida all uso di Java Diagrammi ER

Guida Joomla. di: Alessandro Rossi, Flavio Copes

Let's start! File > New Project > Ruby > Ruby on Rails Application (events)

Corso sul linguaggio SQL

Esercitazione 4 JDBC

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

GESGOLF SMS ONLINE. Manuale per l utente

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Database Lezione 1. Sommario. - Introduzione - Tabelle e chiave primaria - Query - Calcoli ed alias - Ordinamento

Struttura di un programma Java

Volumi di riferimento

Corso di Informatica Modulo T3 B2 - Database in rete

Lezioni di Laboratorio sui Data Base

Introduzione alla consultazione dei log tramite IceWarp Log Analyzer

JDBC. A. Bechini Accesso a DataD con Java

Corso Sistemi Informativi Avanzati. Programma 30 set Installazione Macchina Virtuale. Introduzione alla BI nelle Aziende.

MANUALE PARCELLA FACILE PLUS INDICE

Utilizzo di Certificati SSL e relative implicazioni

CMS ERMES INFORMATICA

I file di dati. Unità didattica D1 1

I cookie sono classificati in base alla durata e al sito che li ha impostati.

Personalizzazione Stampe

User Tools: DataBase Manager

Vi ricordiamo che per qualsiasi problema tecnico o informazione potete contattare info@eduitalia.org oppure Francesco al

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Registratori di Cassa

Programmazione a Oggetti Modulo B

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

Analisi e sviluppo di un componente per un ESB open source

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

Programmazione Java Avanzata Spring - JDBC

Strutturazione logica dei dati: i file

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

WINDOWS: Istruzioni per l uso

Working with WMS Data

PROGETTO PER LA TRASMISSIONE DOCUMENTI RELATIVI ALL APPROVAZIONE DELLE MANIFESTAZIONI IN FORMA DIGITALE

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

Guida per la creazione e la gestione di un profilo Google Scholar Citations

Appunti di MySql. Evoluzione di un tutorial di base di mysql, scritto da Etel Sverdlov.

5.2.1 RELAZIONI TRA TABELLE Creare una relazione uno-a-uno, uno-a-molti tra tabelle 9

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

EDICOLA MANAGER EM Importer

MOCA. Modulo Candidatura. [Manuale versione 1.0 marzo 2013]

Sistemi Mobili e Wireless Android - Dati persistenti: SQLite

Aprire, preparare un documento da utilizzare come documento principale per una stampa unione.

intranet.ruparpiemonte.it

Office Web Components in programmi C# da

Il web server Apache Lezione n. 3. Introduzione

Le query di raggruppamento

MySQL Database Management System

Dispensa di database Access

Organizzazione degli archivi

LABORATORIO DI INFORMATICA parte 6 -

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Il seguente esempio ha lo scopo di illustrare i 3 tipi di relazione 1:1,1:N,N:N. Tabella Conto: Tabella Conto:

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Servizio Feed RSS del sito CNIT

Esercizi di JavaScript

Cookie. Krishna Tateneni Jost Schenck Traduzione: Luciano Montanaro

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Tale attività non è descritta in questa dispensa

Progetto di Ingegneria del Software 2. SWIMv2

Transcript:

ibatis SQL Maps Tutorial Per SQL Maps Versione 2.0 1 Maggio, 2005 Traduzione italiana a cura di Fabrizio Gianneschi (fabrizio@gianneschi.it)

Introduzione Questo breve tutorial illustra un utilizzo tipico di SQL Maps. I dettagli di ciascuno degli argomenti che seguiranno possono essere trovati sulla Guida per lo sviluppatore di SQL Maps (SQL Maps Developer Guide), disponibile su http://www.ibatis.com Prepararsi all'uso di SQL Maps Il framework SQL Maps è molto tollerante rispetto a cattivi modelli di database e addirittura a cattivi modelli ad oggetti. Ciò nonostante, si raccomanda di progettare il proprio database (attraverso una corretta normalizzazione) ed il proprio modello secondo lo stato dell'arte. Facendo ciò, si avranno buone performance ed un progetto migliore. Il modo più semplice per iniziare è analizzare su cosa si sta lavorando. Quali sono gli oggetti di business? Quali sono le tabelle del database? Come si relazionano tra loro? Come primo esempio, si consideri la seguente semplice classe Person, conforme alla tipica convenzione sui JavaBean. Person.java package examples.domain; //import omessi. public class Person { private int id; private String firstname; private String lastname; private Date birthdate; private double weightinkilograms; private double heightinmeters; public int getid () { return id; public void setid (int id) { this.id = id; //assumiamo che ci siano gli altri get e set In che modo questa classe Person si mappa sul nostro database? SQL Maps non vi costringe ad avere relazioni del tipo una-tabella-per-classe oppure più-tabelle-per-classe oppure più-classi-pertabella. Dato che avete disponibile tutta la potenza dell'sql, esistono ben poche restrizioni. Nel nostro esempio si consideri la seguente semplice tabella, che potrebbe essere adatta in una situazione del tipo una-tabella-per-classe. Person.sql CREATE TABLE PERSON( PER_ID NUMBER (5, 0) NOT NULL, PER_FIRST_NAME VARCHAR (40) NOT NULL, PER_LAST_NAME VARCHAR (40) NOT NULL, PER_BIRTH_DATE DATETIME, PER_WEIGHT_KG NUMBER (4, 2) NOT NULL, PER_HEIGHT_M NUMBER (4, 2) NOT NULL, PRIMARY KEY (PER_ID)

) Il file di configurazione di SQL Maps Dopo aver preso confidenza con le classi e le tabelle da utilizzare, il luogo migliore per iniziare è il file di configurazione di SQL Maps. Tale file agisce da radice per quanto riguarda la configurazione della nostra particolare implementazione di SQL Maps. Il file di configurazione è un file XML. Al suo interno configureremo proprietà, fonti dati JDBC e mappature SQL. Il file rappresenta un punto unico di configurazione per i vostri DataSource, che possono essere diversi e differenti. Il framework può gestire varie implementazioni dell'interfaccia DataSource, tra cui l'ibatis SimpleDataSource, Jakarta DBCP (Commons) e qualunque altro DataSource che possa essere reperito tramite un contesto JNDI (ad esempio dall'interno di un application server). Tutto ciò è descritto con maggiore dettaglio nella Developer's Guide. La struttura è molto semplice e, per l'esempio di cui sopra, può essere la seguente: L'esempio continua nella pagina seguente...

SqlMapConfigExample.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.com//dtd SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <!-- Assicuratevi sempre di utilizzare una corretta intestazione XML come sopra! --> <sqlmapconfig> <!-- Le proprietà (nome=valore) nel file di seguito specificato possono essere usate come segnaposto in questo file (es. ${driver. Il file è di solito relativo al classpath ed è opzionale. --> <properties resource="examples/sqlmap/maps/sqlmapconfigexample.properties" /> <!-- Questi settaggi controllano i dettagli di configurazione di SQLMaps, principalmente per quanto riguarda la gestione delle transazioni. Sono tutti opzionali (consultare la Developer Guide per dettagli) --> <settings cachemodelsenabled="true" enhancementenabled="true" lazyloadingenabled="true" maxrequests="32" maxsessions="10" maxtransactions="5" usestatementnamespaces="false" /> <!-- I Type alias vi consentono di utilizzare nomi più corti al posto dei nomi completi delle classi --> <typealias alias="order" type="testdomain.order"/> <!-- Configura un DataSource da utilizzare in questa SQL Map, utilizzando un SimpleDataSource. Notare l'uso di proprietà caricate dal file di properties definito in precedenza --> <transactionmanager type="jdbc" > <datasource type="simple"> <property name="jdbc.driver" value="${driver"/> <property name="jdbc.connectionurl" value="${url"/> <property name="jdbc.username" value="${username"/> <property name="jdbc.password" value="${password"/> </datasource> </transactionmanager> <!-- Identifica tutti i file XML di SQL Map da caricare per la mappatura corrente. Notare che i percorsi sono relativi al classpath. Per ora, ne abbiamo solo uno --> <sqlmap resource="examples/sqlmap/maps/person.xml" /> </sqlmapconfig>

SqlMapConfigExample.properties # Questa è un semplice file di proprietà che semplifica la configurazione automatica # del file di configurazione di SQL Maps (es. da parte di Ant oppure di strumenti di # integrazione continua su ambienti differenti etc.) # I valori seguenti possono essere utilizzati in ogni valore di proprietà del file precedente (es. ${driver ) # Utilizzare un file di proprietà come questo, comunque, è assolutamente opzionale. driver=oracle.jdbc.driver.oracledriver url=jdbc:oracle:thin:@localhost:1521:oracle1 username=jsmith password=test I file SQL Map (mappature SQL) Ora che abbiamo un DataSource configurato ed il nostro file di configurazione è pronto, dobbiamo produrre un file SQL Map che contenga il nostro codice SQL e le mappature per gli oggetti che faranno da parametri di input e di output. Proseguendo con l'esempio di cui sopra, costruiamo un SQL Map file per la classe Person e per la tabella PERSON. Inizieremo con la struttura generale di un documento SQL ed una semplice query: Person.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.com//dtd SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlmap namespace="person"> <select id="getperson" resultclass="examples.domain.person"> SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# </select> </sqlmap> l L'esempio sopra citato mostra la forma più semplice di mappatura SQL. Utilizza una funzionalità del framework SQL Maps che mappa automaticamente le colonne di un ResultSet in proprietà JavaBean (o chiavi di una java.util.map), basandosi sull'uguaglianza del nome. Il token #value# è un parametro di input. Più nel dettaglio, l'uso del value implica che si sta usando un wrapper di tipi primitivi (es. Integer; ma non è l'unico possibile). Sebbene molto semplice, ci sono alcune limitazioni nell'utilizzare l'approccio a mappature automatiche. Non c'è modo di specificare il tipo delle colonne di output (se necessario) o caricare automaticamente dei dati correlati (proprietà complesse); c'è inoltre un lieve decadimento di prestazioni, in quanto quest'approccio richiede l'accesso all'interfaccia ResultSetMetaData. Utilizzando un resultmap, possiamo oltrepassare queste limitazioni. Tuttavia, in questa sede, il nostro scopo è la semplicità, e potremo sempre cambiare in seguito (senza essere costretti a

modificare il codice Java). La maggior parte delle applicazioni agenti sui database non devono semplicemente accedere in lettura, ma anche in scrittura. Abbiamo già visto un esempio di come viene mappata una semplice SELECT, ma che dire a proposito delle INSERT, UPDATE e DELETE? La buona notizia è che non c'è alcuna differenza. Di seguito completeremo la nostra SQL Map relativa alla classe Person per fornire un set completo di statement per leggere e modificare i dati. Person.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.com//dtd SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlmap namespace="person"> <!-- Utilizza una classe Wrapper (es. Integer) come parametro di input e mappa automaticamente i risultati sulle proprietà (JavaBean) di un oggetto Person --> <select id="getperson" parameterclass= int resultclass="examples.domain.person"> SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# </select> <!-- Utilizza le proprietà (JavaBean) di un oggetto Person come parameteri per l'inserimento. Ciascuno dei parametri mappati tra i simboli #...# è una proprietà JavaBean. --> <insert id="insertperson" parameterclass="examples.domain.person"> INSERT INTO PERSON (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) VALUES (#id#, #firstname#, #lastname#, #birthdate#, #weightinkilograms#, #heightinmeters#) </insert> <!-- Utilizza le proprietà (JavaBean) di un oggetto Person come parameteri per la modifica. Ciascuno dei parametri mappati tra i simboli #...# è una proprietà JavaBean. --> <update id="updateperson" parameterclass="examples.domain.person"> UPDATE PERSON SET PER_FIRST_NAME = #firstname#, PER_LAST_NAME = #lastname#, PER_BIRTH_DATE = #birthdate#, PER_WEIGHT_KG = #weightinkilograms#, PER_HEIGHT_M = #heightinmeters# WHERE PER_ID = #id# </update> <!-- Utilizza le proprietà (JavaBean) di un oggetto Person come parameteri per la cancellazione. Ciascuno dei parametri mappati tra i simboli #...# è una proprietà JavaBean. --> <delete id="deleteperson" parameterclass="examples.domain.person"> DELETE PERSON WHERE PER_ID = #id# </delete> </sqlmap>

Programmazione con il framework SQL Maps Una volta configurato e mappato tutto, ciò che dobbiamo fare è scrivere un po' di codice Java nella nostra applicazione. Il primo passo è configurare la SQL Map. Si tratta solamente di caricare il file XML di configurazione della SQL Map che abbiamo creato in precedenza. Per caricarlo, possiamo utilizzare la classe Resources inclusa nel framework. String resource = com/ibatis/example/sqlmap-config.xml ; Reader reader = Resources.getResourceAsReader (resource); SqlMapClient sqlmap = SqlMapClientBuilder.buildSqlMapClient(reader); L'oggetto di classe SQLMapClient è un oggetto di servizio, thread safe e dalla lunga vita. In genere avrete bisogno di istanziarlo e configurarlo una sola volta per ciclo di vita dell'applicazione. Ciò lo rende un ottimo candidato per essere un membro statico di una classe di base (es. un DAO) oppure, se preferite mantenerlo in un punto più centrale e disponibile, potete wrapparlo in una vostra classe creata per l'occasione. Di seguito viene mostrato un esempio di una classe che potrebbe servire a tale scopo: public MyAppSqlConfig { private static final SqlMapClient sqlmap; static { try { String resource = com/ibatis/example/sqlmap-config.xml ; Reader reader = Resources.getResourceAsReader (resource); sqlmap = SqlMapClientBuilder.buildSqlMapClient(reader); catch (Exception e) { // Se si verifica un 'eccezione in questo punto, non preoccupatevi di cos'è successo. Sarà senz'altro // un errore non recuperabile del quale vorremo solamente essere informati. // Dovreste sempre loggare questi tipi di errori e rilanciarli in una maniera che possano essere // immediatamente riconosciuti. e.printstacktrace(); throw new RuntimeException ( Error initializing MyAppSqlConfig class. Cause: + e); public static getsqlmapinstance () { return sqlmap; Leggere oggetti dal Database Ora che l'istanza di SqlMapClient (sqlmap) è inizializzata e facilmente accessibile, possiamo utilizzarla. Iniziamo col leggere un oggetto Person dal database. (In questo esempio, assumiamo che ci siano 10 record nella tabella PERSON, aventi PER_ID da 1 a 10). Per ottenere un oggetto Person dal database, abbiamo semplicemente bisogno dell'istanza di SqlMapClient, del nome dello statement mappato da invocare e dell'id del record da caricare. Proviamo a caricare l'oggetto Person #5. SqlMapClient sqlmap = MyAppSqlMapConfig.getSqlMapInstance(); // come definito sopra Integer personpk = new Integer(5); Person person = (Person) sqlmap.queryforobject ( getperson, personpk);

Salvare oggetti sul Database Abbiamo appena letto un oggetto Person dal database. Proviamo a modificare alcuni dati. Cambieremo l'altezza ed il peso della persona che l'oggetto rappresenta. person.setheightinmeters(1.83); // person come dall'esempio precedente person.setweightinkilograms(86.36); sqlmap.update( updateperson, person); Se vogliamo cancellare l'oggetto Person, è tutto molto semplice. sqlmap.delete ( deleteperson, person); Creare un nuovo oggetto Person è analogo: Person newperson = new Person(); newperson.setid(11); // In genere si ottiene l'id da una sequence, oppure da un'apposita tabella newperson.setfirstname( Clinton ); newperson.setlastname( Begin ); newperson.setbirthdate (null); newperson.setheightinmeters(1.83); newperson.setweightinkilograms(86.36); sqlmap.insert ( insertperson, newperson); Tutto qui. E' tutto ciò che c'è da fare! Prossimi passi... Siamo giunti alla fine di questo breve tutorial. Per la Guida Completa a SQL Maps 2.0, così come di JPetstore 4, una completa e funzionante applicazione web dimostrativa basata su Jakarta Struts, ibatis DAO 2.0 e SQL Maps 2.0, visitate http://www.ibatis.com

CLINTON BEGIN NON FORNISCE ALCUNA GARANZIA, ESPLICITA O IMPLICITA, PER QUANTO RIGUARDA LE INFORMAZIONI CONTENUTE NEL PRESENTE DOCUMENTO. 2004 Clinton Begin. Tutti i diritti riservati. ibatis e i logo di ibatis sono marchi registrati da Clinton Begin. I nomi delle compagnie e prodotti menzionati nel presente documento possono essere registrati dai rispettivi proprietari.