package spring.test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class DbTestDao {
JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional(readOnly = true)
public List getCustomers() {
return jdbcTemplate.query("select id, name, customer_since from customers",
new CustomerMapper());
}
// NOT Transactional - using Sybase temp tables
public List getSomeCustomers(final List ids) {
SingleConnectionDataSource scds = null;
try {
scds = new SingleConnectionDataSource(jdbcTemplate.getDataSource().getConnection(), true);
} catch (SQLException e) {
throw new DataAccessResourceFailureException("Unable to create single connnection ds", e);
}
List results;
try {
JdbcTemplate scdsJdbcTemplate = new JdbcTemplate(scds);
scdsJdbcTemplate.execute("create table #my_ids (id int)");
scdsJdbcTemplate.batchUpdate("insert into #my_ids(id) values(?)",
new BatchPreparedStatementSetter() {
public int getBatchSize() {
return ids.size();
}
public void setValues(PreparedStatement ps, int i)
throws SQLException {
ps.setLong(1, ids.get(i));
}
});
results = scdsJdbcTemplate.query(
"select id, name, customer_since from customers where id in (select id from #my_ids)",
new CustomerMapper());
scdsJdbcTemplate.execute("drop table #my_ids");
}
finally {
scds.destroy();
}
return results;
}
public class CustomerMapper implements RowMapper {
public Object mapRow(ResultSet rs, int row) throws SQLException {
Customer c = new Customer();
c.setId(rs.getLong(1));
c.setName(rs.getString(2));
c.setCustomerSince(rs.getDate(3));
return c;
}
}
}
Referência
Full Stack Developer, DevOps, CSM e LKU. coutoarmando@gmail.com