Hacía tiempo que no seguía este hilo de clases de utilidad. Voy a intentar retomarlo. Hoy haremos una clase para manejar cosas simples de la base de datos con jdbc ya que para cosas complejas o manejo de objetos tenemos los ORM J
Bien, ¿Cómo obtener la conexión a una base de datos?
/**
* Obtiene la conexión Connection para poder trabajar con la BBDD.
*
* @param driver
* El driver que se quiere utilizar.
* @param url
* La url donde nos queremos conectar.
* @param user
* El usuario de la BBDD.
* @param password
* La contraseña del usuario.
*
* @return La conexión que se obtiene al introducir el driver, url, user y
* password especificados.
*
* @throws Exception
* La excepción PLN exception.
*/
@SuppressWarnings("unchecked")
public static Connection getConection (String driver, String url, String user, String password) throws Exception {
Connection result;
try {
@SuppressWarnings("unused")
Class<com.mysql.jdbc.Driver> driver2use = (Class<Driver>) Class.forName(driver);
result = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
log.error("ClassNotFoundException", e);
throw new Exception ("ClassNotFoundException");
} catch (SQLException e) {
log.error("SQLException", e);
throw new Exception ("SQLException");
}
return result;
}
¿Cómo obtener una colección o lista de todas las tablas que tenemos en un esquema?
/**
* Obtiene la colección de todas las tablas.
*
* @param driver
* El driver que se quiere utilizar.
* @param url
* La url donde nos queremos conectar.
* @param user
* El usuario de la BBDD.
* @param password
* La contraseña del usuario.
*
* @return La colección de String que representa cada una de las tablas que
* se tiene en la BBDD, usando el driver, url, user y password que
* se especifican en los parámetros.
*
* @throws Exception
* La excepción Exception.
*/
public static Collection<String> getTableNames(String driver, String url, String user, String password) throws Exception {
List<String> result = new ArrayList<String> ();
String nombreTablas = "%"; // Listamos todas las tablas
String tipos[] = new String[1]; // Listamos sólo tablas
tipos[0] = "TABLE";
DatabaseMetaData dbmd = getConection(driver, url, user, password).getMetaData();
ResultSet tablas = dbmd.getTables( null, null, nombreTablas, tipos );
boolean seguir = tablas.next();
while( seguir ) {
// Mostramos sólo el nombre de las tablas, guardado
// en la columna "TABLE_NAME"
result.add(tablas.getString( tablas.findColumn( "TABLE_NAME" ) ));
seguir = tablas.next();
};
return result;
}
¿Y ejecutar un script?
/**
* Execute script.
*
* @param ds el dataSource de donde obtener la conexión
* @param lSentencias lista de sentencias a ejecutar
*/
public static synchronized void executeScript(DataSource ds, List<String> lSentencias) {
Connection con;
PreparedStatement sentencia;
con = null;
try {
if (lSentencias != null && !lSentencias.isEmpty()){
con = ds.getConnection();
con.setAutoCommit(false);
for (String sql : lSentencias) {
if(!sql.endsWith(";")){
sql = sql + ";";
}
sentencia = con.prepareStatement(sql);
sentencia.execute();
}
con.commit();
}
} catch (SQLException e) {
try {
con.rollback();
} catch (SQLException e1) {
log.error("Error al ejecutar el rollback en el método executeScript ",e);
}
log.error("Error al ejecutar las sentancias SQL en el método executeScript ",e);
} finally {
try {
con.close();
} catch (SQLException e) {
log.error("Error al cerrar la conexion ");
}
}
}
¿Mejoras? Pues un montón: que la lista de sentencias no sea una lista en memoria, sino un archivo del disco duro, alternar las conexiones entre el DataSource o Connection… ¿Se anima alguien?

Deja un comentario