Clases de Utilidad Java III: DataBase

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