В Java для реализации объявленного интерфейса в новом классе применяется конструкция implements. Поэтому при реализации интерфейса Observation воспользуемся ею в классе Obslmp. Когда мы создаем новый класс, реализующий интерфейс Java, первый должен реализовывать каждый метод второго. Интерфейсом Observation определяется лишь один метод, insertObs(), и его необходимо реализовать в классе Obslmp, для чего применим JDBC. В дальнейших статьях блога мы расширим и углубим знание об этом.
В классе Obslmp описывается и реализуется несколько частных (private) методов Java, т.е. тех, что не могут вызываться клиентами, и один общий (public), который клиенты могут вызывать:
- Частный метод getNewObs() не может вызываться клиентами: он обращается к переопределяемому методу getNewObs (Connection conn), который, в свою очередь, генерирует новый идентификатор наблюдения. Данный метод возвращает вызывающему объект ObsHelper с идентификатором наблюдения.
- Частный метод getNewObs (Connection conn) вызывает PL/SQL-функцию ObsActions.get0bsld(), генерирующую новый идентификатор наблюдения. При вызове методом getNewObsO он возвращает вызывающему объект ObsHelper. Полное описание PL/SQL-модуля ObsActions дано во введении.
- Частный метод insertObs (ObsHelper obs) вызывает PL/SQL-метод ObsActions. insertObs ( . . . ) , который вводит OCEANIC_OBSERVATION_TYPE в таблицу OCEANIC_OBSERVATION_LIST. Он возвращает вызывающему объект ObsHelper.
- Общий метод ArrayList insertObs (ArrayList inObs) — единственный, вызываемый клиентами. Напомним, что он и единственный, описанный в интерфейсе Observation. Метод принимает объект ArrayList из объектов ObsHelper в качестве входных данных и возвращает объект ArrayList из идентификаторов наблюдений. Для этого он последовательно вызывает метод insertObs (ObsHelper obs).
- Частный статический (static) метод connectDb() подключается к базе данных и возвращает вызывающему объект java.sql. Connection.
Вот описание класса Obslmp:
// Имя программы: Obslmp.java // Название: Название вашего продукта // Версия: // Авторское право: Copyright (с) 2000 // Автор: Ваше имя // Описание: Класс реализации Java, реализующий // вызываемый метод insertObsO клиента, // заявленный в интерфейсе Observation. package obsserver; // импортируем helper-классы import helpers.ObsHelper; import helpers.ObsException; // импортируем специфичное для приложения исключение import java.sql.SQLException; import java.sql.*; import oracle.sql.*; // Импортируем вспомогательные классы Java import java.math.BigDecimal; import java.util.ArrayList; public class Obslmp implements Observation { // Конструктор по умолчанию public ObsImpO { } // Конец конструктора // Этот метод НЕ вызывается клиентами. // Поэтому он не указан в интерфейсе // Observation. private ObsHelper getNewObs(Connection conn) throws SQLException, ObsException { // Создадим объект CallableStatement CallableStatement cstmt = null; try { // Подготовим строку символов (String) для вызова String sqlld = "{? = call OBSACTIONS.GETOBSID}"; } // Конец getNewObs(conn) private ObsHelper insertObs(ObsHelper obs, Connection conn) throws SQLException, ObsException { // Создадим объект CallableStatement CallableStatement cstmt = null; try { // Подготовим строку символов для вызова // PL/SQL-процедуры OBSACTIONS.INSERTOBS() String sql = "{call OBSACTIONS.INSERTOBS(?,?,?,?,?,?,?,?,?,?,?)}"; cstmt = conn.prepareCall(sql); // Установим входные параметры // для PL/SQL-процедуры OBSACTIONS.INSERTOBS() cstmt.setlnt(1, obs.obs_id.intValue()); cstmt.setString(2, obs.when_t); cstmt.setString(3, obs.atjtime); cstmt.setlnt(4, obs.produced_id.intValue()); cstmt.setlnt(5, obs.latitude.intValue()); cstmt.setlnt(6, obs.longitude. intValue()); cstmt.setlnt(7, obs.wdspd.intValue()); cstmt.setlnt(8, obs.adj_wdspd.intValue()); cstmt.setlnt(9, obs.wddir.intValue()); cstmt.setlnt(10, obs.pressure.intValue()); cstmt.setlnt(11, obs.station_id.intValue()); // Необходимо вызвать метод execute() объекта // CallableStatement. Если забудем его включить, возникнут // достаточно странные ошибки, cstmt. execute(); // Возвратим объект ObsHelper return new ObsHelper(obs.obs_id); } // Конец try catch (SQLException е) { throw е; } // Конец catch // Выполним очистку finally { if ( cstmt != null ) cstmt.close(); } // Конец finallyO } // Конец insertObs(obs,conn) // Введем ArrayList из OCEANIC_OBSERVATION_TYPE public ArrayList insertObs(ArrayList inObs) throws SQLException, ObsException { int loopVar = 0; // Объявим массив объектов ObsHelper ArrayList returnArrayList = inObs; int arrayListSize = inObs.size(); Connection conn = null; try { // С помощью тонкого JDBC-драйвера Oracle // подключимся к базе данных conn = connectDb(); // Повторим действия и сохраним ArrayList // идентификаторов obs_id в returnArrayList while ( loopVar < arrayListSize ) { // Получим новый obs_id на каждом шаге ObsHelper anObsid = getNewObs(conn); // Перенесем объект ObsHelper в obs ObsHelper obs = (ObsHelper)inObs.get(loopVar); // Заменим obs.obs_id новым anObsid.obs_id obs.obs_id = anObsid.obs_id; // Вызовем insertObs(..), добавив новую строку // в базу данных, и возвратим новый // ObsHelper с новым obs_id. returnArrayList.add(insertObs ( obs, conn )); loopVar++; // Увеличим счетчик } // Конец while // Уменьшим объект ArrayList до его текущего размера returnArrayList.trimToSize(); // Возвратим ArrayList идентификаторов return returnArrayList; } // Конец try catch (SQLExceptione) { throw e; } // Конец catch // Выполним очистку finally { if ( conn != null ) conn.close(); } // Конец finallyO } // Конец insertObs(ArrayList inObs) // Этот метод вызывается всеми методами, которым нужно // подключиться к базе данных с помощью тонкого // JDBC-драйвера Oracle private static Connection cormectDb(). throws SQLException { // Создадим переменную java.sql.Connection Connection conn = null; DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); \ // Подключимся к серверу базы данных data-i.com conn = DriverManager. getConnect.i.on( "jdbc:oracle:thin:@data-i.com:1521:ORCL", "scott", "tiger"); // Возвратим объект java.sql.Connection return conn; } // Конец connectDb() } // Конец класса Obslmp
Теперь, после построения компонента Observation, нужно скомпилировать исходные файлы Java. Обратите внимание на то, что для некоторых методов компонента в качестве входного параметра и возвращаемого типа использовался объект ArrayList. Тип ArrayList для Java описан в 1.2.x, поэтому для компиляции исходного программного текста следует пользоваться компилятором, соответствующим JDK 1.2.x. Если применять JDK 1.2.x нежелательно, замените тип ArrayList на любой массив Java или тип Vector. Для компиляции программ воспользуемся командой javac:
// Естественно, установим собственный CLASSPATH. Javac -g helpers\*.java obsserver\*.java
Следите за тем, чтобы исходный программный текст для реализаций JDBC и SQLJ не присутствовал в одном каталоге. При компиляции программы SQLJ компилятор генерирует исходный файл . java. Если реализация JDBC находится в том же каталоге, она будет перезаписана. Во избежание подобной ситуации исходный текст всех программ, представленных в блоге, хранится в каталогах Jdbclmplementation и Sqljlmplementation.