Программирование с БД Клиент-серверная архитектура API JDBC
Взаимодействие программ zПриложения – замкнутые программные модули zДля повторного использования выделяют библиотеки (программ) zВзаимодействие посредством API
Что такое API ? zAPI – application programming interfaces zНабор процедур функций и методов, управляющих функциональностью модуля (библиотеки) zНабор элементов управления – окошек, рычажков, кнопочек и т.п.
JDBC – API для DBMS zDBMS (СУБД) – различные программные модули zСтандартизация – ключ к единообразию и переносимости zJDBC – набор Java-классов (интерфейсов)
JDBC архитектура z2-х уровневая архитектура
JDBC архитектура z3-х уровневая архитектура
Пример zвеб-приложение H2-консоль
Основные шаги Загрузка драйвера Class.forName("org.h2.Driver"); Class.forName( "org.apache.derby.jdbc.EmbeddedDriver"); Установка соединения Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", ""); String url = "jdbc:derby:Fred"; Connection con = DriverManager.getConnection(url, "Fernanda", "J8");
Внимание, ресурсы! Connection con; try{ con = … //открываем соединение //работаем с СУБД } finally { con.close();//закрываем соединение }
А где же наш любимый SQL? Statement stmt = con.createStatement(); ResultSet srs = stmt.executeQuery ( "SELECT id, name, FROM s_region "); ResultSet.next() ResultSet.getXXX()
Обработка результата запроса ResultSet srs = stmt.executeQuery( "SELECT COF_NAME, PRICE FROM COFFEES"); while ( srs.next() ) { String name = srs.getString("COF_NAME"); float price = srs.getFloat("PRICE"); System.out.println(name + " " + price); }
Hack (SQL INJECTION) String sql = SELECT userid FROM users WHERE login=+login+ AND password= + password + //WHERE login = admin AND password = 123 ResultSet srs = stmt.executeQuery(sql); Integer userid = srs.next().getInteger(userid)
Ломаем… В окошечко пароля вводим например OR 1=1 //WHERE login = hacker AND password = OR 1=1 OR login=admin //WHERE login = hacker AND password = OR login = admin
Внимание! Экранирование строк String sql = SELECT userid FROM users WHERE login=? AND password=? PreparedStatement stmt = con.prepareStatement(sql); stmt.setString(1, login); stmt.setString(2, password);
Итого: zJDBC – это API для работы с СУБД в 2- х либо 3-х уровневой архитектуре zВсе параметры загрузки драйвера и установки соединения – в документации к СУБД zОсторожная обработка ресурсов zPreparedStatement