package org.genedb.query.sql; import org.apache.log4j.Logger; import org.genedb.query.AbstractQuery; import org.genedb.query.Result; import org.genedb.query.SimpleListResult; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.datasource.SingleConnectionDataSource; /** * Query that retrieves information from a database * * @author art */ public class SqlQuery extends AbstractQuery implements DataSourceAware { protected String sql; protected DataSource dataSource; /** * The args that will be injected into the sql statement placeholders ('?'). */ protected Object[] args; private static final Logger logger = Logger.getLogger(SqlQuery.class); public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void setSql(String sql) { this.sql = sql; } /** * A setter for the args object. It's protected so that the subclasses have to call it. * * @param args */ protected void setArgs(Object[] args) { this.args = args; } public Object[] getArgs() { return args.clone(); } /** * @param args */ public static void main(String[] args) throws SQLException { SqlQuery sq= new SqlQuery(); sq.setSql("select gp.geneId from GenePeri gp where gp.nickname like ? and gp.genename like ?"); //sq.setSql("select * from GenePeri"); SingleConnectionDataSource ds = new SingleConnectionDataSource(); ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); ds.setUrl("jdbc:oracle:thin:@ocs3:1534:pat"); ds.setUsername("gus2"); ds.setPassword("genedb2"); sq.setDataSource(ds); Result res = sq.process(); System.out.println(res); ds.destroy(); } /** * @see org.genedb.zoe.query.Query#process() */ public Result process() { final SimpleListResult slr = new SimpleListResult(); JdbcTemplate jt = new JdbcTemplate(dataSource); jt.query(sql, args, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { ResultSetMetaData meta = rs.getMetaData(); int colNum = meta.getColumnCount(); Object[] result = new Object[colNum]; // gv1 notes that this doesn't take into account column names for (int i = 1; i <= colNum;i++) { result[i-1] = rs.getObject(i); } slr.add(result); } } ); return slr; } /** * * Will run the query using the supplied callBack. * * @param callBack * @throws Exception */ public void processCallBack(RowCallbackHandler callBack) { JdbcTemplate jt = new JdbcTemplate(dataSource); logger.debug(args); logger.debug(sql); jt.query(sql, args, callBack); } public void processCallBack(String _sql, Object[] _args, RowCallbackHandler callBack) { JdbcTemplate jt = new JdbcTemplate(dataSource); logger.debug(_args); logger.debug(_sql); jt.query(_sql, _args, callBack); } // @Override // public void writeSpringBean(PrintWriter pw) { // pw.println("\tGot a sql query"); // addProperty(pw, "description", getDescription()); // addProperty(pw, "help", getHelp()); // addProperty(pw, "sql", getSql()); // } // private void addProperty(PrintWriter pw, String key, String value) { // pw.println("\t\t<property name=\""+key+"\" value=\""+value+"\" />"); // } protected String getSql() { return this.sql; } public int getIndex() { // TODO Auto-generated method stub return 0; } public void setIndex(int index) { // TODO Auto-generated method stub } }