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


 

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

78339. Периодический закон 35.06 KB
  Опирающаяся на периодический закон классификация химических элементов которую Менделеев выразил в форме периодической системы сыграла очень важную роль в изучении свойств химических элементов и дальнейшем развитии учения о строении вещества. В отличие от своих предшественников Менделеев был глубоко убежден что между всеми химическими элементами должна существовать закономерная связь объединяющая их в единое целое и пришел к заключению что в основу систематики элементов должна Эта замечательная закономерность получила свое выражение в...
78340. Теория химического строения 94.09 KB
  При взаимодействии атомов между ними может возникать химическая связь, приводящая к образованию устойчивой многоатомной системы — молекулы, молекулярного нона, кристалла. Чем прочнее химическая связь, тем больше энергии нужно затратить для ее разрыва; поэтому энергия разрыва связи служит мерой ее прочности.
78342. Термохимия. Превращение энергии при химических реакциях 69.35 KB
  Химические реакции протекают с выделением или с поглощением энергии. Наоборот такие реакции как разложение карбоната кальция образование оксида азота II из азота и кислорода требуют для своего протекания непрерывного притока теплоты извне и тотчас же приостанавливаются если нагревание прекращается. Ясно что эти реакции протекают с поглощением теплоты. Выделение теплоты при взаимодействии различных веществ за ставляет признать что эти вещества еще до реакции в скрытой форме обладали определенной энергией.
78343. Кинетика химических реакций 45.02 KB
  Скорость реакции гетерогенных системах. Цепные реакции. Химические реакции протекают с различными скоростями. Некоторые из них полностью заканчиваются за малые доли секунды другие осуществляются за минуты часы дни; известны реакции требующие для своего протекания несколько лет десятилетий и еще более длительных отрезков времени.
78344. Химическое равновесие 36.98 KB
  Необратимые и обратимые химические реакции. Химические реакции можно разбить на две группы: необратимые и обратимые реакции. Необратимые реакции протекают до конца до полного израсходования одного из реагирующих веществ. Обратимые реакции протекают не до конца: при обратимой реакции ни одно из реагирующих веществ не расходуется полностью.
78345. Дисперсные системы. Коллоидные растворы 56.53 KB
  Таким образом одно и то же вещество может находиться в различной степени раздробленности: макроскопически видимые частицы 02 01 мм разрешающая способность глаза микроск пически видимые частицы от 02 01 мм до 400 300 нм разрешающая способность микроскопа при освещении белым светом и отдельные молекулы или ионы. Постепенно складывались представления о том что между миром молекул и микроскопически видимых частиц находится область раздробленности вещества с комплексом новых свойств присущих этой форме организации вещества. Если...
78346. Коррозия металлов. Определение и классификация коррозийных процессов 160.12 KB
  В случае с металлами говоря об их коррозии имеют ввиду нежелательный процесс взаимодействия металла со средой. Физико-химическая сущность изменений которые претерпевает металл при коррозии является окисление металла. Любой коррозионный процесс является многостадийным: Необходим подвод коррозионной среды или отдельных ее компонентов к поверхности металла. Полный или частичный отвод продуктов от поверхности металла в объем жидкости если среда жидкая.
78347. Химические связи. Метод валентных связей 169.26 KB
  Способы образования ковалентной связи. Направленность ковалентной связи. Химические связи химическая связь взаимное притяжение атомов приводящее к образованию молекул и кристаллов.