Si ya sé que existe hibernate, toplink, eclipse-link y mas implementaciones de ORM's, pero este no es un ORM es simplemente una clase para manejar nuestras consultas SQL sin complicarnos tanto.
Aparte me permite explicarles el Patron Singleton y aprovechar una funcionalidad de la librería H2 que es el pool de conexiones.
- Creamos nuestro paquete denominado util y dentro db, entonces tendremos algo asi (he cambiado el nombre del paquete raiz a blog.dairdev.minitienda previamiente, pero esto no influye demasiado)
- Dentro de db creamos nuestra clase denominada H2Util
Con esta clase manejaremos nuestras conexiones a la base de datos y la ejecución de los querys.
Vamos a utilizar el Patron Singleton, que este caso nos va a permitir tener una sola instancia de esta clase para todo el tiempo de vida de la aplicación.
Para eso implementamos el siguiente codigo :
public class H2Util {
//Implementamos el patron Singleton
static private H2Util INSTANCE = null;
// creador sincronizado para protegerse de posibles problemas multi-hilo
// otra prueba para evitar instanciación múltiple
private synchronized static void createInstance() {
if (INSTANCE == null) {
INSTANCE = new H2Util();
}
}
public static H2Util getInstance() {
if (INSTANCE == null) {
createInstance();
}
return INSTANCE;
}
}
private void conectar() {
try {
Class.forName(DRIVER).newInstance();
//si no existe el pool de conexiones crea uno
if (pool == null) {
pool = JdbcConnectionPool.create("jdbc:h2:" + DB_URL, "sa", "sa");
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(H2Util.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(H2Util.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(H2Util.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Abre la coneccion si no ha sido creada previamente
* retorna un objecto connection
*/
public Connection getConnection() throws SQLException {
if (pool == null) {
conectar();
}
return pool.getConnection();
}
/**
* retorna un objeto PreparedStatement utilizando una nueva conexion
*/
public PreparedStatement getPreparedStatement(String query) throws SQLException {
return H2Util.getInstance().getConnection().prepareStatement(query);
}
/**
* retorna un objeto ResultSet basado en un PreparedStatement de acuerdo al query pasado
*/
public ResultSet getResultSet(String query) throws SQLException {
return H2Util.getInstance().getPreparedStatement(query).executeQuery();
}
/**
* ejecuta un query tipo INSERT, UPDATE o DELETE
*/
public void execute(String query) throws SQLException {
PreparedStatement psmt = H2Util.getInstance().getPreparedStatement(query.toString());
//Este metodo es que se debe llamar en caso de ejecutar INSERT, UPDATE o DELETE
psmt.executeUpdate();
//cerramos el psmt y su conexion
psmt.close();
psmt.getConnection().close();
}
Viene de :





No hay comentarios:
Publicar un comentario