Gestisci le stringhe di query nei metodi JDBC

4

Sto cercando di scoprire quale sia la procedura migliore quando si organizzano le stringhe PreparedStatement in un'applicazione che utilizza JDBC per connettersi al database.

Di solito questo è il modo in cui recupero i dati dal database:

PreparedStatement select = null;
String prepQuery = "SELECT * FROM user JOIN details ON user.id = details.user_id WHERE details.email = ? AND details.password = ?";
select = con.prepareStatement(prepQuery);
select.setString(1, email);
select.setString(2, pass);
ResultSet result = select.executeQuery();
// Handle the result.

Questo è un metodo che recupera un'entità utente utilizzando l'e-mail e una password. Per tutti i miei metodi questo è il modo in cui salvi le stringhe di query.

Il primo svantaggio che mi viene in mente è che questo è abbastanza disordinato e difficile da gestire se cambio il provider SQL (Forse se inserissi tutte le query in un file Constants sarebbe una soluzione migliore). Inoltre, JPA offre strumenti come @NamedQuery che si dice migliorino le prestazioni dell'applicazione.

C'è una buona pratica quando si tratta di organizzare le stringhe di query in un'applicazione che usa JDBC. Grazie!

    
posta Ionut 13.05.2012 - 21:32
fonte

2 risposte

2

Considera JDBI

Se si desidera lavorare a stretto contatto con JDBC in modo da creare il proprio SQL e fare in modo che l'applicazione gestisca l'associazione tra i parametri della query, JDBI potrebbe essere un buon approccio per l'utente.

In sostanza, crei un'interfaccia annotata che descrive il tuo DAO e JDBI fornirà un'implementazione in fase di runtime. Un tipico DAO potrebbe apparire come questo:

public interface MyDAO
{
  @SqlUpdate("create table something (id int primary key, name varchar(100))")
  void createSomethingTable();

  @SqlUpdate("insert into something (id, name) values (:id, :name)")
  void insert(@Bind("id") int id, @Bind("name") String name);

  @SqlQuery("select name from something where id = :id")
  String findNameById(@Bind("id") int id);

  /**
   * close with no args is used to close the connection
   */
  void close();
}

Questo approccio si presta a una gestione molto leggera di SQL. Se le tue esigenze sono più orientate a supportare più database o ad astrarre tali database dall'SQL e in un modello di oggetto puro, allora JPA è probabilmente un approccio migliore.

    
risposta data 14.05.2012 - 10:20
fonte
2

La soluzione migliore è utilizzare un framework IoC come Spring per esternare le stringhe di query in modo che si trovino in file di configurazione basati su XML anziché nel mezzo delle classi Java. Spring ti offrirà anche alcune funzioni utili per controllare le tue transazioni e simili. Questo è fondamentalmente ciò che definisce JPA @NamedQuery e Spring o Hibernate hanno implementazioni decenti di JPA.

Un'altra possibilità è utilizzare il modello Oggetto query . Ciò implicherebbe la separazione della logica per la query nella sua classe / oggetto, avendo quindi un unico punto per mantenerla.

    
risposta data 13.05.2012 - 23:17
fonte

Leggi altre domande sui tag