/* * Copyright 2010 Dennis Butterstein, Ralf Joachim * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * $Id: SQLStatementDelete.java 8469 2009-12-28 16:47:54Z rjoachim $ */ package org.castor.cpa.persistence.sql.engine; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; import org.castor.cpa.persistence.sql.driver.DB2Factory; import org.castor.cpa.persistence.sql.driver.InformixFactory; import org.castor.cpa.persistence.sql.driver.MySQLFactory; import org.castor.cpa.persistence.sql.driver.OracleFactory; import org.castor.cpa.persistence.sql.driver.PostgreSQLFactory; import org.castor.cpa.persistence.sql.driver.ProgressFactory; import org.castor.cpa.persistence.sql.driver.SQLServerFactory; import org.castor.cpa.persistence.sql.driver.SapDbFactory; import org.castor.cpa.persistence.sql.driver.SybaseFactory; import org.castor.cpa.persistence.sql.query.Delete; import org.castor.cpa.persistence.sql.query.Insert; import org.castor.cpa.persistence.sql.query.Select; import org.castor.cpa.persistence.sql.query.Update; import org.castor.cpa.persistence.sql.query.Visitor; import org.castor.cpa.persistence.sql.query.condition.Condition; import org.castor.cpa.persistence.sql.query.visitor.DB2QueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.DefaultQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.InformixQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.MySQLQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.OracleQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.ParameterVisitor; import org.castor.cpa.persistence.sql.query.visitor.PostgreSQLQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.ProgressQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.SQLServerQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.SapDbQueryVisitor; import org.castor.cpa.persistence.sql.query.visitor.SybaseQueryVisitor; import org.castor.jdo.engine.SQLTypeInfos; import org.exolab.castor.persist.spi.PersistenceFactory; /** * CastorStatement class to wrap handling of PreparedStatements by providing functionality * to prepare statements, bind parameters, execute statements and, close statements. * * @author <a href="mailto:madsheepscarer AT googlemail DOT com">Dennis Butterstein</a> * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> * @version $Revision: 8469 $ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $ */ public final class CastorStatement { //----------------------------------------------------------------------------------- /** Variable to store local instance of the used PersistenceFactory. */ private final PersistenceFactory _factory; /** Variable to store local instance of the used Connection. */ private final Connection _connection; /** Variable to store local instance of the used PreparedStatment. */ private PreparedStatement _statement; /** Variable to store local instance of the used PreparedStatment. */ private Map<String, Integer> _parameters; /** Variable to store local instance of the query visitor. */ private Visitor _queryVis; //----------------------------------------------------------------------------------- /** * Constructor. * * @param factory Instance of PersistenceFactory to be used to create CastorStatements. * @param connection Instance of the connection to be used to create CastorStatements. */ public CastorStatement(final PersistenceFactory factory, final Connection connection) { _factory = factory; _connection = connection; } //----------------------------------------------------------------------------------- /** * Method returning statement currently set. * * @return Statement currently set. */ public PreparedStatement getStatement() { return _statement; } /** * Method to set statement. * * @param stmt Statement to be set */ public void setStatement(final PreparedStatement stmt) { _statement = stmt; } /** * Method returning size of the parameter map. * * @return Size of the current parameter map of the QueryContext. * @throws SQLException Reports database access errors. */ public int getParameterSize() throws SQLException { if (_parameters == null) { throw new SQLException("Parameters not prepared!"); } return _parameters.size(); } //----------------------------------------------------------------------------------- /** * Method to prepare select statement and store it in local Variable. * * @param select Prepared select-object to create statement for. * @throws SQLException Reports database access errors. */ public void prepareStatement(final Select select) throws SQLException { ParameterVisitor parmVis = new ParameterVisitor(); parmVis.visit(select); _parameters = parmVis.getParameters(); _queryVis = getMatchingQueryVisitor(_factory.getFactoryName()); _queryVis.visit(select); _statement = _connection.prepareStatement(_queryVis.toString()); } /** * Method to prepare insert statement and store it in local Variable. * * @param insert Prepared insert-object to create statement for. * @throws SQLException Reports database access errors. */ public void prepareStatement(final Insert insert) throws SQLException { ParameterVisitor parmVis = new ParameterVisitor(); parmVis.visit(insert); _parameters = parmVis.getParameters(); _queryVis = getMatchingQueryVisitor(_factory.getFactoryName()); _queryVis.visit(insert); _statement = _connection.prepareStatement(_queryVis.toString()); } /** * Method to prepare update statement, append passed condition and store it in * local Variable. * * @param update Prepared update-object to create statement for. * @param condition Condition to be appended to the QueryContext. * @throws SQLException Reports database access errors. */ public void prepareStatement(final Update update, final Condition condition) throws SQLException { update.setCondition(condition); ParameterVisitor parmVis = new ParameterVisitor(); parmVis.visit(update); _parameters = parmVis.getParameters(); _queryVis = getMatchingQueryVisitor(_factory.getFactoryName()); _queryVis.visit(update); _statement = _connection.prepareStatement(_queryVis.toString()); } /** * Method to prepare delete statement and store it in local Variable. * * @param delete Prepared delete-object to create statement for. * @throws SQLException Reports database access errors. */ public void prepareStatement(final Delete delete) throws SQLException { ParameterVisitor parmVis = new ParameterVisitor(); parmVis.visit(delete); _parameters = parmVis.getParameters(); _queryVis = getMatchingQueryVisitor(_factory.getFactoryName()); _queryVis.visit(delete); _statement = _connection.prepareStatement(_queryVis.toString()); } /** * Method to bind passed parameters to the local statement. * * @param name Name of the parameter to be bound. * @param value Value of the parameter to be bound. * @param type Type of the parameter to be bound. * @throws SQLException Reports database access errors. */ public void bindParameter(final String name, final Object value, final int type) throws SQLException { if (_statement == null) { throw new SQLException("Statment not prepared!"); } if (_parameters == null) { throw new SQLException("Parameters not prepared!"); } Integer index = _parameters.get(name); if (index != null) { SQLTypeInfos.setValue(_statement, index.intValue(), value , type); } else { System.out.println("Unknown parameter: " + name); } } /** * Method to execute prepared statement. * * @return Numeric value telling about success of the execution of the statement. * @throws SQLException Reports database access errors. */ public int executeUpdate() throws SQLException { if (_statement == null) { throw new SQLException("Statment not prepared!"); } return _statement.executeUpdate(); } /** * Method to execute prepared statement and return ResultSet. * * @return ResultSet containing data returned from database. * @throws SQLException Reports database access errors. */ public ResultSet executeQuery() throws SQLException { if (_statement == null) { throw new SQLException("Statment not prepared!"); } return _statement.executeQuery(); } /** * Method to close the prepared statement. * * @throws SQLException Reports database access errors. */ public void close() throws SQLException { _queryVis = null; if (_statement != null) { _statement.close(); _statement = null; } } /** * Method to get string representation of the existing query string. * * @return String representation of the existing query string. */ public String toString() { if (_queryVis == null) { return null; } return _queryVis.toString(); } /** * Method to determine correct implementation of database specific visitor * to be used to construct statement. * * @param factoryName Name of the used factory * @return Visitor instance of the specific query visitor to be used. */ private Visitor getMatchingQueryVisitor(final String factoryName) { if (factoryName == DB2Factory.FACTORY_NAME) { return new DB2QueryVisitor(); } else if (factoryName == InformixFactory.FACTORY_NAME) { return new InformixQueryVisitor(); } else if (factoryName == MySQLFactory.FACTORY_NAME) { return new MySQLQueryVisitor(); } else if (factoryName == OracleFactory.FACTORY_NAME) { return new OracleQueryVisitor(); } else if (factoryName == PostgreSQLFactory.FACTORY_NAME) { return new PostgreSQLQueryVisitor(); } else if (factoryName == ProgressFactory.FACTORY_NAME) { return new ProgressQueryVisitor(); } else if (factoryName == SapDbFactory.FACTORY_NAME) { return new SapDbQueryVisitor(); } else if (factoryName == SQLServerFactory.FACTORY_NAME) { return new SQLServerQueryVisitor(); } else if (factoryName == SybaseFactory.FACTORY_NAME) { return new SybaseQueryVisitor(); } else { return new DefaultQueryVisitor(); } } //----------------------------------------------------------------------------------- }