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