1 package com.imcode.db;
2
3 import org.apache.commons.dbutils.QueryRunner;
4 import org.apache.commons.dbutils.ResultSetHandler;
5
6 import javax.sql.DataSource;
7 import java.sql.Connection;
8 import java.sql.SQLException;
9
10 public class DatasourceDatabase implements Database {
11
12 private QueryRunner queryRunner = new QueryRunner();
13 private DataSource dataSource;
14
15 public DatasourceDatabase( DataSource dataSource ) {
16 this.dataSource = dataSource;
17 }
18
19 public Object executeCommand( final DatabaseCommand databaseCommand ) throws DatabaseException {
20 try {
21 Connection connection = dataSource.getConnection();
22 try {
23 DatabaseConnection defaultDatabaseConnection = new DatabaseConnectionImpl( connection, queryRunner );
24 return databaseCommand.executeOn( defaultDatabaseConnection );
25 } catch( DatabaseException e ) {
26 throw new DatabaseException( "Executing "+databaseCommand, e ) ;
27 } finally {
28 connection.close() ;
29 }
30 } catch ( SQLException e ) {
31 throw DatabaseException.fromSQLException( null, e );
32 }
33 }
34
35 private static class DatabaseConnectionImpl implements DatabaseConnection {
36
37 private Connection connection;
38 private QueryRunner queryRunner;
39
40 private DatabaseConnectionImpl(Connection connection, QueryRunner queryRunner) {
41 this.connection = connection;
42 this.queryRunner = queryRunner;
43 }
44
45 public int executeUpdate(String sql, Object[] parameters) throws DatabaseException {
46 try {
47 return queryRunner.update(connection, sql, parameters);
48 } catch (SQLException se) {
49 throw DatabaseException.fromSQLException(null, se);
50 }
51 }
52
53 public Number executeUpdateAndGetGeneratedKey(String sql, Object[] parameters) throws DatabaseException {
54 try {
55 return JdbcUtils.executeUpdateAndGetGeneratedKey(connection, sql, parameters);
56 } catch (SQLException se) {
57 throw DatabaseException.fromSQLException(null, se);
58 }
59 }
60
61 public Object executeQuery(String sqlQuery, Object[] parameters,
62 ResultSetHandler resultSetHandler) throws DatabaseException {
63 try {
64 return queryRunner.query(connection, sqlQuery, parameters, resultSetHandler);
65 } catch (SQLException e) {
66 throw DatabaseException.fromSQLException(null, e);
67 }
68 }
69
70 public Connection getConnection() {
71 return connection;
72 }
73 }
74
75 }