/** * Copyright 1999-2011 Alibaba Group * * 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. */ package com.alibaba.cobar.client; import java.sql.SQLException; import java.util.Collection; import org.springframework.dao.DataAccessException; import org.springframework.orm.ibatis.SqlMapClientCallback; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ibatis.sqlmap.client.SqlMapExecutor; /** * A DAO base class definition which adds more helper methods on batch * operations.<br> * Users can configure their DAO implementations with same configuration items * of {@link CobarSqlMapClientTemplate}.<br> * <br> * Feature requested by Yao Ming. * * @author fujohnwang * @since 1.0 */ public class CobarSqlMapClientDaoSupport extends SqlMapClientDaoSupport { public int batchInsert(final String statementName, final Collection<?> entities) throws DataAccessException { if (isPartitionBehaviorEnabled()) { int counter = 0; DataAccessException lastEx = null; for (Object parameterObject : entities) { try { getSqlMapClientTemplate().insert(statementName, parameterObject); counter++; } catch (DataAccessException e) { lastEx = e; } } if (lastEx != null) { throw lastEx; } return counter; } else { return (Integer) getSqlMapClientTemplate().execute(new SqlMapClientCallback() { public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { executor.startBatch(); for (Object item : entities) { executor.insert(statementName, item); } return executor.executeBatch(); } }); } } public int batchDelete(final String statementName, final Collection<?> entities) throws DataAccessException { if (isPartitionBehaviorEnabled()) { int counter = 0; DataAccessException lastEx = null; for (Object entity : entities) { try { counter += getSqlMapClientTemplate().delete(statementName, entity); } catch (DataAccessException e) { lastEx = e; } } if (lastEx != null) { throw lastEx; } return counter; } else { return (Integer) getSqlMapClientTemplate().execute(new SqlMapClientCallback() { public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { executor.startBatch(); for (Object parameterObject : entities) { executor.delete(statementName, parameterObject); } return executor.executeBatch(); } }); } } public int batchUpdate(final String statementName, final Collection<?> entities) throws DataAccessException { if (isPartitionBehaviorEnabled()) { int counter = 0; DataAccessException lastEx = null; for (Object parameterObject : entities) { try { counter += getSqlMapClientTemplate().update(statementName, parameterObject); } catch (DataAccessException e) { lastEx = e; } } if (lastEx != null) { throw lastEx; } return counter; } else { return (Integer) getSqlMapClientTemplate().execute(new SqlMapClientCallback() { public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { executor.startBatch(); for (Object parameterObject : entities) { executor.update(statementName, parameterObject); } return executor.executeBatch(); } }); } } protected boolean isPartitionBehaviorEnabled() { if (getSqlMapClientTemplate() instanceof CobarSqlMapClientTemplate) { return ((CobarSqlMapClientTemplate) getSqlMapClientTemplate()) .isPartitioningBehaviorEnabled(); } return false; } }