Queries utilitzant JDBC (SQL+Java)


A l'entrada anterior ja vaig ensenyar com establir la connexió entre Java i SQL mitjançant el driver JDBC (si no saps de què parlo et recomano primer donar un cop d'ull a aquesta entrada). Un cop tenim la connexió establerta ja podem interacturar amb la nostra base de dades. El driver ens proporciona 3 interfícies per fer-ho: Statement, CallableStatement i el PreparedStatement; saber les diferències entre ells és important, ja que cada un defineix mètodes diferents que seran necessaris per fer servir de pont entre les dues eines.

Decidim quina interfície utilitzar?

InterfíciesComentaris
Statement
Utilitzat per a termes generals d'accés a la BD. Util quan estiguis utilitzant declaracions SQL estàtiques en temps d'execució. El problema és que no accepta paràmetres.
PreparedStatement
Quan saps que utilitzaràs declaracions SQL sovint en el teu codi. Li dona un plus que se li puguin passar paràmetres d'entrada.
CallableStatement
Quan necessites accés a un procediment emmagatzemat a la BD. De la mateixa manera que el PS, també accepta paràmetres d'entrada.

A tot això jo normalment treballo amb PreparedStatement, la més útil i comú entre els meus programes,  començarem doncs declarant una String amb la nostra query (començarem amb un select que és més senzill) i utilitzant la meva taula "client" (nom de clients amb clau "id"):
String sql = "select * from client where id=?"
Creem a continuació l'objecte PS amb la query com a paràmetre.
PreparedStatement pS = connection.prepareStatement(sql);
Un cop declarada la query, podem inserir-hi tants valors com ??? apareguin. Espero que entengueu com n'és d'útil això, ja que podem arribar a inserir variables com a valors fixes; sols necessitem que el mètode "set" que cridem sigui l'adequat amb el type que espera sql (si espera un double, farem un set a la query de double, igual si necessitem inserir un integer, un varchar...).
pS.setInt(1, 1234);
Bàsicament estarem inserint al primer "?" (1) el valor id del client (1234).
Podem tenir tants valors com volguem, aquí us deixo un exemple amb dos "?"
String sql = "select * from client where nom= ? and cognom= ?";

PreparedStatement pS = connection.prepareStatement(sql);

pS.setString(1, "Joan");
pS.setString(2, "Garcia");
Ara només ens queda executar el PreparedStatement per fer efectiva la query:
ResultSet result = pS.executeQuery();
Com podem observar, això ens retorna un ResultSet, aquest ens és útil, ja que el select retorna un array de rows de la base de dades, per tant el farem servir per obtenir tots els resultats. De moment espero fer una entrada sobre això, però sinó podeu anar llegint la API del Java on trobareu més informació.

El mètode executeQuery() només ens serveix quan volem obtenir resultats de la BD, si volguéssim executar un insert to, delete o un update necessitaríem seguir els mateixos passos però cridant al final el mètode executeUpdate(). En veiem un exemple complet?


/**@autor: Mar Llambi */
con = ConnectionUtil.getConnection();

//un exemple de com pasar de Calendar a String
//Podriem haver posat un string directament, pero aixi us ensenyo quelcom mes
Calendar cal = Calendar.getInstance(Locale.getDefault());
cal.set(Calendar.DAY_OF_MONTH, 23);
cal.set(Calendar.MONTH,Calendar.AUGUST);
cal.set(Calendar.YEAR,1993);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String naixement = df.format(cal.getTime());
String query = "INSERT INTO Client ("
 + " id,"
 + " nom,"
 + " cognom,"
 + " data_naixement,"
 + " DNI"
 + " ) VALUES ("
 + "?, ?, ?, ?, ?)";

 try {
  // preparem els valors de PreparedStatement
  PreparedStatement st = con.prepareStatement(query);

  st.setInt(1, 123);
  st.setString(2, "Joan");
  st.setString(3, "Garcia");
  st.setString(4,naixement);
  st.setString(5, "00000000X");
             
  // executem PreparedStatement insert
  st.executeUpdate();

  //tanquem el PS
  st.close();
 } 
 catch (SQLException se){
  se.printStackTrace();  
 }

I fins aquí els exemples de PreparedStatement i si teniu qualsevol pregunta, no dubteu en preguntar-me.
Recordar-vos que les versions de Java que utilitzo són 1.6 i 1.7 depenent de quines eines externes utilitzi. I recordar-vos també que un bon programador de Java ha de tenir l'API d'Oracle sempre oberta ;)

No he tingut temps de comprovar els seus codis però semblen tutorials molt complets: us recomano la pàgina Tutorials Point i el seu apartat JDBC!

0 Comentarios