Spring JDBC и объект подключения

Я создаю приложение, используя проприетарный API. Для подключения к базе данных я использую метод, который возвращает объект Connection, а затем в этом соединении я вызываю соответствующие методы для выполнения запросов к базе данных, например....

Connection conn = JdbcServiceFactory.getInstance().getDefaultDatabase().getConnectionManager().getConnection();

PreparedStatement ps = conn.prepareStatement("select * from test");

Если я решу использовать Spring MVC 3 для своего следующего проекта, что мне нужно сделать, чтобы настроить подключение к базе данных? Из того, что я видел в документации, я использовал тег источника данных в контейнере и передал URL-адрес, имя пользователя и пароль. Как показано, в настоящее время мне не нужно делать это, чтобы установить соединение.


person Robert    schedule 31.07.2012    source источник


Ответы (1)


В конце концов, ваш проприетарный API должен получить доступ к некоторой базе данных (доступной на каком-то сервере) с использованием некоторых учетных данных. Вы просто этого не видите. В Spring вы должны сначала определить некоторые DataSource. Либо используйте существующие библиотеки, такие как dbcp, bonecp или класса c3p0 или взять вопрос, предоставленный вашим сервером приложений через класс jndi. Пока они реализуют интерфейс DataSource, не имеет значения, какой подход вы выберете. Слишком много, чтобы объяснять каждую подробно.

После настройки компонента DataSource я настоятельно рекомендую использовать JdbcTemplate, что значительно упрощает код JDBC, например:

 List<Map<String,Object>> res = jdbcTemplate.queryForList("select * from test");

...и многое другое.

ОБНОВЛЕНИЕ. Если вы хотите использовать существующий устаревший API с современными платформами, ожидающими DataSource (почти все из них), реализация адаптера DataSource тривиальна (остальные методы могут остаться нереализованными, выбрасывая UnsupportedOperationException):

public class LegacyDataSourceAdapter implements DataSource {
    @Override
    public Connection getConnection() throws SQLException {
        return JdbcServiceFactory.getInstance().getDefaultDatabase().getConnectionManager().getConnection();
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return getConnection();
    }

    //other methods are irrelevant
}

Теперь просто создайте экземпляр LegacyDataSourceAdapter (возможно, как компонент Spring) и передайте его в JdbcTemplate, Hibernate, myBatis...


Кстати, у вас есть первоклассный пример плохого дизайна API:

Connection conn = JdbcServiceFactory.
  getInstance().
  getDefaultDatabase().
  getConnectionManager().
  getConnection();
person Tomasz Nurkiewicz    schedule 31.07.2012
comment
Спасибо за ответ. Проблема в том, что учетные данные скрыты от меня, и я не уверен, что используется для подключения. Мне было интересно, есть ли способ использовать существующие библиотеки, которые вы упомянули, без использования учетных данных и просто объекта подключения, и похоже, что его нет. Спасибо за помощь. - person Robert; 01.08.2012
comment
@Robert: на самом деле это возможно, см. Мое обновление. Вам нужно только обернуть вашу устаревшую библиотеку адаптером DataSource. - person Tomasz Nurkiewicz; 01.08.2012
comment
Вы мне очень помогли. Хорошего дня. Спасибо. - person Robert; 03.08.2012