Подписаться на получение новых статей на почту:

JDBC. Взаимодействие Java-приложения и MySQL. Шаг №51

Всем привет.  Сегодня мы рассмотрим управление базой данных непосредственно с java-приложения, но через СУБД. Как Вы помните, в прошлой статье мы рассмотрели работу с базой данных через консоль. Теперь же SQL запросы будем посылать непосредственно из программы, на java используя методы JDBC и драйвер. Итак, разложим все по полкам. Что такое  JDBC (Java DataBase Connectivity — соединение с базами данных на Java)

– это своего рода интерфейс, набор объектов и методов для работы с различными источниками данных (СУБД) либо MySQL  либо Derby либо какая-нибудь другая.  Пакет  java.sql содержит классы и интерфейсы  JDBC. Ниже в программе мы используем некоторые из них. Мы можем представить архитектуру JDBC следующим образом: Java –приложение, которое вызывает методы JDBC    ---  компонент  JDBC, который распределяет клиентские вызовы по соответствующим базам данных  ---  драйвер  JDBC, который поддерживает сеанс связи с конкретной БД  ----  сама БД. Поверхностно JDBC выполняет три функции с БД:
— установление связи с СУБД;
— передача базе данных SQL-запросов;
— обработка полученных результатов.
У нас есть все кроме драйвера, в данном случае он поставляется производителем базы данных, а именно MySQL. Переходим на официальный сайт и в разделе интерфейсы MySQL  выбираем  взаимодействие Java и  MySПодключение JDBCQL, т.к. у нас приложение на  Java. Скачиваем что то типа mysql-connector-java-5.1.38 ( выбирая любую версию на свой вкус). Распаковываем архив. Нас интересует файл mysql-connector-java-5.1.38-bin.jar, вот эту библиотеку мы и подключаем к своему проекту. Как это делать мы рассматривали в статье №46, где подключали библиотеку для опроса COM-порта. Слева на рисунке менеджер проекта, где видна подключенная библиотека к нашему приложению.

Теперь приступим к программе. Используем классы пакета  java.sql.

import java.sql.Connection;  /*Выбирает методы для создания сеанса связи с базой данных*/
import java.sql.DriverManager;  /*Исключения для работы с БД*/
import java.sql.SQLException;
import java.sql.ResultSetMetaData;  /*Методы для обработки результата обращения к базе данных*/
import java.sql.Statement; /*Методы для передачи SQL-запроса базе данных*/
import java.sql.ResultSet; /*Методы для обработки результата обращения к базе данных*/
import java.util.Vector;  /*Содержит элементы, к которым можно получить доступ, используя целочисленный индекс.*/
public class conMySQL {
     private Connection con = null;
     public conMySQL (String driver, String url, String login, String pass) { /*driver – имя нашего драйвера MySQL Connector/J; url – адрес базы данных (имя) ; login – имя пользователя; pass – пароль.*/
            try {
                 Class.forName(driver); /*forName-загрузка драйвера для базы данных*/
                 con = DriverManager.getConnection(url, login, pass);
            } catch (ClassNotFoundException ex) /*Если нет драйвера */ {
                 System.err.println («conMySQL.Cannot find this db driver classes.»);
                 ex.printStackTrace ();
             } catch (SQLException e) { /*если DriverManager не может соединиться c базой*/
                  System.err.println («KFDB.Cannot connect to this db.»);
                  e.printStackTrace ();
             }        
       }
      public Vector<Vector<Object>> getNomen (String query) /*Возврат информации базы данных*/{
              Vector<Vector<Object>> retVector = new Vector<Vector<Object>>();
               try {
                    Statement st = con.createStatement (); /*Посылка запроса БД*/
                    ResultSet rs = st.executeQuery (query); /*Выполнение запроса и возврат данных*/
                    ResultSetMetaData rsmd = rs.getMetaData (); /*Устойстве набора данных*/
                   int cols = rsmd.getColumnCount ();/*Количество колонок в наборе данных*/
                   while (rs.next ()) {   /*Перемещаеся по строкам набора данных.*/
                        Vector<Object> newRow = new Vector<Object>();
                        for (int i = 1; i <= cols; i++) { /*Извлекаем значение из каждой ячейки строки*/
                             newRow.add (rs.getObject (i));
                        }
                        retVector.add (newRow); /*retVector отображение набора данных rs.*/
                  }
                  rs.close ();
                  st.close ();
             } catch (SQLException e) {
                  System.err.println ("conMySQL.There are problems with the query " + query);
                  e.printStackTrace ();
             }      
                  return retVector;
       }
  }

Выведем информацию содержащуюся в базе данных в приложение. Для этого создадим еще один класс, который будет  хранить информацию с базы данных и передавать в таблицу.
import java.util.Vector; 
import javax.swing.table.AbstractTableModel; /*Реализации методов в интерфейсе TableModel*/
public class modelMySQL extends AbstractTableModel {
      private static final long serialVersionUID = 1L;
      protected Vector<String> columnNames;    /*Имена колонок*/
      private Vector<Vector<Object>> tableData; /*Данные*/
      protected Vector<Object> vColClass; /*Классы колонок*/
      public modelMySQL () {
           super ();
           vColClass = new Vector<Object>();
           vColClass.add (0, Float.class);
           vColClass.add (1, Float.class);
           vColClass.add (2, String.class);
           vColClass.add (3, String.class);
           columnNames = new Vector<String>();
           columnNames.add («Температура 1»);
           columnNames.add («Температура 2»);
           columnNames.add («Время»);
           columnNames.add («Дата»);
     }
     @Override
     public int getColumnCount () {
           return columnNames.size ();
     }
     @Override
     public int getRowCount () {
           return getTableData ().size ();
     }
     @Override
     public Object getValueAt (int row, int column) {
           return getTableData ().get (row).get (column);
     }
      /* заголовки колонок*/
     public String getColumnName (int column) {
           return columnNames.get (column);
     }
     /*Запрещаем редактировать первую колонку*/
     public boolean isCellEditable (int row, int column) {
           if (column == 0){
                  return false;
           }
           return true;
      }
      public void setValueAt (Object obj, int row, int column) {
           if (column == 0) {
                  (getTableData ().get (row)).set (column, (Integer) obj);
           }     
          else if (column == 1) {
                 (getTableData ().get (row)).set (column, (String) obj);
           }
           fireTableCellUpdated (row, column);
      }
      public Class<?> getColumnClass (int col) {
           Class<?> c = Object.class;
           try {
                c = (Class<?>) vColClass.get (col);
           } catch (RuntimeException e){
                System.out.println (e);
           }
           return c;
      }
      public void setTableData (Vector<Vector<Object>> tableData) {
           this.tableData = tableData;
      }
      public Vector<Vector<Object>> getTableData () {
           return tableData;
      }
 }

Ну и последнее наш основной класс. Я его полностью не буду переписывать, только дополненные части. Полный текст в статье №47, где мы сохраняли данные логгера в текстовый файл.
import javax.swing.JScrollPane; /*Добавляем прокрутку в таблицу*/
import javax.swing.JTable;   /*таблица для показа базы данных*/
public class readLog extends Frame{ 
       . ..................................................................................
       private JTable table;
       private modelMySQL model; /*Объект для передачи данных базы в таблицу */
       private conMySQL baza; /*Создаем объект базы*/
..................................................................................
       public readLog () {
 .................................................................................
              /*Указываем драйвер, размещение базы данных, пароль и имя пользователя*/
             baza = new conMySQL («com.mysql.jdbc.Driver», «jdbc:mysql://localhost:3306/logger», «root», «root»);
             model = new modelMySQL ();
             model.setTableData (baza.getNomen («SELECT * FROM log»)); /*Запрос таблицы*/
             table = new JTable (model);/*Передаем в таблицу данные базы, обработанные в классе modelMySQL*/
             add (new JScrollPane (table), BorderLayout.CENTER);
             table.getColumnModel ().getColumn (2).setMaxWidth (50);
  .........................................................................................
       }
}

Загрузка базы данных в java-приложениеНа рисунке слева данные таблицы базы. Вы можете сравнить их с предыдущей статьей, где мы рассматривали способы записи данных в базу. Теперь немного о встроенном сервере MySQL. К сожалению через язык java нет возможности встроить сервер. Только с помощью интерфейса С/С++. Конечно можно было бы попробовать с помощью машинно-независимых методов JNI. Но мы не будем тратить время и возьмем прекрасное приложение (движок) SQLite. В следующей статье мы познакомимся с этой СУБД и встроим в нашу программу. На этом сегодня и остановимся. Всем пока.

Просмотрено 4722 раз.

Я на Google+

JDBC. Взаимодействие Java-приложения и MySQL. Шаг №51: Один комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting