Domanda

Per implementare il codice di accesso ai dati nella nostra applicazione abbiamo bisogno di un framework per concludere jdbc (ORM non è la nostra scelta, a causa della scalabilità).

Il framework più interessante con cui ho lavorato è Spring-Jdbc . Tuttavia, la politica della mia azienda è di evitare dipendenze esterne, in particolare primavera, J2EE, ecc. Quindi stiamo pensando di scrivere il proprio framework jdbc a portata di mano, con funzionalità simili Spring-jdbc: mappatura delle righe, gestione degli errori, funzionalità di supporto di java5, ma senza il supporto delle transazioni.

Qualcuno ha esperienza di scrittura di tale framework wrapper jdbc? Se qualcuno ha esperienza nell'uso di altri framework wrapper jdbc, condividi la tua esperienza.

Grazie in anticipo.

È stato utile?

Soluzione

Abbiamo scritto il nostro wrapper. Questo argomento è degno di un articolo, ma dubito che avrò mai il tempo di scriverlo, quindi ecco alcuni punti chiave:

  • abbiamo abbracciato sql e non abbiamo fatto alcun tentativo per nasconderlo. l'unica modifica era aggiungere il supporto per i parametri denominati. i parametri sono importanti perché non incoraggiamo l'uso di sql al volo (per motivi di sicurezza) e utilizziamo sempre PreparedStatements.

  • per la gestione delle connessioni, abbiamo usato Apache DBCP. Questo era conveniente al momento, ma non è chiaro quanto sia necessario con le moderne implementazioni JDBC (mancano i documenti su questa roba). DBCP raggruppa anche PreparedStatements.

  • non ci siamo preoccupati della mappatura delle righe. invece (per le query) abbiamo usato qualcosa di simile al ResultSetHandler di Apache dbutil, che ti consente di " feed " il risultato impostato in un metodo che può quindi scaricare le informazioni ovunque tu voglia. Questo è più flessibile e in effetti non sarebbe difficile implementare un ResultSetHandler per il mapping delle righe. per inserimenti / aggiornamenti abbiamo creato una classe di record generica (sostanzialmente una hashmap con alcune campane e fischietti extra). il problema più grande con la mappatura delle righe (per noi) è che sei bloccato non appena fai un "interessante" query perché potresti avere campi associati a classi diverse; perché potresti avere una struttura gerarchica di classe ma un set di risultati piatto; o perché la mappatura è complessa e dipende dai dati.

  • abbiamo incorporato la registrazione degli errori. per la gestione delle eccezioni: su una query intercettiamo e registriamo, ma per un aggiornamento intercettiamo, registriamo e riconfiguriamo eccezioni non controllate.

  • abbiamo fornito supporto per le transazioni usando un approccio wrapper. il chiamante fornisce il codice che esegue la transazione e ci assicuriamo che la transazione sia gestita correttamente, senza possibilità di dimenticare di terminare la transazione e con il rollback e la gestione degli errori incorporati.

  • in seguito, abbiamo aggiunto uno schema di relazione molto semplicistico che consente di applicare un singolo aggiornamento / inserimento a un record e tutte le sue dipendenze. per semplificare le cose, non lo abbiamo utilizzato nelle query e abbiamo deciso in particolare di non supportarlo con le eliminazioni perché è più affidabile utilizzare le eliminazioni in cascata.

Questo wrapper è stato utilizzato con successo in due progetti fino ad oggi. È, ovviamente, leggero, ma in questi giorni tutti dicono che il loro codice è leggero. Ancora più importante, aumenta la produttività del programmatore, diminuisce il numero di bug (e rende più facile rintracciare i problemi), ed è relativamente facile da rintracciare se necessario perché non crediamo nell'aggiunta di molti livelli solo per fornire una bella architettura.

Altri suggerimenti

Spring-JDBC è fantastico. Considera che per un progetto open source come Spring il lato negativo della dipendenza esterna è ridotto al minimo. Puoi adottare la versione più stabile di Spring che soddisfa i tuoi requisiti di astrazione JDBC e sai che sarai sempre in grado di modificare tu stesso il codice sorgente in caso di problemi, senza dipendere da una parte esterna. Puoi anche esaminare l'implementazione per eventuali problemi di sicurezza che la tua organizzazione potrebbe avere con il codice scritto da una parte esterna.

Quello che preferisco: Dalesbred . Ha la licenza MIT.

Un semplice esempio di come ottenere tutte le righe per una classe personalizzata (Dipartimento).

List<Department> departments = db.findAll(Department.class,
    "select id, name from department");

quando la classe personalizzata è definita come:

public final class Department {
    private final int id;
    private final String name;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

Dichiarazione di non responsabilità: è di un'azienda per cui lavoro.

Sembra una decisione miope. Considera i costi di sviluppo / manutenzione di un tale framework, specialmente quando puoi ottenerlo, ed è il codice sorgente gratuito. Non solo non devi fare lo sviluppo da solo, ma puoi modificarlo a piacimento, se necessario.

Detto questo, ciò che devi davvero duplicare è la nozione di JdbcTemplate ed i suoi callbacks (PreparedStatementCreator, PreparedStatementCallback), nonché RowMapper / RowCallbackHandler. Non dovrebbe essere complicato scrivere qualcosa del genere (soprattutto considerando che non devi fare la gestione delle transazioni).

Tuttavia, come ho già detto, perché scriverlo quando puoi ottenerlo gratuitamente e modificare il codice sorgente come ritieni opportuno?

Prova JdbcSession da jcabi-jdbc . È semplice come dovrebbe essere JDBC, ad esempio:

String name = new JdbcSession(source)
  .sql("SELECT name FROM foo WHERE id = ?")
  .set(123)
  .select(new SingleOutcome<String>(String.class));

Questo è tutto.

mJDBC: https://mjdbc.github.io/

Lo uso da anni e l'ho trovato molto utile.

È ispirato alla libreria JDBI ma non ha dipendenze, aggiunge supporto alle transazioni, fornisce contatori delle prestazioni e consente di passare facilmente al livello SQL più basso possibile in Java (vecchia API JDBC semplice) nel caso in cui ne abbiate davvero bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top