Java : доступ к базам данных, технология JDBC
Примеры баз данных
Создание источника данных Создаем новую БД (Apache Derby) - example Выбираем в списке jdbc:derby://localhost:1527/example, команда Connect Создаем новые таблицы – команда Execute command на узле Tables Вводим sql-скрипт…
SQL-скрипт : таблица PERSON CREATE TABLE PERSON( ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), FIRSTNAME VARCHAR(255) NOT NULL, MIDDLENAME VARCHAR(255), LASTNAME VARCHAR(255) ); В контекстном меню выбираем Run statement
SQL-скрипт : таблица DEPARTMENT CREATE TABLE DEPARTMENT( ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), BRIEFNAME VARCHAR(80) NOT NULL, FULLNAME VARCHAR(255) );
SQL-скрипт : таблица EMPLOYEE CREATE TABLE EMPLOYEE( ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), POSITION_TITLE VARCHAR(255) NOT NULL, PERSON INTEGER NOT NULL REFERENCES PERSON(ID) ON DELETE CASCADE, DEPARTMENT INTEGER NOT NULL REFERENCES DEPARTMENT(ID) ON DELETE CASCADE );
Проект в среде NetBeans Требуется добавить библиотеку JavaDB Driver: в дереве проекта – Libraries, Add library, import, JavaDB Driver
Основы JDBC Для работы с БД используется драйвер конкретной СУБД и интерфейсы из пакета java.sql (из Java SE SDK); За регистрацию драйвера и создание подключений отвечает класс DriverManager; Подключение представлено интерфейсом Connection; Запросы – подклассами Statament (PreparedStatement и CallableStatement); Результаты выборки доступны через ResultSet.
Создание подключения, обработка исключений 1. Регистрация драйвера: DriverManager.registerDriver( new org.apache.derby.jdbc.AutoloadedDriver() ); 2. Создание подключения: Connection conn = null; try{ conn = DriverManager.getConnection( "jdbc:derby://localhost:1527/example", "user", "user" ); //conn. – вызов методов, работа с СУБД }finally{ try{ conn.close(); }catch( Exception closeExc ){} }
Параметры подключения public Connection getConnection( String url, String login, String passwd ); Для различных СУБД используются разные URL (Connection String, Строка подключения): СУБДConnection string MySQLjdbc:mysql://localhost:3306/client_test_db Apache Derbyjdbc:derby://localhost:1527/example PostgreSQLjdbc:postgresql://localhost:5432/tpl_db
Выполнение запросов (INSERT, UPDATE, DELETE) PreparedStatement ps = null; try{ ps = conn.prepareStatement( "insert into person(firstname,middlename,lastname) values(?,?,?) ); ps.setString(1, "Иванов" ); ps.setString(2, "Иванович"); ps.setString(3, "Иван"); int cnt = ps.executeUpdate(); System.out.println( Добавлено строк: " + cnt ); }finally{ try{ ps.close(); }catch( Exception closeExc ){} }
Выполнение запросов (SELECT) Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ //Создание соединения //… ps = conn.prepareStatement( "select id, firstname, lastname from person where middlename like ?" ); ps.setString(1, И% ); rs = ps.executeQuery(); while( rs.next() ){ int id = rs.getInt(1); String firstName = rs.getString( firstname ); String lastName = rs.getString( 3 ); } }finally{ try{ rs.close(); }catch( Exception closeexc ){} try{ ps.close(); }catch( Exception closeexc ){} try{ conn.close(); }catch( Exception closeexc ){} }
Работа с транзакциями conn = reconnect( … ); conn.setAutoCommit( false ); try{ PreparedStatement ps = … ps.executeUpdate(); //… ps.executeUpdate(); //… ps.executeUpdate(); //Сохранение всех изменений conn.commit(); }catch( Exception exc ){ //Откат трех обновлений try{ conn.rollback(); }catch( … ){ … } }finally{ try{ conn.close(); }catch( … ){ … } }
Использование мета-данных // //Для всех колонок выборки вывести значения // ps = conn.prepareStatement( "select * from person where lastname like ?" ); ps.setString( 1, "a%" ); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); for( int i = 0; i < rsmd.getColumnCount(); i++ ){ System.out.printf( "%15s", rsmd.getColumnName(i+1) ); } System.out.println(); while( rs.next() ){ for( int i = 0; i < rsmd.getColumnCount(); i++ ){ System.out.printf( "%15s", rs.getString(i+1) ); } System.out.println(); }
Задание 1 Разработать форму для работы с таблицей DEPARTMENT. При загрузке в таблицу выводятся все подразделения. Поля доступны для редактирования. Изменения заносятся в базу данных по команде «Сохранить». По команде «Отмена» происходит повторная загрузка данных из БД.
Задание 2* Разработать аналогичную форму для работы с таблицей PERSON. В верхней части формы находится компонент JComboBox при смене значения в котором происходит переключение между таблицами DEPARTMENT и PERSON. Редактирование записей организовать аналогичным образом.
Задание 3* Разработать форму для отображения всех сотрудников, представленных в таблице EMPLOYEE. Из предыдущих форм исключить все кнопки («+», «-», «Отмена», «Сохранить»). Для первоначального заполнения таблицы использовать средства NetBeans.