17530

Робота з базами даних в Java з використанням JDBC

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота №1 Тема: Робота з базами даних в Java з використанням JDBC. Мета: Навчитись виконувати основні операції при роботі з базами даних в Java використовуючи JDBC API. Теоретичні відомості Таблиці. В бібліотеці javax.swing є клас JTable який представляє таблицю. Для

Украинкский

2013-07-04

51.5 KB

4 чел.

Лабораторна робота №1

Тема: Робота з базами даних в Java з використанням JDBC.

Мета: Навчитись виконувати основні операції при роботі з базами даних в Java, використовуючи JDBC API.

Теоретичні відомості

Таблиці. В бібліотеці javax.swing є клас JTable, який представляє таблицю. Для повноцінної роботи з таблицею для неї потрібно вказати модель даних – клас, об’єкт якого репрезентує ті дані, які будуть в таблиці. Приклад такого класу:

import javax.swing.table.AbstractTableModel;

class MyDataModel extends AbstractTableModel{

 Integer[][] array=new Integer[3][3]; //Масив, в якому зберігаються дані, що будуть видні в таблиці

 public MyDataModel(){

   for (int i=0;i<3;i++)

     for (int j=0;j<3;j++)

       array[i][j]=new Integer(0);

 }

 public int getColumnCount() {return 3;}//В таблиці 3 стовпчика

 public int getRowCount() {return 3;} //В таблиці 3 рядка

 public boolean isCellEditable(int row, int column) { //Чи можна редагувати значення в комірках таблиці

   return true;

 }

 public Object getValueAt(int row,int col) { //Дані, що відображаються в таблиці

   return array[row][col];

 }

 public void setValueAt(Object value,int row,int col){ //Дані, що записуються в таблицю

   array[row][col]=new Integer((String)value);

 }

}

Потрібно звернути увагу на те, що клас MyDataModel спадкується від стандартного класу AbstractTableModel з пакету javax.swing.table. Всі методи в MyDataModel (крім конструктора, звичайно) перевизначають методи AbstractTableModel.

При використанні таблиці потрібно створити об’єкт даного класу і вказати його як параметр при створенні об’єкта JTable.

Для того, щоб проводити обрахунки з даними, введеними в таблицю, потрібно перетворювати їх з одного типу в інший. Для цього іноді потрібно використовувати операцію приведення типу.

Колекції. Колекція – це деяка послідовність зв’язаних елементів. Прикладом колекції є масив. Також використовуються інші типи колекцій. Наприклад, в Java клас java.util.Vector реалізує список елементів. При цьому в даній колекції може бути довільна кількість елементів довільних типів. Основні методи, що використовуються для роботи з класом Vector:

void add(int index, Object element)

Object elementAt(int index)

Enumeration elements()

int indexOf(Object elem)

int size()

Зв’язок програми на Java з сервером баз даних InterBase. Для роботи програми з базою даних програма повинна насамперед під’єднатися (connect) до БД. Існують різні способи забезпечення зв’язку Java-програми з базами даних Firebird. Наприклад, можна використовувати ODBC або прямий зв’язок JDBC-Firebird. Для його забезпечення можна встановити програму InterBase InterClient (після установки цієї програми потрібно звернути увагу на змінну середовища CLASSPATH – одним з шляхів там повинна бути крапка) або використати спеціальні бібліотеки роботи з БД, як firebirdsql-full.jar.

Робота з БД. Далі наведено приклад моделі даних (клас спадкується від AbstractTableModel), яка бере дані з БД:

/*

* @(#)JDBCAdapter.java 1.12 01/12/03

*

* Copyright 2002 Sun Microsystems, Inc. All rights reserved.

* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

*/

/**

* An adaptor, transforming the JDBC interface to the TableModel interface.

*

* @version 1.20 09/25/97

* @author Philip Milne

*/

import java.util.Vector;

import java.sql.*;

import javax.swing.table.AbstractTableModel;

import javax.swing.event.TableModelEvent;

public class JDBCAdapter extends AbstractTableModel {

   Connection          connection;

   Statement           statement;

   ResultSet           resultSet;

   String[]            columnNames = {};

   Vector  rows = new Vector();

   ResultSetMetaData   metaData;

   public JDBCAdapter(String url, String driverName,

                      String user, String passwd) {

       try {

           Class.forName(driverName);

           System.out.println("Opening db connection");

           connection = DriverManager.getConnection(url, user, passwd);

           statement = connection.createStatement();

       }

       catch (ClassNotFoundException ex) {

           System.err.println("Cannot find the database driver classes.");

           System.err.println(ex);

       }

       catch (SQLException ex) {

           System.err.println("Cannot connect to this database.");

           System.err.println(ex);

       }

    }

   public void executeQuery(String query) {

       if (connection == null || statement == null) {

           System.err.println("There is no database to execute the query.");

           return;

       }

       try {

           resultSet = statement.executeQuery(query);

           metaData = resultSet.getMetaData();

           int numberOfColumns =  metaData.getColumnCount();

           columnNames = new String[numberOfColumns];

           // Get the column names and cache them.

           // Then we can close the connection.

           for(int column = 0; column < numberOfColumns; column++) {

               columnNames[column] = metaData.getColumnLabel(column+1);

           }

           // Get all rows.

           rows = new Vector();

           while (resultSet.next()) {

               Vector newRow = new Vector();

               for (int i = 1; i <= getColumnCount(); i++) {

            newRow.addElement(resultSet.getObject(i));

               }

               rows.addElement(newRow);

           }

           //  close(); Need to copy the metaData, bug in jdbc:odbc driver.

           fireTableChanged(null); // Tell the listeners a new table has arrived.

       }

       catch (SQLException ex) {

           System.err.println(ex);

       }

   }

   public void close() throws SQLException {

       System.out.println("Closing db connection");

       resultSet.close();

       statement.close();

       connection.close();

   }

   protected void finalize() throws Throwable {

       close();

       super.finalize();

   }

   //////////////////////////////////////////////////////////////////////////

   //

   //             Implementation of the TableModel Interface

   //

   //////////////////////////////////////////////////////////////////////////

   // MetaData

   public String getColumnName(int column) {

       if (columnNames[column] != null) {

           return columnNames[column];

       } else {

           return "";

       }

   }

   public Class getColumnClass(int column) {

       int type;

       try {

           type = metaData.getColumnType(column+1);

       }

       catch (SQLException e) {

           return super.getColumnClass(column);

       }

       switch(type) {

       case Types.CHAR:

       case Types.VARCHAR:

       case Types.LONGVARCHAR:

           return String.class;

       case Types.BIT:

           return Boolean.class;

       case Types.TINYINT:

       case Types.SMALLINT:

       case Types.INTEGER:

           return Integer.class;

       case Types.BIGINT:

           return Long.class;

       case Types.FLOAT:

       case Types.DOUBLE:

           return Double.class;

       case Types.DATE:

           return java.sql.Date.class;

       default:

           return Object.class;

       }

   }

   public boolean isCellEditable(int row, int column) {

       try {

           return metaData.isWritable(column+1);

       }

       catch (SQLException e) {

           return false;

       }

   }

   public int getColumnCount() {

       return columnNames.length;

   }

   // Data methods

   public int getRowCount() {

       return rows.size();

   }

   public Object getValueAt(int aRow, int aColumn) {

       Vector row = (Vector)rows.elementAt(aRow);

       return row.elementAt(aColumn);

   }

   public String dbRepresentation(int column, Object value) {

       int type;

       if (value == null) {

           return "null";

       }

       try {

           type = metaData.getColumnType(column+1);

       }

       catch (SQLException e) {

           return value.toString();

       }

       switch(type) {

       case Types.INTEGER:

       case Types.DOUBLE:

       case Types.FLOAT:

           return value.toString();

       case Types.BIT:

           return ((Boolean)value).booleanValue() ? "1" : "0";

       case Types.DATE:

           return value.toString(); // This will need some conversion.

       default:

           return "\""+value.toString()+"\"";

       }

   }

   public void setValueAt(Object value, int row, int column) {

       try {

           String tableName = metaData.getTableName(column+1);

           // Some of the drivers seem buggy, tableName should not be null.

           if (tableName == null) {

               System.out.println("Table name returned null.");

           }

           String columnName = getColumnName(column);

           String query =

               "update "+tableName+

               " set "+columnName+" = "+dbRepresentation(column, value)+

               " where ";

           // We don't have a model of the schema so we don't know the

           // primary keys or which columns to lock on. To demonstrate

           // that editing is possible, we'll just lock on everything.

           for(int col = 0; col<getColumnCount(); col++) {

               String colName = getColumnName(col);

               if (colName.equals("")) {

                   continue;

               }

               if (col != 0) {

                   query = query + " and ";

               }

               query = query + colName +" = "+

                   dbRepresentation(col, getValueAt(row, col));

           }

           System.out.println(query);

           System.out.println("Not sending update to database");

           // statement.executeQuery(query);

       }

       catch (SQLException e) {

           //     e.printStackTrace();

           System.err.println("Update failed");

       }

       Vector dataRow = (Vector)rows.elementAt(row);

       dataRow.setElementAt(value, column);

   }

}

Далі наведено приклади рядків, які потрібні для підключення до БД:

   String databaseURL = " jdbc:firebirdsql://localhost/d:/work/employee.fdb";

   String user = "sysdba";

   String password = "masterkey";

   String driverName = "org.firebirdsql.jdbc.FBDriver";

Завдання: Створити Firebird-базу даних, в якій є одна таблиця з не менше, ніж 5 полями. В таблиці повинні бути поля типа integer, varchar, date.

Написати Java-програму, яка відображає таблицю бази даних на екрані в табличній формі та дозволяє редагувати дані.


 

А также другие работы, которые могут Вас заинтересовать

71773. КЛАССИФИКАЦИЯ ИПОТЕЧНЫХ КРЕДИТОВ И СИСТЕМА УПРАВЛЕНИЯ РИСКАМИ ИПОТЕЧНОГО ЖИЛИЩНОГО КРЕДИТОВАНИЯ 174 KB
  Сумма кредита может составлять от 50 до 100 процентов стоимости заложенного имущества. Оформление залога и выдача кредита осуществляются поэтапно по мере строительства объекта. В некоторых областях России разработана схема кредитования жилья в сельской местности с использованием...
71774. ПОСЛЕДСТВИЯ ПРИЗНАНИЯ ХОЗЯЙСТВУЮЩЕГО СУБЪЕКТА МОНОПОЛИСТОМ ПО ЗАКОНОДАТЕЛЬСТВУ РОССИИ И ФРАНЦИИ 165.5 KB
  Признание хозяйствующего субъекта монополистом влечет за собой такие ущемляющие права хозяйствующих субъектов последствия, как государственное регулирование цен, ограничения в приватизации, обязанность принять к исполнению заказ на поставку продукции для государственных нужд.
71775. ОСНОВАНИЯ ПРИОБРЕТЕНИЯ ГРАЖДАНСТВА РОССИИ И ЗАРУБЕЖНЫХ ГОСУДАРСТВ 159 KB
  В этой связи принципиальным является положение статьи 6 Конституции о том что гражданство едино и равно независимо от оснований приобретения что имеет непосредственное значение для последствий приобретения лицом российского гражданства.
71776. ЭКСКУРС В ИСТОРИЮ РАЗВИТИЯ ИПОТЕЧНЫХ ОТНОШЕНИЙ В РОССИИ 99.5 KB
  Ипотека в Древнем мире. Слово «ипотека» греческое, оно вошло в обиход еще в VI в. до н. э. Афинский реформатор Солон в 594 г. до н. э. осуществил свои знаменитые реформы, в результате которых была введена свобода завещания и отменены поземельные долги.
71777. НЕКОТОРЫЕ ОСОБЕННОСТИ ПРОВЕДЕНИЯ ПРОВЕРОК КРЕДИТНЫХ ОРГАНИЗАЦИЙ БАНКОМ РОССИИ 88.5 KB
  Как известно в 2003 г. в сфере банковского надзора осуществляемого Банком России произошли существенные изменения вызванные тем что нормативная база Центрального банка уже не отвечала изменившимся реалиям современной банковской системы и надзора за ней.
71778. РЕАЛИЗАЦИЯ КОНСТИТУЦИОННЫХ ГАРАНТИЙ ПРАВ ЧЕЛОВЕКА В ПРАВОВОМ СТАТУСЕ АКЦИОНЕРА В АКЦИОНЕРНОМ ОБЩЕСТВЕ 134 KB
  Гражданский кодекс в части 1 статьи 96 дает такое определение: Акционерным обществом признается общество уставный капитал которого разделен на определенное число акций; участники акционерного общества акционеры не отвечают по его обязательствам и несут риск...
71779. ОТДЕЛЬНЫЕ ВОПРОСЫ ОБЕСПЕЧЕНИЯ НОТАРИАТОМ ГАРАНТИЙ ПРАВА НАСЛЕДОВАНИЯ В РОССИЙСКОЙ ФЕДЕРАЦИИ 110 KB
  Право наследования представляет собой одну из гарантий права собственности обеспечивая его стабильность и преемственность и гарантируется нормами различных законов и подзаконных актов системы отечественного законодательства раскрывающими и конкретизирующими конституционные нормы.
71780. ПРАВОВОЕ РЕГУЛИРОВАНИЕ ИНФОРМАЦИОННОГО ОБЕСПЕЧЕНИЯ ПРОИЗВОДСТВА ПО ДЕЛАМ ОБ АДМИНИСТРАТИВНЫХ ПРАВОНАРУШЕНИЯХ 96 KB
  В Конституции предусмотрено что сбор хранение использование и распространение информации о частной жизни лица без его согласия не допускаются. Об информации информатизации и защите информации. В соответствии с Положением о Главном информационном центре Министерства...
71781. ОСОБЕННОСТИ УЧАСТИЯ ИНОСТРАННОГО ГРАЖДАНИНА В ПРОЦЕДУРЕ УСЫНОВЛЕНИЯ РОССИЙСКИХ ДЕТЕЙ ИНОСТРАННЫМИ ГРАЖДАНАМИ 130 KB
  Помимо законодательства указанных выше государств с учетом положений международного договора Российской Федерации о межгосударственном сотрудничестве в области усыновления детей должны соблюдаться правила российского законодательства а именно: правила о детях передаваемых на усыновление...