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


 

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

58697. Іменник. Загальне значення і граматичні ознаки іменника 8.41 MB
  Мета: розширювати і поглиблювати знання учнів про іменник як частину мови; познайомити з іменниками назвами істот та неістот їх характерними ознаками; з іменниками на позначення власних і загальних назв навчити розрізняти їх учити писати в великої літери власні іменники...
58700. Звязок іменників з прикметниками 444.5 KB
  Мета: розширити знання дітей про граматичний і смисловий зв’язок прикметників з іменниками; закріпити прийоми розпізнавання числа, роду, відмінка прикметників. Розвивати вміння будувати зв’язні розповіді га задану тему.
58701. Школьные правила 39 KB
  Цели Оборудование: проигрыватель, грамзапись с ритмической зарядкой; аудиозаписи: голоса птиц, школьных песен, “Урок поведения”, “Песня первоклашки”, Шадоус “Девушка в красном”; иллюстрация – “Зайчик”; игрушки – ёж, лесной медвежонок, зайчонок...
58702. Предмети, що мене оточують 20.96 KB
  Мета: ознайомити учнів з вживанням присвійного відмінка іменників; тренувати у вживанні структури thisis; повторити ЛО з теми «Шкільне приладдя»; розвивати в учнів фонематичний слух, мислення, память, увагу, комунікативні навички
58703. Маркетинг. Урок з економіки 108 KB
  Розвиток вмінь використовувати здобуті знання з маркетингу на практиці: проводити сегментацію ринку; приймати споживче рішення; працювати з графіком життєвого циклу товару та визначати етапи життєвого...
58704. Людські - чесноти. Доброта 166 KB
  Мета: продовжити знайомити учнів з людськими чеснотами вчити характеризувати події та явища як прояв добра і зла розкрити моральний зміст доброти; сприяти розвитку в учнів мотивації до добрих гуманних вчинків розвивати мислення творчу уяву збагачувати словниковий запас...