/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.etk.component.database; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.List; import org.etk.common.logging.Logger; import org.etk.common.utils.PageList; /** * Created by The eXo Platform SAS Author : Tuan Nguyen * tuan08@users.sourceforge.net Apr 4, 2006 */ public abstract class DAO<T extends DBObject> { /** * Logger. */ private static final Logger LOG = Logger.getLogger(DAO.class); protected ExoDatasource eXoDS_; protected DBObjectMapper<T> mapper_; // TODO need remove static int totalQueryTime = 0; static int totalBathTime = 0; static int totalCloseConnect = 0; public DAO(ExoDatasource datasource) { eXoDS_ = datasource; mapper_ = new ReflectionMapper<T>(); } public DAO(ExoDatasource datasource, DBObjectMapper<T> mapper) { eXoDS_ = datasource; mapper_ = mapper; } public ExoDatasource getExoDatasource() { return eXoDS_; } abstract public T load(long id) throws Exception; abstract public PageList loadAll() throws Exception; abstract public void update(T bean) throws Exception; abstract public void update(List<T> beans) throws Exception; abstract public void save(T bean) throws Exception; abstract public void save(List<T> beans) throws Exception; abstract public void remove(T bean) throws Exception; abstract public T remove(long id) throws Exception; abstract public T createInstance() throws Exception; protected T loadUnique(String query) throws Exception { Connection connection = eXoDS_.getConnection(); try { return loadUnique(connection, query); } catch (Exception e) { throw e; } finally { eXoDS_.closeConnection(connection); } } protected T loadUnique(Connection connection, String query) throws Exception { Statement statement = null; try { statement = connection.createStatement(); // System.out.println(" Executed query: "+query) ; // long startGet = System.currentTimeMillis(); ResultSet resultSet = statement.executeQuery(query); // totalQueryTime += System.currentTimeMillis() - startGet; // System.out.println(" \n\n\n == > total time to Query " + // totalQueryTime+"\n\n"); if (!resultSet.next()) { return null; } T bean = createInstance(); mapper_.mapResultSet(resultSet, bean); resultSet.close(); return bean; } finally { if (statement != null) statement.close(); } } protected void loadInstances(String loadQuery, List<T> list) throws Exception { Connection connection = eXoDS_.getConnection(); try { loadInstances(connection, loadQuery, list); } catch (Exception e) { throw e; } finally { eXoDS_.closeConnection(connection); } } protected void loadInstances(Connection connection, String loadQuery, List<T> list) throws Exception { Statement statement = connection.createStatement(); // long startGet = System.currentTimeMillis(); ResultSet resultSet = statement.executeQuery(loadQuery); // totalQueryTime += System.currentTimeMillis() - startGet; // System.out.println(" \n\n\n == > total time to Query " + // totalQueryTime+"\n\n"); while (resultSet.next()) { T bean = createInstance(); mapper_.mapResultSet(resultSet, bean); list.add(bean); } resultSet.close(); statement.close(); } protected void execute(String query, T bean) throws Exception { Connection connection = eXoDS_.getConnection(); try { execute(connection, query, bean); } catch (Exception e) { throw e; } finally { eXoDS_.closeConnection(connection); } } protected void execute(Connection connection, String query, T bean) throws Exception { PreparedStatement statement = connection.prepareStatement(query); if (bean != null) mapper_.mapUpdate(bean, statement); // System.out.println(" Executed query: "+query) ; // long startGet = System.currentTimeMillis(); statement.executeUpdate(); // totalQueryTime += System.currentTimeMillis() - startGet; // System.out.println(" \n\n\n == > total time to Query " + // totalQueryTime+"\n\n"); eXoDS_.commit(connection); statement.close(); } public <E> E loadDBField(String query) throws Exception { Connection connection = eXoDS_.getConnection(); try { return this.<E> loadDBField(connection, query); } catch (Exception e) { throw e; } finally { eXoDS_.closeConnection(connection); } } @SuppressWarnings("unchecked") protected <E> E loadDBField(Connection connection, String query) throws Exception { Statement statement = connection.createStatement(); long startGet = System.currentTimeMillis(); ResultSet resultSet = statement.executeQuery(query); totalQueryTime += System.currentTimeMillis() - startGet; // System.out.println(" \n\n\n == > total time to Query " + // totalQueryTime+"\n\n"); if (!resultSet.next()) return null; E value = (E)resultSet.getObject(1); resultSet.close(); statement.close(); return value; } protected void execute(String template, List<T> beans) throws Exception { Connection connection = eXoDS_.getConnection(); try { execute(connection, template, beans); } catch (Exception e) { throw e; } finally { eXoDS_.closeConnection(connection); } } protected void execute(Connection connection, String template, List<T> beans) throws Exception { PreparedStatement statement = connection.prepareStatement(template); QueryBuilder builder = eXoDS_.getQueryBuilder(); for (T bean : beans) { String query = builder.mapDataToSql(template, mapper_.toParameters(bean)); statement.addBatch(query); LOG.info(" addBatch " + query); } statement.executeBatch(); statement.close(); eXoDS_.commit(connection); } public DBObjectMapper<T> getDBObjectMapper() { return mapper_; } }