JDBC надає java-додатків стандартний спосіб доступу до даних, що зберігаються в базі даних. Для того, щоб інфраструктура JDBC могла працювати з базою даних, потрібен специфічний для конкретної бази даних драйвер.
Спочатку цей драйвер завантажується в пам'ять, потім він реєструється за допомогою класу java.sql.DriverManager. Клас java.sql.DriverManager управляє списком драйверів і надає статичні методи для встановлення підключення до бази даних.
Статичний метод getConnection () класу java.sql.DriverManager повертає інтерфейс java.sql.Connection реалізація якого надається драйвером. Цей інтерфейс дозволяє запускати SQL-оператори для будь-якої бази даних (в даному випадку для тієї, для якої зареєстрований драйвер).
У цьому пості розглянемо взаємодію з базою даних через чистий JDBC. Так як підключення до бази даних через JDBC є витратним, крім того для кожного запиту до бази даних буде створюватися нове підключення, то варіант роботи програми з базою даних наведений в цьому пості не є правильним рішенням, сенс тут в тому, щоб по працювати з базою даних через чистий JDBC щоб мати уявлення про те, які дії робляться для управління підключенням JDBC. тому що в звичайних проектах працювати з JDBC на пряму не доведеться, а в наступному пості розглянемо більш правильні способи, наприклад, через пул підключень.
Схожі пости
Структура бази даних Warehouse
Схема бази даних
Діаграма сутність-відношення або entity-relationship ER:
SQL-сценарій для створення простої моделі даних:
create-data-model.sql
SQL-сценарій для наповнення даними:
fill-database.sql
Для того, щоб швидко створити базу даних і заповнити її даними потрібно послідовно виконати сценарії create-data-model.sql і fill-database.sql.
Відкриваємо командний рядок і вводимо:
Після виконання цих скриптів, повинна створитися база, показана нижче:
структура проекту
Класи предметної області. пакет com.dev.blogs.model
Provider.java
Warehouse.java
Пакет com.dev.blogs.dao - рівень доступу до даних.
Додамо інтерфейси Dao. які інкапсулюють все служби доступу до даних для інформації про склад. У цих інтерфейсах визначені всі методи які об'єднуються в термін CRUD (Create, Read, Update, Delete) - створення, читання, оновлення та видалення.
ItemDao.java
WarehouseDao.java
пакет com.dev.blogs.dao.impl
Реалізація інтерфейсів надають служби доступу до даних.
ItemDaoImpl.java
WarehouseDaoImpl.java
Недолік цього коду в тому, що для взаємодії з базою даних через чистий JDBC потрібно кожен раз створювати нове підключення до бази даних при кожному зверненні. Це дуже накладно, тому що встановлення нового підключення процес витратний.
PreparedStatement
У цьому прикладі для запитів ми використовуємо клас PreparedStatement на якому я б хотів зупинитися трохи детальніше. По-перше навіщо ми беремо саме цей клас, адже для виконання запитів є ще класи Statement і CallableStatement.
Якщо коротко, то клас PreparedStatement прискорює обробку запитів в порівнянні з Statement. Тепер як він це робить.
пакет com.dev.blogs
Клас DataSource обертає клас java.sql.DriverManager і повертає з'єднання з базою даних у вигляді класу реалізує інтерфейс java.sql.Connection. По суті він управляє з'єднанням з базою даних. В місце нього можна було б використовувати спрінговий клас org.springframework.jdbc.datasource.DriverManagerDataSource. який робить те ж саме, але я вирішив використовувати свій клас, щоб краще зрозуміти як реалізовані спрінговие джерела даних, єдине чим відрізняється мій клас, від бібліотечного тим, що я не реалізовував інтерфейс javax.sql.DataSource і не дотримувався ніяких конвенцій, тому імена моїх методів будуть відрізнятися від методів бібліотечних класів. Так само в місце нього можна і навіть потрібно використовувати клас org.apache.commons.dbcp.BasicDataSource який доступний в Apache або клас джерела даних, реалізований одним з серверів додатків такими як JBoss. WebSphere. WebLogic. GlassFish тощо. Які можуть збільшити продуктивність програми.
DataSource.java
Для цього Біна ми не вказуємо анотацію Component. а оголошуємо його в файлі конфігурації, так так як ми не просто хочемо створити бін, а нам необхідно конфігурувати його, а коли справа стосується конфігурації біна, то краще його конфігурувати в окремому конфіге.
TestSimpleJdbc.java
spring-context.xml
jdbc.properties
Збірка і запуск
Для того щоб запустити проект, потрібно додати залежність mysql-connector-java (рядки 35-39):
Тепер запустимо проект. Так як у нас тільки тести, то тести і будемо запускати. Відкрийте командний рядок і введіть:
Результатом запуску тестів має бути Tests run: 2, Failures: 0, Errors: 0, Skipped: 0.
недоліки JDBC
Очевидний недолік використання JCDB крім того, що він не економить ресурси бази даних, це те, що доводиться повторювати однаковий код.
Коли я готував код для цього прикладу спочатку я додав логіку доступу до даних в класі WarehouseDaoImpl.java. а потім довелося теж саме робити в класі ItemDaoImpl.java. тобто довелося два рази переписувати одну і те ж логіку для шару DAO. Не кожному вистачить терпіння повторювати один і той же код в кожному класі DAO. Тому в наступному пості ми розглянемо приклад доступу до даних за коштами spring. який бере на себе всі службові дії.