КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Технологии доступа к БД в Java. JDBC API
Лекция 7 Для доступа к базам данных в технологии Java принято использовать стандартный API JDBC (Java DataBase Connectivity)[16]. В стандарте определен набор интерфейсов, которые позволяют манипулировать данными в БД передавая команды в виде запросов SQL. JDBC API может использоваться как для простого обмена данных с локальной БД, так и для обмена данными с удалёнными БД в гетерогенной среде. Стандарт JDBC основан на стандарте X/Open SQL CLI (Call Level Interface). На этом же стандарте основан ODBC (Open DataBase Connectivity). Впервые JDBC был введён в январе 1997 года и с тех пор является самым широкоиспользуемым API для доступа к БД в технологии Java.
Для начала работы необходимо получить соединение с БД. Это можно сделать двумя способами:
Под JDBC драйвером подразумевается абстракция (реализующая интерфейс java.sql.Driver), которая предоставляет стандартный способ для создания, открытия и закрытия соединений с нижележащим источником данных, например БД. Для работы с конкретной БД необходим JDBC драйвер. В общем случае драйвером называется набор классов, которые, помимо указанного интерфейса, реализуют ещё ряд обязательных и опциональных интерфейсов. Этот набор классов, как правило, упаковывается в виде jar-архива и доступен для загрузки с сайта производителя конкретной СУБД. Существует так же большое количество независимых производителей JDBC драйверов, которые предлагают коммерческие версии, утверждая что они показывают лучшие параметры производительности. В сети Интернет на сайтах производителей СУБД доступны бесплатные версии драйверов для всех популярных версий СУБД, таких как Oracle, MS SQL Server, MySQL, PostgreSQL и многих других.
После получения соединения, можно выполнять запросы к БД. Соединение представлено абстракцией, реализующей интерфейс java.sql.Connection. Этот интерфейс предоставляет методы для посылки SQL запросов на подсоединённый сервер БД и получение ответа. Для того чтобы запустить запрос необходимо из Connection’а получить абстракцию, предоставляющую запрос. Эта абстракция представлена интерфейсом java.sql.Statement и может быть получена из Connection.createStatement(). После получения Statement он может быть запущен. Для запуска, необходимо вызвать метод Statement.executeQuery(String sqlString). Этому методу необходимо передать строку SQL (например “select * from order”). Для получения результатов запроса, метод executeQuery() возвращает абстракцию представленную интерфейсом java.sql.ResultSet. Этот интерфейс позволяет осуществлять построчный доступ к результатам запроса. Важно заметить, что все вышеописанные абстракции, получаемые и используемые для запуска запросов в БД являются ограниченными ресурсами, т.е. их количество достаточно ограничено и их поддержание является ресурсоёмкой задачей как для сервера БД, так и для сервера приложений (если он используется). Кроме того, количество одновременно открытых соединений с БД обычно ограничивается ещё и лицензионным соглашением. Таким образом, в результате неправильного использования можно прийти к ситуации когда приложение больше не сможет открывать соединения и обработка запросов окажется невозможной – приложение либо аварийно завершит свою работу, либо зависнет. Поэтому, для всех вышеописанных ресурсов (Connection, Statement, ResultSet) определён метод close() который ОБЯЗАТЕЛЬНО вызывать после того, как ваше обращение к БД закончилось. В случае возникновения ошибки или исключительной ситуации, инфраструктура JDBC генерирует java.sql.SQLException или один из его подклассов.
Вот простой пример вывода табличных данных из базы.
Public void myMethod(){ Class.forName(“mydb.driver.DriverClass”); Connection con = DriverManager.getConnection(“mydb connection string”); Statement st = null; ResultSet rs = null;
try{ st = con.createStatement(); rs = st.executeQuery(“select id, name from users”); while(rs.next()){ System.out.println(“id=” + rs.getInt(1) + “; name=” + rs.getString(2)); } }catch(SQLException e){ //handle exception here e.printStackTrace(); }finally{ try{rs.close();}catch(Throwable t){} try{st.close();}catch(Throwable t){} try{con.close();}catch(Throwable t){} }
}
Как видно из примера, весь код обёрнут блоком try-catch-finally. Необходимо напомнить, что блок finally выполняется всегда, независимо от того возникла ли исключительная ситуация (в данном случае SQLException) или нет. Такой подход к организации кода гаранирует, что все ресурсы (ResultSet, Statement, Connection) будут освобождены после выполнения обращения к БД. В примере показан способ выборки данных из базы. Для того чтобы обновить данные в базе, необходимо запустить команду обновления данных, такую как например update. Для запуска команды не возвращающей табличных данных используют метод Statement.executeUpdate(String sqlCommand). Следует отметить, что этот метод следует вызывать не только для выполнения SQL трибу типа update, но так же и для выполнения команд delete. Метод возвращает целое число, которое равно количеству изменённых или удалённых строк в БД.
Для успешного присоединения к БД необходимо знать формат connection string (строки соединения). Эта строка специфична для каждого конкретного драйвера. Посмотреть её можно в документации на драйвер. Например, для соединения с БД Hypersonic можно испольовать следующую строку соединения (имя класса org.hsqldb.jdbcDriver): jdbc:hsqldb:hsql://localhost:1701 Для использования тонкого драйвера Оракла (имя класса oracle.jdbc.driver.OracleDriver): jdbc:oracle:thin:username/password@localhost:1521:mysid Для использования MS SQL Server (имя класса com.microsoft.jdbc.sqlserver.SQLServerDriver): jdbc:трибуты:sqlserver://localhost:1433;DatabaseName=MyDatabase
Для выполнения параметризованных запросов следует использовать java.sql.PreparedStatement. Этот интерфейс расширяет интерфейс java.sql.Statement, поэтому к нему применимы все те же правила и ограничения что и к Statement. Однако, помимо возможностей выполнения статических запросов, PreparedStatement можно использовать для выполнения запросов вида: PreparedStatement ps = con.prepareStatement(“select id, name from users where id=?”); ps.setInt(1, 123); ResultSet rs = ps.execute();
В результате в процессе выполнения вместо параметра «?» в запрос подставиться реальное значение «123». Этот подход позволяет передавать параметры в запросы. Стоит отметить, что выполнение запросов путём генерации SQL where «на лету» и выполнение потом результирующего SQL в обычном Statement может повлеч за собой ряд проблем, одна из которых – снижение производительности (т.к. PreparedStatement можно переиспользовать, а сервер БД может кешировать разобранные запросы), проблемы с передачей параметров, содержащих спец символы (такие как строки с кавычками и т.п.), а так же дат, чисел в различных форматах и т.п. Кроме того, такой подход открывает лазейку для так называемых атак типа SQL injection. Поэтому, везде где передаются параметры в запрос старайтесь использовать только PreparedStatement.
Дата добавления: 2014-01-05; Просмотров: 1566; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |