Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Пример 9.1.

Читайте также:
  1. V. Примерный образец теста, применяемого для промежуточной аттестации
  2. Web-контейнер, Servlet, JSP. Структура, назначение и пример сервлета или JSP.
  3. А вот чрезмерное употребление алкоголя действительно вызывает гинекомастию. Примерно четверо из 10 хронических алкоголиков имеют это заболевание в той или иной стадии развития.
  4. А. Здравомыслов.Примерно два года тому назад.
  5. Ая основа – Хаджури не видит разницы между нововведенцем, призывающим к своему нововведению, и не призывающим, и пример в этом он взял с Махмуда Хаддада.
  6. Будьте хорошим примером для своих детей
  7. Быть примером
  8. В наших примерах мы ни разу не рассматривали конструкторы классов, поэтому при создании экземпляров наших классов вызывался конструктор класса object.
  9. В приведенном примере нарушение синтезов пространственного гнозиса и обусловливает ряд следствий, что можно представить схематично.
  10. В только что приведенном вами примере с под­брасыванием монеты компьютерное моделирование

 

package ExecuteSQL.java;import java.sql.*;import java.io.*; /** * универсальный интерпретатор команд SQL. **/public class ExecuteSQL { public static void main(String[] args) { Connection conn = null; // JDBC соединение с сервером баз данных try { String driver = null, url = null, user = "", password = ""; // анализ аргументов командной строки for(int n = 0; n < args.length; n++) { if (args[n].equals("-d")) driver = args[++n]; else if (args[n].equals("-u")) user = args[++n]; else if (args[n].equals("-p")) password = args[++n]; else if (url == null) url = args[n]; else throw new IllegalArgumentException("неизвестный аргумент"); } // обязательный аргумент для БД - URL if (url == null) throw new IllegalArgumentException("не указана БД"); // если указано имя класса драйвера БД, то он регистрируется // в DriverManager. if (driver!= null) Class.forName(driver); // установка соединения с БД conn = DriverManager.getConnection(url, user, password); // создание объекта statement для доступа к БД Statement s = conn.createStatement(); // поток для чтения с консоли BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // цикл считывания и выполнения запросов пользователя while(true) { System.out.print("sql> "); // приглашение System.out.flush(); // активизация String sql = in.readLine(); // строка ввода // выход "quit". if ((sql == null) || sql.equals("quit")) break; // игнорирование пустых строк if (sql.length() == 0) continue; // выполнение SQL-строки с выводом результата try { // так как не ясно это запрос или команда обновления, // то вместо executeQuery() и executeUpdate() // используем метод execute() boolean status = s.execute(sql); // для сложных SQL запросов организуем цикл do { if (status) { // это запрос, вернувший ResultSet ResultSet rs = s.getResultSet(); // результат printResultsTable(rs, System.out); // отображение } else { // если не SQL запрос, а транзакция, то // не возвратила ResultSet. Выводим строки, // на которые повлияла транзакция. int numUpdates = s.getUpdateCount(); System.out.println("Ok. " + numUpdates + " строк."); } // вывод результатов в цикле status = s.getMoreResults(); } while(status || s.getUpdateCount()!= -1); } // проверка предупреждений. catch (SQLException e) { System.err.println("SQL исключение: " + e.getMessage()+ ":" + e.getSQLState()); } // проверка всех предупреждений finally { // вывод всех предупреждений SQLWarning w; for(w=conn.getWarnings(); w!= null; w=w.getNextWarning()) System.err.println("предупреждение: " + w.getMessage() + ":" + w.getSQLState()); } } } // обработка исключений catch (Exception e) { System.err.println(e); if (e instanceof SQLException) System.err.println("SQL State: " + ((SQLException)e).getSQLState()); System.err.println("формат: java ExecuteSQL [-d <driver>] " + "[-u <user>] [-p <password>] <database URL>"); } // гарантированный выход из БД finally { try { conn.close(); } catch (Exception e) {} } } /** * попытка вывода содержимого объекта ResultSet в текстовую таблицу **/ static void printResultsTable(ResultSet rs, OutputStream output) throws SQLException { // настройка выходного потока PrintWriter out = new PrintWriter(output); // получение метаданных (имен полей, индексов и пр.) ResultSetMetaData metadata = rs.getMetaData(); // переменные для хранения данных о таблице int numcols = metadata.getColumnCount(); // число столбцов String[] labels = new String[numcols]; // индексы столбцов int[] colwidths = new int[numcols]; // ширина int[] colpos = new int[numcols]; // начальная позиция int linewidth; // ширина таблицы // вычисление размеров таблицы linewidth = 1; // до символа '|'. for(int i = 0; i < numcols; i++) { // для столбца colpos[i] = linewidth; // сохранить позицию labels[i] = metadata.getColumnLabel(i+1); // индекс // ширина столбца int size = metadata.getColumnDisplaySize(i+1); if (size == -1) size = 30; // возвращение размера. if (size > 500) size = 30; // уточнение int labelsize = labels[i].length(); if (labelsize > size) size = labelsize; colwidths[i] = size + 1; // сохранить размер столбца linewidth += colwidths[i] + 2; // увеличить общий размер } // создание линии разрыва и новую строку StringBuffer divider = new StringBuffer(linewidth); StringBuffer blankline = new StringBuffer(linewidth); for(int i = 0; i < linewidth; i++) { divider.insert(i, '-'); blankline.insert(i, " "); } // установка индексов for(int i=0; i<numcols; i++) divider.setCharAt(colpos[i]-1,'+'); divider.setCharAt(linewidth-1, '+'); // вывод таблицы out.println(divider); // организация структуры таблицы StringBuffer line = new StringBuffer(blankline.toString()); line.setCharAt(0, '|'); for(int i = 0; i < numcols; i++) { int pos = colpos[i] + 1 + (colwidths[i]-labels[i].length())/2; overwrite(line, pos, labels[i]); overwrite(line, colpos[i] + colwidths[i], " |"); } // вывод структуры таблицы out.println(line); out.println(divider); // вывод данных таблицы в цикле while(rs.next()) { line = new StringBuffer(blankline.toString()); line.setCharAt(0, '|'); for(int i = 0; i < numcols; i++) { Object value = rs.getObject(i+1); if (value!= null) overwrite(line, colpos[i] + 1, value.toString().trim()); overwrite(line, colpos[i] + colwidths[i], " |"); } out.println(line); } // подчеркиваем таблицу out.println(divider); out.flush(); } /** печать таблицы результатов */ static void overwrite(StringBuffer b, int pos, String s) { int slen = s.length(); // длина строки int blen = b.length(); // размер буфера if (pos+slen > blen) slen = blen-pos; // совпадение for(int i = 0; i < slen; i++) // копирование b.setCharAt(pos+i, s.charAt(i)); }}

 

Пример 9.2. Создание БД.

 

package MakeAPIDB.java;import java.sql.*;import java.lang.reflect.*;import java.io.*;import java.util.*; /** * класс создает БД пакетов, классов Java, их свойств и методов**/public class MakeAPIDB { public static void main(String args[]) { Connection c = null; // соединение с БД try { // формирование указателя классов, считывая их из файла args[0] ArrayList classnames = new ArrayList(); BufferedReader in = new BufferedReader(new FileReader(args[0])); String name; while((name = in.readLine())!= null) classnames.add(name); // поиск необходимых значений для связи с БД Properties p = new Properties(); // пустые свойства try { p.load(new FileInputStream(args[1])); // загрузка свойств } catch (Exception e1) { try { p.load(new FileInputStream("APIDB.props")); } catch (Exception e2) {} } // считывание значений свойств из файла String driver = p.getProperty("driver"); String database = p.getProperty("database"); String user = p.getProperty("user", ""); String password = p.getProperty("password", ""); // свойства driver и database являются обязательными if (driver == null) throw new IllegalArgumentException("драйвер не задан!"); if (database == null) throw new IllegalArgumentException("БД не задана!"); // загрузка драйвера и регистрация в DriverManager. Class.forName(driver); // соединение с БД c = DriverManager.getConnection(database, user, password); // создание 3 новых таблиц Statement s = c.createStatement(); s.executeUpdate("CREATE TABLE package " + "(id INT, name VARCHAR(80))"); s.executeUpdate("CREATE TABLE class " + "(id INT, packageId INT, name VARCHAR(48))"); s.executeUpdate("CREATE TABLE member " + "(classId INT, name VARCHAR(48), isField BIT)"); // операторы вставки записей в таблицы insertpackage = c.prepareStatement("INSERT INTO package VALUES(?,?)"); insertclass = c.prepareStatement("INSERT INTO class VALUES(?,?,?)"); insertmember = c.prepareStatement("INSERT INTO member VALUES(?,?,?)"); // выполнение цикла по классам int numclasses = classnames.size(); for(int i = 0; i < numclasses; i++) { try { storeClass((String)classnames.get(i)); } catch(ClassNotFoundException e) { System.out.println("предупреждение: класс не найден: " + classnames.get(i) + "; пропущен"); } } } catch (Exception e) { System.err.println(e); if (e instanceof SQLException) System.err.println("SQLState: " + ((SQLException)e).getSQLState()); System.err.println("Usage: java MakeAPIDB " + "<classlistfile> <propfile>"); } // после завершенияаем соединение с БД finally { try { c.close(); } catch (Exception e) {} } } /** * матрица для хранения значений структуры таблиц БД **/ static Map package_to_id = new HashMap(); // счетчики для полей идентификаторов полей и классов static int packageId = 0, classId = 0; // SQL операторы для вставки новых значений в БД static PreparedStatement insertpackage, insertclass, insertmember; /** * полное имя класса **/ public static void storeClass(String name) throws SQLException, ClassNotFoundException { String packagename, classname; // динамическая загрузка класса Class c = Class.forName(name); // вывод сообщений System.out.println("сохранение полей: " + name); // определение имени пакета и класса int pos = name.lastIndexOf('.'); if (pos == -1) { packagename = ""; classname = name; } else { packagename = name.substring(0,pos); classname = name.substring(pos+1); } // идентификатор пакета Integer pid; pid = (Integer)package_to_id.get(packagename); // проверка матрицы if (pid == null) { pid = new Integer(++packageId); // присвоение id package_to_id.put(packagename, pid); // запомнить insertpackage.setInt(1, packageId); // задание аргументов insertpackage.setString(2, packagename); insertpackage.executeUpdate(); // вставить в БД } // заносим имя класса в таблицу. insertclass.setInt(1, ++classId); // установка идентификатора insertclass.setInt(2, pid.intValue()); // пакета insertclass.setString(3, classname); // имя insertclass.executeUpdate(); // запись класса // список незакрытых методов класса // и размещение их в таблице Method[] methods = c.getDeclaredMethods(); // список методов for(int i = 0; i < methods.length; i++) { // по всем незакрытым if (Modifier.isPrivate(methods[i].getModifiers())) continue; insertmember.setInt(1, classId); // задание id insertmember.setString(2, methods[i].getName()); // имя метода insertmember.setBoolean(3, false); // не свойство insertmember.executeUpdate(); // вставка в БД } // то же для свойств класса Field[] fields = c.getDeclaredFields(); // список свойств for(int i = 0; i < fields.length; i++) { // по всем if (Modifier.isPrivate(fields[i].getModifiers())) continue; insertmember.setInt(1, classId); // задание id insertmember.setString(2, fields[i].getName()); // имя поля insertmember.setBoolean(3, true); // это поле insertmember.executeUpdate(); // вставить запись } }}

 

Пример 9.3. Отображение созданной БД.

 

package LookupAPI.java;import java.sql.*;import java.io.FileInputStream;import java.util.Properties; /** * программа реализует связь с БД MakeAPIDB и поиск записей. **/public class LookupAPI { public static void main(String[] args) { Connection c = null; // JDBC соединение с БД try { // значения по умолчанию String target = null; // имя поиска boolean list = false; // вывод String propfile = "APIDB.props"; // файл параметров БД // аргументы командной строки for(int i = 0; i < args.length; i++) { if (args[i].equals("-l")) list = true; else if (args[i].equals("-p")) propfile = args[++i]; else if (target!= null) throw new IllegalArgumentException("неизвестный аргумент: " + args[i]); else target = args[i]; } if (target == null) throw new IllegalArgumentException("целевой объект не задан"); // значения для соединения с БД Properties p = new Properties(); // пустые свойства try { p.load(new FileInputStream(propfile)); } // загрузка catch (Exception e) {} // считывание значений из файла String driver = p.getProperty("driver"); String database = p.getProperty("database"); String user = p.getProperty("user", ""); String password = p.getProperty("password", ""); // свойства driver и database обязательны if (driver == null) throw new IllegalArgumentException("драйвер не указан!"); if (database == null) throw new IllegalArgumentException("БД не указана!"); // загрузка драйвера Class.forName(driver); // соединение с БД c = DriverManager.getConnection(database, user, password); // повышение производительности. c.setReadOnly(true); // при ключе "-l" выводим список членов if (list) list(c, target); else lookup(c, target); } // при ошибках catch (Exception e) { System.out.println(e); if (e instanceof SQLException) System.out.println(((SQLException) e).getSQLState()); System.out.println("Usage: java LookupAPI [-l] [-p <propfile>] " + "target"); } // окончание работы и закрытие соединения finally { try { c.close(); } catch (Exception e) {} } } /** * вывод содержимого БД **/ public static void lookup(Connection c, String target) throws SQLException { // объект Statement для организации запросов Statement s = c.createStatement(); // члены классов s.executeQuery("SELECT DISTINCT " + "package.name, class.name, member.name, member.isField"+ " FROM package, class, member" + " WHERE member.name='" + target + "'" + " AND member.classId=class.id " + " AND class.packageId=package.id"); // цикл по результатам ResultSet r = s.getResultSet(); while(r.next()) { String pkg = r.getString(1); // имя пакета String cls = r.getString(2); // имя класса String member = r.getString(3); // имя члена boolean isField = r.getBoolean(4); // свойство? // вывод при совпадении System.out.println(pkg + "." + cls + "." + member + (isField?"":"()")); } // поиск класса по имени s.executeQuery("SELECT package.name, class.name " + "FROM package, class " + "WHERE class.name='" + target + "' " + " AND class.packageId=package.id"); // цикл по результатам r = s.getResultSet(); while(r.next()) System.out.println(r.getString(1) + "." + r.getString(2)); // поиск пакета с заданным фрагментом s.executeQuery("SELECT name FROM package " + "WHERE name='" + target + "'" + " OR name LIKE '%." + target + ".%' " + " OR name LIKE '" + target + ".%' " + " OR name LIKE '%." + target + "'"); // цикл по результатам r = s.getResultSet(); while(r.next()) System.out.println(r.getString(1)); // закрытие объекта Statement s.close(); } /** * отображение методов и свойств **/ public static void list(Connection conn, String target) throws SQLException { // создание 2 объектов Statement для запросов Statement s = conn.createStatement(); Statement t = conn.createStatement(); // поиск класса по имени s.executeQuery("SELECT package.name, class.name " + "FROM package, class " + "WHERE class.name='" + target + "' " + " AND class.packageId=package.id"); // цикл ResultSet r = s.getResultSet(); while(r.next()) { String p = r.getString(1); // имя пакета String c = r.getString(2); // имя класса // печать имени System.out.println("class " + p + "." + c + " {"); // запрос свойств и методов t.executeQuery("SELECT DISTINCT member.name, member.isField " + "FROM package, class, member " + "WHERE package.name = '" + p + "' " + " AND class.name = '" + c + "' " + " AND member.classId=class.id " + " AND class.packageId=package.id " + "ORDER BY member.isField, member.name"); // цикл по списку ResultSet r2 = t.getResultSet(); while(r2.next()) { String m = r2.getString(1); int isField = r2.getInt(2); System.out.println(" " + m + ((isField == 1)?"":"()")); } // завершение System.out.println("}"); } // поиск пакетов по имени s.executeQuery("SELECT name FROM package " + "WHERE name='" + target + "'" + " OR name LIKE '%." + target + ".%' " + " OR name LIKE '" + target + ".%' " + " OR name LIKE '%." + target + "'"); // цикл r = s.getResultSet(); while(r.next()) { // имя пакета String p = r.getString(1); System.out.println("Package " + p + ": "); // список классов и интерфейсов t.executeQuery("SELECT class.name FROM package, class " + "WHERE package.name='" + p + "' " + " AND class.packageId=package.id " + "ORDER BY class.name"); // цикл ResultSet r2 = t.getResultSet(); while(r2.next()) System.out.println(" " + r2.getString(1)); } // закрытие объектов Statement s.close(); t.close(); }}

 

Пример 9.4. Программа LookupAPI использует базу данных, созданную программой MakeAPIDB из предыдущего примера. Она работает следующим образом:

· при вызове с именем члена класса она выводит полные имена (включая пакет и класс) всех полей и методов с таким именем;

· при запуске с именем класса она выводит список полных имен всех классов из всех пакетов с таким именем;

· при вызове с ключем -1 и именем класса она выводит все члены всех классов, имеющих это имя;

· при запуске с ключем -1 и частью имени пакета она выводит список всех классов из всех пакетов, соответствующих этой строке.

Пример служит в качестве реального приложения баз данных и демонстрирует некоторые мощные запросы баз данных, выраженные с помощью SQL.

 

package com.LookupAPI.java;import java.sql.*;import java.io.FileInputStream;import java.util.Properties; /** * Программа использует БД, созданную в примере MakeAPIDB. Она * устанавливает соединение с БД MakeAPIDB. * Формирует запросы различными способами для получения * информации о Java API. **/public class LookupAPI { public static void main(String[] args) { Connection c = null; // JDBC соединение с БД try { // Несколько значений по умолчанию String target = null; // имя для поиска boolean list = false; // вывести состав или найти имя? String propfile = "APIDB.props"; // файл параметров БД // Анализ аргументов командной строки for(int i = 0; i < args.length; i++) { if (args[i].equals("-l")) list = true; else if (args[i].equals("-p")) propfile = args[++i]; else if (target!= null) throw new IllegalArgumentException("Неизвестный аргумент: " + args[i]); else target = args[i]; } if (target == null) throw new IllegalArgumentException("целевой объект не задан"); // Определение значений для организации связи с БД // Чтение файла свойств // named "APIDB.props", или указанный аргумент ключа –р. // Файл содержит свойства "driver", // "database", "user", и "password" // для обеспечения соединения с БД. // Если файла нет, то используются значения по умолчанию. Properties p = new Properties(); // Empty properties try { p.load(new FileInputStream(propfile)); } // пустые свойства catch (Exception e) {} // загрузка свойств String driver = p.getProperty("driver"); String database = p.getProperty("database"); String user = p.getProperty("user", ""); String password = p.getProperty("password", ""); // считывание обязательных значений из файла if (driver == null) throw new IllegalArgumentException("драйвер не указан!"); if (database == null) throw new IllegalArgumentException("БД не указана!"); // загрузка драйвера БД Class.forName(driver); // установление соединения с БД c = DriverManager.getConnection(database, user, password); // Отказ от обновлений в БД // для улучшения производительности. c.setReadOnly(true); // если задан ключ "-l", то вывод списка членов пакета или класса // В противном случае, поиск совпадений с пакетом, членом, классом if (list) list(c, target); else lookup(c, target); } // при возникновении ошибки вывод исключения // SQLException и вывод сообщения. catch (Exception e) { System.out.println(e); if (e instanceof SQLException) System.out.println(((SQLException) e).getSQLState()); System.out.println("формат: java LookupAPI [-l] [-p <propfile>] " + "target"); } // разрыв соединения с БД при завершении программы. finally { try { c.close(); } catch (Exception e) {} } } /** * метод поиска в БД всех совпадений с целевой записью * вывод членов, имен классов, пакетов. **/ public static void lookup(Connection c, String target) throws SQLException { // создание объекта Statement для генерации запросов к БД Statement s = c.createStatement(); // поиск членов классов с указанным именем s.executeQuery("SELECT DISTINCT " + "package.name, class.name, member.name, member.isField"+ " FROM package, class, member" + " WHERE member.name='" + target + "'" + " AND member.classId=class.id " + " AND class.packageId=package.id"); // цикл по результатам поиска с выводом на печать ResultSet r = s.getResultSet(); while(r.next()) { String pkg = r.getString(1); // имя пакета String cls = r.getString(2); // имя класса String member = r.getString(3); // имя члена boolean isField = r.getBoolean(4); // является ли полем? // вывод System.out.println(pkg + "." + cls + "." + member + (isField?"":"()")); } // поиск класса с заданным именем s.executeQuery("SELECT package.name, class.name " + "FROM package, class " + "WHERE class.name='" + target + "' " + " AND class.packageId=package.id"); // цикл по результатам поиска и печать r = s.getResultSet(); while(r.next()) System.out.println(r.getString(1) + "." + r.getString(2)); // поиск пакета, имя которого содержит заданный фрагмент s.executeQuery("SELECT name FROM package " + "WHERE name='" + target + "'" + " OR name LIKE '%." + target + ".%' " + " OR name LIKE '" + target + ".%' " + " OR name LIKE '%." + target + "'"); // цикл по результатам и вывод на печать r = s.getResultSet(); while(r.next()) System.out.println(r.getString(1)); // закрытие объекта Statement s.close(); } /** * метод для поиска классов или пакетов с заданным именем **/ public static void list(Connection conn, String target) throws SQLException { // создание 2 объектов Statement для организации запросов к БД Statement s = conn.createStatement(); Statement t = conn.createStatement(); // поиск класса по имени s.executeQuery("SELECT package.name, class.name " + "FROM package, class " + "WHERE class.name='" + target + "' " + " AND class.packageId=package.id"); // цикл по совпадениям ResultSet r = s.getResultSet(); while(r.next()) { String p = r.getString(1); // package name String c = r.getString(2); // class name // печать имени класса System.out.println("class " + p + "." + c + " {"); // запрос для членов класса t.executeQuery("SELECT DISTINCT member.name, member.isField " + "FROM package, class, member " + "WHERE package.name = '" + p + "' " + " AND class.name = '" + c + "' " + " AND member.classId=class.id " + " AND class.packageId=package.id " + "ORDER BY member.isField, member.name"); // цикл по отсортированному списку с выводом на печать ResultSet r2 = t.getResultSet(); while(r2.next()) { String m = r2.getString(1); int isField = r2.getInt(2); System.out.println(" " + m + ((isField == 1)?"":"()")); } // завершение списка классов System.out.println("}"); } // поиск пакетов, удовлетворяющих запросу s.executeQuery("SELECT name FROM package " + "WHERE name='" + target + "'" + " OR name LIKE '%." + target + ".%' " + " OR name LIKE '" + target + ".%' " + " OR name LIKE '%." + target + "'"); // цикл по всем пакетам r = s.getResultSet(); while(r.next()) { // вывод имени пакета String p = r.getString(1); System.out.println("Package " + p + ": "); // список классов и интерфейсов пакета t.executeQuery("SELECT class.name FROM package, class " + "WHERE package.name='" + p + "' " + " AND class.packageId=package.id " + "ORDER BY class.name"); // цикл по списку с распечаткой. ResultSet r2 = t.getResultSet(); while(r2.next()) System.out.println(" " + r2.getString(1)); } // закрытие объектов Statement s.close(); t.close(); }}

 

Пример 9.5. По умолчанию для создаваемого объекта Connection устанавливается режим автоматической фиксации (auto-commit mode). Это значит, что каждое обновление БД считается отдельной транзакцией и автоматически фиксируется в БД. Иногда в приложениях требуется сгруппировать несколько обновлений в одну атомарную транзакцию. Для этого можно ввести объект Connection из режима автофиксации и явно вызывать метод commit() для фиксации пакета транзакций или метод rollback() для прерывания пакета транзакций с отменой уже выполненных. Помимо приемов обработки атомарных транзакций в примере даны дополнительные функции использования SQL-запросов при взаимодействии с БД. Пример требует создания файла свойств с именем BankDB.props, содержащий информацию о подключении к БД. Кроме этого, перед первым запуском сервера необходимо создать в БД таблицу account. Пример взаимодействует с сервером RMI, т.е. необходимо дополнительно запустить компилятор rmic для генерации классов каркаса и заглушки и службу rmiregistry.

 

package RemoteDBBankServer.java;

import java.rmi.*;

import java.rmi.server.*;

import java.rmi.registry.*;

import java.sql.*;

import java.io.*;

import java.util.*;

import java.util.Date; // явный импорт для разрешения проблем с java.sql.Date

import Bank.java.*; // импорт внутреннего класса Bank

 

/**

* класс, реализующий интерфейс RemoteBank.

* в качестве источника данных используется соединение с БД, поэтому

* при выключении сервера потери клиентских данных не происходит.

* Режим автофиксации у соединения с БД отключается, а атомарные

* транзакции выполняются методами commit() и rollback().

**/

public class RemoteDBBankServer extends UnicastRemoteObject

implements RemoteBank

{

Connection db; // соединение с БД, хранящей информацию о счетах

 

/** конструктор для запоминания соединения с БД */

public RemoteDBBankServer(Connection db) throws RemoteException {

this.db = db;

}

 

/** Открытие счета */

public synchronized void openAccount(String name, String password)

throws RemoteException, BankingException

{

// проверка наличия счета с таким именем

Statement s = null;

try {

s = db.createStatement();

s.executeQuery("SELECT * FROM accounts WHERE name='" + name + "'");

ResultSet r = s.getResultSet();

if (r.next()) throw new BankingException("Account name in use.");

 

// Если счета нет, то создаем его.

// Создание таблицы для истории проводок по счету

// и запись первой проводки.

s = db.createStatement();

s.executeUpdate("INSERT INTO accounts VALUES ('" + name + "', '" +

password + "', 0)");

s.executeUpdate("CREATE TABLE " + name +

"_history (msg VARCHAR(80))");

s.executeUpdate("INSERT INTO " + name + "_history " +

"VALUES ('Account opened at " + new Date() + "')");

 

// Фиксация обновлений и завершение атомарной транзакции.

db.commit();

}

catch(SQLException e) {

// Если произошло исключение, то откат предыдущих обновлений

try { db.rollback(); } catch (Exception e2) {}

// Pass the SQLException on in the body of a BankingException

throw new BankingException("SQLException: " + e.getMessage() +

": " + e.getSQLState());

}

// закрытие Statement

finally { try { s.close(); } catch (Exception e) {} }

}

 

/**

* Метод проверки соответствия имени и пароля счету, выдача баланса

**/

public int verify(String name, String password)

throws BankingException, SQLException

{

Statement s = null;

try {

s = db.createStatement();

s.executeQuery("SELECT balance FROM accounts " +

"WHERE name='" + name + "' " +

" AND password = '" + password + "'");

ResultSet r = s.getResultSet();

if (!r.next())

throw new BankingException("неверное имя счета или пароль");

return r.getInt(1);

}

finally { try { s.close(); } catch (Exception e) {} }

}

 

/** закрытие счета */

public synchronized FunnyMoney closeAccount(String name, String password)

throws RemoteException, BankingException

{

int balance = 0;

Statement s = null;

try {

balance = verify(name, password);

s = db.createStatement();

// удаление счета из таблицы счетов

s.executeUpdate("DELETE FROM accounts " +

"WHERE name = '" + name + "' " +

" AND password = '" + password + "'");

// очистка истории транзакций для счета

s.executeUpdate("DROP TABLE " + name + "_history");

db.commit();

}

catch (SQLException e) {

try { db.rollback(); } catch (Exception e2) {}

throw new BankingException("SQLException: " + e.getMessage() +

": " + e.getSQLState());

}

finally { try { s.close(); } catch (Exception e) {} }

 

// возврат баланса, оставшегося на счете

return new FunnyMoney(balance);

}

 

/** внесение суммы на заданный счет */

public synchronized void deposit(String name, String password,

FunnyMoney money)

throws RemoteException, BankingException

{

int balance = 0;

Statement s = null;

try {

balance = verify(name, password);

s = db.createStatement();

// обновление баланса

s.executeUpdate("UPDATE accounts " +

"SET balance = " + balance + money.amount + " " +

"WHERE name='" + name + "' " +

" AND password = '" + password + "'");

// добавление строки к истории проводок

s.executeUpdate("INSERT INTO " + name + "_history " +

"VALUES ("внесено " + money.amount +

" в " + new Date() + "')");

db.commit();

}

catch (SQLException e) {

try { db.rollback(); } catch (Exception e2) {}

throw new BankingException("исключение SQL: " + e.getMessage() +

": " + e.getSQLState());

}

finally { try { s.close(); } catch (Exception e) {} }

}

 

/** снятие суммы со счета */

public synchronized FunnyMoney withdraw(String name, String password,

int amount)

throws RemoteException, BankingException

{

int balance = 0;

Statement s = null;

try {

balance = verify(name, password);

if (balance < amount)

throw new BankingException("недостаточно средств");

s = db.createStatement();

// обновление баланса счета

s.executeUpdate("UPDATE accounts " +

"SET balance = " + (balance - amount) + " " +

"WHERE name='" + name + "' " +

" AND password = '" + password + "'");

// добавление строки к истории проводок

s.executeUpdate("INSERT INTO " + name + "_history " +

"VALUES ('Withdrew " + amount +

" at " + new Date() + "')");

db.commit();

}

catch (SQLException e) {

try { db.rollback(); } catch (Exception e2) {}

throw new BankingException("SQLException: " + e.getMessage() +

": " + e.getSQLState());

}

finally { try { s.close(); } catch (Exception e) {} }

 

return new FunnyMoney(amount);

}

 

/** возвращение баланса по указанному счету */

public synchronized int getBalance(String name, String password)

throws RemoteException, BankingException

{

int balance;

try {

// получение баланса

balance = verify(name, password);

// фиксация транзакции

db.commit();

}

catch (SQLException e) {

try { db.rollback(); } catch (Exception e2) {}

throw new BankingException("SQLException: " + e.getMessage() +

": " + e.getSQLState());

}

// возвращение баланса

return balance;

}

 

/** получение истории проводок для заданного счета*/

public synchronized List getTransactionHistory(String name,

String password)

throws RemoteException, BankingException

{

Statement s = null;

List list = new ArrayList();

try {

// вызов метода verify для проверки пароля

// без запроса баланса.

verify(name, password);

s = db.createStatement();

// вывод информации из таблицы history

s.executeQuery("SELECT * from " + name + "_history");

// получение результата и помещение его в список

ResultSet r = s.getResultSet();

while(r.next()) list.add(r.getString(1));

// фиксация транзакции

db.commit();

}

catch (SQLException e) {

try { db.rollback(); } catch (Exception e2) {}

throw new BankingException(" исключение SQL: " + e.getMessage() +

": " + e.getSQLState());

}

finally { try { s.close(); } catch (Exception e) {} }

// возвращение списка с историей проводок.

return list;

}

 

/**

* Метод main() является самостоятельной программой,

* определяет к какой БД и каким драйвером осуществлять подключение,

* создает объект RemoteDBBankServer и регистрирует его в реестре,

* делая его доступным для пользователей

**/

public static void main(String[] args) {

try {

// создание объекта Properties. Инициализация его значений из файла

// BankDB.props или файла из командной строки, игнорируя ошибки

Properties p = new Properties();

try { p.load(new FileInputStream(args[0])); }

catch (Exception e) {

try { p.load(new FileInputStream("BankDB.props")); }

catch (Exception e2) {}

}

 

// Файл BankDB.props должен содержать свойства "driver" и "database",

// и необязательные "user" и "password".

String driver = p.getProperty("driver");

String database = p.getProperty("database");

String user = p.getProperty("user", "");

String password = p.getProperty("password", "");

 

// загрузка класса драйвера БД

Class.forName(driver);

 

// соединение с БД, хранящей информацию о счетах

Connection db = DriverManager.getConnection(database,

user, password);

 

// настройка БД для разрешения запросов и транзакций

db.setAutoCommit(false);

db.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

 

// создание серверного объекта, использующего соединение с БД

RemoteDBBankServer bank = new RemoteDBBankServer(db);

 

// чтение системного свойства для выяснения имени сервера.

// по умолчанию "SecondRemote".

String name = System.getProperty("bankname", "SecondRemote");

 

// регистрация сервера под этим именем

Naming.rebind(name, bank);

 

// сообщение о начале работы.

System.out.println(name + " открыт и ждет клиентов.");

}

catch (Exception e) {

System.err.println(e);

if (e instanceof SQLException)

System.err.println("SQL State: " +

((SQLException)e).getSQLState());

System.err.println("Usage: java [-Dbankname=<name>] " +

"com.davidflanagan.examples.sql.RemoteDBBankServer " +

"[<dbpropsfile>]");

System.exit(1);

}

}

}

 




Дата добавления: 2015-09-11; просмотров: 21 | Поможем написать вашу работу | Нарушение авторских прав

Пример 2.26. | Пример 3.1. | Пример 3.4. Обработка изображений. | Пример 3.5. Улучшенная анимация. | Пример 3.6. | Пример 4.1. | Простая сериализация. | Пример 5.3. | Часть 6. Программный интерфейс JavaBeans | Часть 7. Разработка Java-апплетов |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.083 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав