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-програму, яка відображає таблицю бази даних на екрані в табличній формі та дозволяє редагувати дані.


 

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

13290. Автоматизация создания документов с помощью Visual Basic .NET 101.5 KB
  6. ЛАБОРАТОРНАЯ РАБОТА Автоматизация создания документов с помощью Visual Basic .NET 6.1. Цель работы: приобретение практических навыков автоматизации создания документов с помощью Visual Basic с использованием инструментальных средств интегрированной среды разработки Vis...
13291. ТЕХНОЛОГІЇ ПРОГРАМУВАННЯ 1.46 MB
  МЕТОДИЧНІ ВКАЗІВКИ до лабораторних робіт з дисципліни ТЕХНОЛОГІЇ ПРОГРАМУВАННЯ Методичні вказівки до лабораторних робіт з дисципліни €œТехнології програмування€ для студентів напрямів 6.040302 Інформатика 6.040301 Прикладна математика / Упоряд. Кобилін О.А. Маш...
13292. ТЕХНОЛОГІЇ ПРОГРАМУВАННЯ. МЕТОДИЧНІ ВКАЗІВКИ ДО КУРСОВОГО ПРОЕКТУВАННЯ 666 KB
  МЕТОДИЧНІ ВКАЗІВКИ ДО КУРСОВОГО ПРОЕКТУВАННЯ З ДИСЦИПЛІНИ ТЕХНОЛОГІЇ ПРОГРАМУВАННЯ Методичні вказівки до курсового проектування з дисципліни Технології програмування для студентів напряму 6.040302 Інформатика /Упоряд.: Кобилін О.А. Руденко Д.О. Харкiв: ХНУРЕ ...
13293. Лабораторный практикум по механизации животноводства для студентов сельскохозяйственных высших учебных заведений инженерных специальностей 8.35 MB
  Лабораторный практикум по механизации животноводства для студентов сельскохозяйственных высших учебных заведений инженерных специальностей / В.К. Полянин В.Я. Спевак Р.А. Денисов Романов В книге рассмотрены устройство принцип действия техническое обслуживание р
13294. ЦСП ИКМ-480 611 KB
  ЦСП ИКМ480. Комплекс аппаратуры третичной ЦСП ИКМ480 предназначен для организации на внутризоновых и магистральной сетях связи пучков каналов по кабелю МКТ4 с парами 12/46 мм. Аппаратура обеспечивает организацию до 480 каналов ТЧ при скорости передачи группового потока 34 368...
13295. Принцип построения ЦСП 9.04 KB
  Принцип построения ЦСП В состав комплекса аппаратуры ИКМ30 входят аналогоцифровое оборудование АЦО оконечное оборудование линейного тракта ОЛТ необслуживаемый регенерационный пункт НРП и комплект контрольноэксплуатационных устройств содержащий пульты кон
13296. Формирование группового цифрового сигнала 45.85 KB
  Формирование группового цифрового сигнала передача телефонных сигналов по каналам ЦСП с ВРК осуществляется при использовании импульснокодовой модуляции ИКМ. В этом случае формирование группового цифрового сигнала предусматривает последовательное выполнение сле
13297. Линейный тракт аппаратуры ИКМ-30 10 KB
  Линейный тракт аппаратуры ИКМ30 включает в себя обслуживаемые оконечные и промежуточные станции соединенные кабельными линиями с включенными необслуживаемыми регенерационными пунктами НРП. Регенерация цифрового сигнала после прохождения каждого участка кабельно
13298. Искажение сигнала в линии 6.93 KB
  Искажение сигнала в линии На вход Регенераторарегенератор импульсов поступает искаженный помехами линейный сигнал. Основными видами помех в линейном тракте являются: межсимвольные помехи первогопервого и второговторого рода; переходные помехи от других с