/** * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ package org.ralasafe.db.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.ralasafe.db.Column; import org.ralasafe.db.ColumnAdapter; import org.ralasafe.db.DBLevelException; import org.ralasafe.db.DBPower; import org.ralasafe.db.FieldWhereElement; import org.ralasafe.db.Table; import org.ralasafe.db.TableDeletor; import org.ralasafe.db.WhereElement; import org.ralasafe.db.WhereElementUtil; import org.ralasafe.util.DBUtil; import org.ralasafe.util.Util; public class TableDeletorImpl implements TableDeletor { private Table table; private String deleteSql; private static Log logger=LogFactory.getLog( TableUpdatorImpl.class ); public Table getTable() { return table; } public void setTable( Table table ) { this.table=table; if( !Util.isEmpty( table.getIdColumns() ) ) { deleteSql=DBUtil.deleteSql( table.getName(), table.getIdColumnNames() ); } } public void deleteByIdColumns( Object o ) { Connection conn=null; try { conn=DBPower.getConnection( table.getId() ); deleteByIdColumns( conn, o ); } finally { DBUtil.close( conn ); } } public void deleteByIdColumns( Connection conn, Object o ) { PreparedStatement pstmt=null; try { pstmt=conn.prepareStatement( deleteSql ); // set DELETE WHERE PART VALUES Column[] idColumns=table.getIdColumns(); for( int i=0; i<idColumns.length; i++ ) { Column column=idColumns[i]; ColumnAdapter columnAdapter=column.getAdapter(); columnAdapter.setPreparedStatement( pstmt, i+1, o ); } pstmt.executeUpdate(); } catch( SQLException e ) { logger.error( "", e ); throw new DBLevelException( e ); } finally { DBUtil.close( pstmt ); } } public void delete( WhereElement emt, Object o ) { Connection conn=null; try { conn=DBPower.getConnection( table.getId() ); delete( conn, emt, o ); } finally { DBUtil.close( conn ); } } public void delete( Connection conn, WhereElement emt, Object o ) { String sql=WhereElementUtil.toSql( emt ); List byColumns=new LinkedList(); List hints=new LinkedList(); WhereElementUtil.extractColumns( emt, byColumns, o, hints ); PreparedStatement pstmt=null; try { pstmt=conn.prepareStatement( "DELETE FROM " + table.getName() + " " + sql ); if( byColumns.size()>0 ) { int i=1; Iterator hintIter=hints.iterator(); for( Iterator columnIter=byColumns.iterator(); columnIter.hasNext(); ) { Column column=(Column) columnIter.next(); ColumnAdapter adapter=column.getAdapter(); adapter.setPreparedStatement( pstmt, i, hintIter.next() ); i++; } } pstmt.executeUpdate(); } catch( SQLException e ) { logger.error( "", e ); throw new DBLevelException( e ); } finally { DBUtil.close( pstmt ); } } }