All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jpattern.orm.jdbctemplate.JdbcTemplateSqlPerformerStrategy Maven / Gradle / Ivy

There is a newer version: 5.3.0
Show newest version
package com.jpattern.orm.jdbctemplate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.jpattern.orm.exception.OrmException;
import com.jpattern.orm.session.ISqlPerformerStrategy;
import com.jpattern.orm.session.IGeneratedKeyReader;
import com.jpattern.orm.session.IPreparedStatementCreator;
import com.jpattern.orm.session.IResultSetReader;
import com.jpattern.orm.session.SqlSelectQuery;

/**
 * 
 * @author Francesco Cina
 *
 * 02/lug/2011
 * 
 * ISqlExecutor implementation using JdbcTemplate as backend
 */
public class JdbcTemplateSqlPerformerStrategy implements ISqlPerformerStrategy {

	private final JdbcTemplate jdbcTemplate;

	public JdbcTemplateSqlPerformerStrategy(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	@Override
	public void execute(String sql, int timeout) throws OrmException {
		int oldTimeout = jdbcTemplate.getQueryTimeout();
		try {
			jdbcTemplate.setQueryTimeout(timeout);
			jdbcTemplate.execute(sql);
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

	@Override
	public  T query(SqlSelectQuery sqlSelectQuery, IResultSetReader rse) throws OrmException {
		int oldMaxRows = sqlSelectQuery.getMaxRows();
		int oldTimeout = sqlSelectQuery.getTimeout();
		try {
			jdbcTemplate.setMaxRows(sqlSelectQuery.getMaxRows());
			jdbcTemplate.setQueryTimeout(sqlSelectQuery.getTimeout());
			return jdbcTemplate.query(sqlSelectQuery.getSql(), sqlSelectQuery.getArgs() , new ResultSetReaderWrapper(rse) );
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setMaxRows(oldMaxRows);
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

	@Override
	public int update(String sql, int timeout, Object... args) throws OrmException {
		int oldTimeout = jdbcTemplate.getQueryTimeout();
		try {
			jdbcTemplate.setQueryTimeout(timeout);
			return jdbcTemplate.update(sql, args);
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

	@Override
	public int update(final String sql, int timeout, final IGeneratedKeyReader generatedKeyReader, final Object... args) throws OrmException {
		int oldTimeout = jdbcTemplate.getQueryTimeout();
		try {
			PreparedStatementCreator psc = new PreparedStatementCreator() {
				@Override
				public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
					PreparedStatement ps = null;
					ps = con.prepareStatement( sql , generatedKeyReader.generatedColumnNames());
										
					int i = 0;
					for (Object value : args ) {
						ps.setObject(++i, value);
					}
					return ps;
				}
			};
			
			KeyHolder keyHolder = new GeneratedKeyHolder();
			jdbcTemplate.setQueryTimeout(timeout);
			int result = jdbcTemplate.update(psc, keyHolder);
			generatedKeyReader.read(new GeneratorKeyResultSet(keyHolder));
			return result;
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

	@Override
	public int[] batchUpdate(List sqls, int timeout) throws OrmException {
		int oldTimeout = jdbcTemplate.getQueryTimeout();
		try {
			jdbcTemplate.setQueryTimeout(timeout);
			return jdbcTemplate.batchUpdate(sqls.toArray(new String[0]));
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

	@Override
	public int[] batchUpdate(final String sql, final List args, int timeout) throws OrmException {
		int oldTimeout = jdbcTemplate.getQueryTimeout();
		try {
			BatchPreparedStatementSetter bpss = new BatchPreparedStatementSetter() {
				
				@Override
				public void setValues(PreparedStatement ps, int i) throws SQLException {
					int count = 0;
					for ( Object object : args.get(i) ) {
						ps.setObject(++count, object);
					}
				}
				
				@Override
				public int getBatchSize() {
					return args.size();
				}
			};
			jdbcTemplate.setQueryTimeout(timeout);
			return jdbcTemplate.batchUpdate(sql, bpss);
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

	@Override
	public int[] batchUpdate(String sql, final IPreparedStatementCreator psc, int timeout) throws OrmException {
		int oldTimeout = jdbcTemplate.getQueryTimeout();
		try {
			BatchPreparedStatementSetter bpss = new BatchPreparedStatementSetter() {
				@Override
				public void setValues(PreparedStatement ps, int i) throws SQLException {
					psc.set(ps, i);
				}
				@Override
				public int getBatchSize() {
					return psc.getBatchSize();
				}
			};
			jdbcTemplate.setQueryTimeout(timeout);
			return jdbcTemplate.batchUpdate(sql, bpss);
		} catch (Exception e) {
			throw new OrmException(e);
		} finally {
			jdbcTemplate.setQueryTimeout(oldTimeout);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy