Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 4 – DAO, JDBC
2 Содержание Шаблон проектирования DAO Поддержка JDBC в Spring Framework javax.sql.DataSource Конфигурирование javax.sql.DataSource JdbcTemplate RowMapper JdbcDaoSupport Параметризированные SQL- запросы JdbcTemplate :: Insert / Update / Delete JdbcTemplate :: Другие SQL запросы
3 Spring :: Шаблон проектирования DAO
4
5 BOOK ID: integer TITLE : varchar COMMENT : varchar DATE_RELEASE : timestamp AUTHOR_ID: integer
6 Spring :: Шаблон проектирования DAO Spring DAO – модуль для работы с данными; Упрощает использование таких технологий как JDBC, Hibernate, JDO, etc.; Позволяет относительно просто переключаться с одной технологии на другую; Упрощает обработку специфичных исключений;
7 Spring :: Шаблон проектирования DAO Spring оборачивает все исключения, специфичные для конкретной технологии (например, SQLException), в свою иерархию исключений, где корнем является DataAccessException; Более тонкая проверка исключений Также для Hibernate, JDO и JPA, Spring оборачивает проверяемые исключение и делает из них исключения времени выполнения;
8 Spring :: Шаблон проектирования DAO Абстракция для разработки структуры данных независимо от конкретной БД; Упрощает код и обеспечивает прозрачность бизнес - объектов; Облегчает переносимость с одной БД (ORM, etc.) на другую; Концентрирует механизм доступа к данным на отдельном уровне;
9 Spring :: Поддержка JDBC
10 Spring :: Поддержка JDBC Зачем нам JDBC, если есть ORM? Гибкость: использование всех возможностей СУБД Прозрачность JDBC – все под контролем Производительность Нет магии Почему нам недостаточно простого (plain) JDBC? Утомительная обработка исключений Ручное управление транзакциями Нет маппинга данных на объекты Большое количество сервисного кода
11 Spring :: Пример на чистом JDBC
12 Spring :: Пример на Spring+JDBC
13 Spring :: Сравнение Spring и JDBC
14 Spring :: Поддержка JDBC Основные классы для работы с JDBC в Spring: javax.sql.DataSource - Отвечает за соединение с БД; JdbcTemplate - Основной класс, отвечает за весь процесс выполнения запросов; RowMapper - Отвечает за mapping каждой строки запроса; JdbcDaoSupport - Упрощает конфигурацию и передачу параметров;
15 Spring :: javax.sql.DataSource Интерфейс DataSource – часть JDBC спецификации – фабрика соединений; Spring получает соединение с базой через DataSource; DataSource позволяет спрятать получение соединений и управление транзакциями;
16 Spring :: Получение javax.sql.DataSource Как получить DataSource? Сконфигурировать свой: Это упрощает unit-тестирование; Не нужен веб-контейнер; Через JNDI; Реализации DataSource: Apache DBCP; c3p0;
17 Database Connection Pool (dbcp) Когда новый пользователь запрашивает доступ к БД, ему выдаётся уже открытое соединение из пула соединений Открытие соединения с БД занимает время Если все открытые соединения уже заняты, создаётся новое Как только пользователь освобождает одно из уже существующих соединений, оно становится доступно для других пользователей Если соединение долго не используется, оно закрывается Spring :: Получение javax.sql.DataSource
18 Spring :: Конфигурирование javax.sql.DataSource Используем JNDI: <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
19 Spring :: Конфигурирование javax.sql.DataSource Для прототипирования и тестирования Spring предоставляет возможность поднятия в контексте встроенных БД (HSQLDB / H2 / Derby). По умолчанию используется HSQLDB. или
20 Spring :: JdbcTemplate JdbcTemplate - основной класс из пакета org.springframework.jdbc.core: Выполняет SQL-запросы; Итерируется по результатам; Отлавливает JDBC исключения; Параметры, необходимые для выполнения SQL-запроса: DataSource; RowMapper; Строка SQL-запроса;
21 Spring :: JdbcTemplate Экземпляр класса JdbcTemplate является потокобезопасным; Можно конфигурировать его один раз, а потом использовать во многих DAO; Для создания JdbcTemplate необходим DataSource; Обычно DataSource передается в DAO, а оттуда в JdbcTemplate;
22 Spring :: RowMapper BOOK ID: integer TITLE : varchar COMMENT : varchar DATE_RELEASE : timestamp Мэппинг данных из БД в объектную модель RowMapper выполняет мэппинг ResultSetа в конкретные объекты ResultSetRowMapper Book mapRow(ResultSet rs, int rowNum)
23 Spring :: RowMapper
24 Spring :: PreparedStatementSetter BOOK ID: integer TITLE : varchar COMMENT : varchar DATE_RELEASE : timestamp Мэппинг данных из объектной модели в SQL PreparedStatementSetter выполняет мэппинг объекта в SQL-запрос SQLPreparedStatement getPreparedStatementSetter (final Book book) +
25 Spring :: PreparedStatementSetter
26 Spring :: JdbcTemplate - пример Создаем таблицы и бизнес-объекты; Конфигурируем DataSource; Создаем класс DAO; Передаем DataSource в DAO; Реализуем RowMapper; Создаем экземпляр JdbcTemplate; Передаем ему DataSource; Вызываем метод query(); Параметры – SQL-запрос и RowMapper;
27 Spring :: JdbcTemplate - пример При вызове метода countryDao.getCountryList() получаем список объектов типа Country.
28 Spring :: JdbcTemplate - пример
29 Spring :: JdbcDaoSupport Можно DAO классы делать наследниками от JdbcDaoSupport; В этом случае метод setDataSource(..) уже будет реализован; JdbcDaoSupport упрощает работу с DataSource и «прячет» создание JdbcTemplate;
30 public class JdbcCustomerDAO extends JdbcDaoSupport implements CustomerDAO { //no need to set datasource here public void insert(Customer customer) { String sql = "INSERT INTO CUSTOMER (CUST_ID, NAME, AGE) + VALUES (?, ?, ?) »; getJdbcTemplate().update(sql, new Object[] { customer.getCustId(), customer.getName(),customer.getAge() }); } <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> Spring :: JdbcDaoSupport
31 Spring :: NamedParameterJdbcTemplate Параметризированные SQL- запросы создаются с использованием NamedParameterJdbcTemplate Конфигурация такая же как для JdbcTemplate;
32 Spring :: ParameterizedRowMapper
33 Spring :: JdbcTemplate :: Insert Insert, Update и Delete выполняются аналогично; Отличия только в SQL-запросе;
34 Spring :: JdbcTemplate :: Другие SQL запросы Для выполнения любого SQL-запроса может быть использован метод execute из JdbcTemplate:
35 Spring :: Иерархия исключений DAO
36 public class CustomSQLErrorCodesTranslator extends SQLErrorCodeSQLExceptionTranslator { protected DataAccessException customTranslate(String task, String sql, SQLException sqlex) { if (sqlex.getErrorCode() == ) { return new DeadlockLoserDataAccessException(task, sqlex); } return null; } private JdbcTemplate jdbcTemoplate; public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(); this.jdbcTemplate.setDataSource(dataSource); CustomSQLErrorCodesTranslator tr = new CustomSQLErrorCodesTranslator(); tr.setDataSource(dataSource); this.jdbcTemplate.setExceptionTranslator(tr); } Spring :: Собственный обработчик исключений DAO
37 Упражнения :6 : «Использование JDBC в Spring при работе с данными» – 45 мин – самостоятельная работа; – 15 мин – обсуждение;
38 Вопросы!?