47
Тема 10. Взаимодействие на Java с базите от данни

Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

  • Upload
    others

  • View
    25

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Тема 10. Взаимодействие

на Java с базите от данни

Page 2: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Съдържание

Дефиниране на модела на таблиците на базата; Създаване, четене, промяна и изтриване на данните

в таблиците; Команди за добавяне на нови данни;

Команди за четене на данни;

Команди за промяна на съществуващи данни;

Команди за изтриване на данни;

Използване на Java Class за търсене на драйвер;

Взаимодействие на езика с базата от данни;

Настройка на връзката с базата от данни;

Получаване на адреса на данновия източник (DSN)

Page 3: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Дефиниране на модела натаблиците на базата

Същност: Определя/променя структурата на таблиците в DB.

Използва се езика за дефиниране на данни (DDL-data definition language)

Предназначение: Дефиниране; Промяна; Премахване на таблици в релационната база данни;

Page 4: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Дефиниране на модела натаблиците на базата

Програмно се създават SQL команди за създаване на таблици.

Съществуват и други команди на DDL:

За дефиниране на тригери;

Съхранени процедури;

Индекси на таблици:

– ускоряване на достъпа до данните;

Изгледи-виртуални таблици.

Page 5: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Дефиниране на модела натаблиците на базата

Моделиране на данновия модел:

Средства за проектиране на таблици. Фирмени:

– MS Access;

– MS SQL Server;

– Oracle;

– MySQL и др.

Универсални-написани на Java.

Page 6: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Дефиниране на модела на таблиците на базата

Програмно създаване на таблица:

Пример:

CREATE TABLE StudentRegister (

StudentFN CHAR(6) NOT NULL PRIMARY KEY,

NAME CHAR(30) NOT NULL,

PersonSex CHAR(3) NOT NULL,

PersonTitle CHAR(10) NOT NULL );

Page 7: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Дефиниране на модела на таблиците на базата

Програмна модификация:

ALTER TABLE StudentRegister

ADD , UpdDate DATETIME NULL;

Премахване:

DROP TABLE StudentRegister;

Page 8: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Създаване, четене, промяна и изтриване на данните в таблиците

Същност: За да се променят записаните данни в таблиците на релационната база се използваткоманди на SQL от езикът за промяна на данните (DML- data manipulation language).

Видове: Команди за добавяне на нови данни; Команди за четене на данни; Команди за промяна на съществуващи данни; Команди за изтриване на данни;

Page 9: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за добавяне на нови данни

Пример: Команда за добавяне на данни (SQL INSERT)

Добавя нов запис в таблица на базата от данни:

Участва името на таблицата (StudentRegister) исписък от колони;

Списъкът от данни за съответните колони:

Символните данни се заграждат в апострофи;

Числовите полета са без апострофи;

Датата се представя по формат (на MS Access):

Page 10: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за добавяне на нови данни

INSERT INTO StudentRegister ( StudentFN,

NAME,

PersonSex,

PersonTitle,

UpdDate) VALUES (‘6136010', 'Ivan', 'm', 'mr‘, ‘4/1/2017’);

Ако се изпълни заявка за добавяне на стойност към таблицата със същия ключ, командата за добавяне ще предизвика грешка.

Page 11: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за четене на данни

Четене на данни от базата-командата на DML SQL SELECT.

Пример: четене на един или нула записи на таблицата: В условната част на командата се поставя условие за

точно съвпадение на стойността на ключово поле на първичен ключ - колоната StudentFN да има стойност '6136010‘;

Заявката може да намери (само един) или да не намери запис с такава ключова стойност;

Не може да се получи повече от един записи ако ключовата стойност е уникална.

Page 12: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за четене на данни

Пример - команда за четене:

Четат се нула или повече записи:

В заявка за четене, в условната част на която, с помощта на клаузата WHERE, се изисква ключовата стойност да започва с низа ‘61360‘;

В SQL символът % в условието е указание за низ,съставен от символи на типа на полето;

‘%123‘, ‘%60%’ ...

Допълнително условие е сортирането на резултата от заявката по съдържанието на полето StudentFN;

Page 13: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за четене на данни

Пример 1 за селектираща заявка:

SELECT * FROM StudentRegister

WHERE StudentFN = '6136010';

Пример 2 за селектираща заявка:

SELECT * FROM StudentTable

WHERE NAME = 'Ivan' AND StudentFN LIKE ‘61360%‘ ORDER BY StudentFN;

Page 14: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за промяна на съществуващи данни

Промяна на данни в базата от данни-команда на DML SQL UPDATE:

В примерната команда се специфициратаблицата и двойки поле = стойност които дасе променят в нея;

Допълнително може да има и условна част-клаузата WHERE, която е специфична иопределя единствен (група) записи.

Page 15: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за промяна на съществуващи данни

Промяна на уникален запис:

UPDATE StudentTable

SET NAME = 'NewName',

PersonSex = 'm'

WHERE StudentFN = '6136010';

Page 16: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Команди за изтриване на данни

За да се изтрият данни от релационнабаза данни се използва команда на DML SQL DELETE.

Пример за синтаксис на командата за изтриване на записи в таблицата StudentTable при условие, че те имат номер (полето StudentFN) '6136010' или същият е по-малък от ‘6016010‘:

DELETE FROM StudentTableWHERE StudentFN = '6136010'OR StudentFN < ‘6016010'

Page 17: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Използване на Java Class за търсене на драйвер

Класовете в Java по време на изпълнение се представят от класа java.lang.Class;За всеки обект съществува обект от класа Class,

който може да се получи по време на изпълнение;

Обект от този клас позволява: от референция да се определи класа; да се получат неговите методи и други свойства;да се определи структурата на обекта;да се изпълнят неговите методи по време на изпълнение.

Процесът на получаване на информация по време на изпълнение се нарича “рефлексия”

Page 18: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Използване на Java Class за търсене на драйвер

Примерен клас за илюстрация на рефлексия:

import java.lang.reflect.Field;

public class Reflection {

public int intField = 1;

public String strField = "String value";

public Reflection() { }

(продължава)

Page 19: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Използване на Java Class за търсене на драйвер

public static void main(String[] args) {// Търсене на клас по име. forName () е статичен метод,// който връща обект от класа Class по дадено име като String

try {Reflection objReflection = new Reflection();Class classReflection = objReflection.getClass(); Class.forName("Reflection");// Class.forName("ReflectionBad");Field[] fields = classReflection.getFields( );for(int i=0; i<fields.length; i++) {

System.out.println("field : "+fields[i].toString()); }//field : public int Reflection.intField

}catch ( ClassNotFoundException e ) {

// не може да намери класаSystem.out.println("No found class : "+e.toString());

// No found class : java.lang.ClassNotFoundException: ReflectionBad}

}}

Page 20: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Основните стъпки при взаимодействието се изразяват в следното:

Инициализация на базата;

– Проверка за наличие на драйвер;

– Установяване на връзка;

– Установяване на параметри (при необходимост).

Изпълнение на заявки;

Затваряне на базата;

Page 21: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Инициализация на базата

Създава се връзка с базата от данни.

Пакети:

java.sql.Connection - за връзката с базата

java.sql.DriverManager-за драйверите към различни бази

java.sql.PreparedStatement-за заявките

java.sql.SQLException-за изключенията

java.sql.ResultSet-за резултантното множество

Пример на рамков код, с който се прави достъпа къмбазата от данни посредством драйвер JDBC отсъответната библиотека на Java:

Page 22: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Инициализация на базата:

Пример на рамков код, с който се прави достъпа къмбазата от данни посредством драйвер JDBC от съответната библиотека на Java. Основни класове(обекти):

// обект от клас Connection - представя връзката

Connection db;

// статичен низ за името на данновия източник

// пример: "jdbc:odbc:testDSN" – следва пояснение

static String url = < име на данновия източник >

// клас за командите за създаване и манипулация на данни

Statement statement; // PreparedStatement

Page 23: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Инициализация на базата (примерен код)void initDB() {

try {// зареждане на драйвера JDBC/ODBC вариантClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");// зареждане на драйвера ORACLE вариант// Class.forName ("oracle.jdbc.driver.OracleDriver");// получаване на връзката JDBC/ODBC вариантdb = DriverManager.getConnection(url);// изисква експлицитно изпълнение на Commitdb.setAutoCommit(false);statement = db.createStatement(); // незадължително

} catch (Exception e) {System.out.println("Could not initialize the database.");e.printStackTrace();

}}

Page 24: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Изпълнение на заявки. Реализация на добавяне на данни в базата данни:

private void insert(<контейнер >, <индекс>) throws SQLException {// обект от PreparedStatement, представящ командата

PreparedStatement st = null; try {

st = db.prepareStatement(<SQL команда за добавяне>);// запис на параметрите на заявката за добавяне

st.executeUpdate(); // изпълнение на командаdb.commit();// възприемане на променитеst.close();// затваряне на команда

} catch (SQLException e) {// обработка на изключение

}}

Page 25: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Пример: Реализация на четене от базата и запис в колекция private void loadFromDB(<контейнер >) {ResultSet rs;try {

// обект от PreparedStatement, представящ командата, изпълнениеPreparedStatement st = db.prepareStatement("Select * from

StudentRegister");// получаване на резултатите

ResultSet rs = st.getResultSet();if( rs != null){

while (rs.next()) {// четене на данни и запис в <контейнер>

}}else{/* няма данни */}st.close();

} catch (Exception e) {// обработка на изключението

}}

Page 26: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

DBSamples.javapackage dbTest;import java.sql.Connection; // за връзката с базата import java.sql.DriverManager; // за драйверите към

//различни базиimport java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.ResultSet;import java.util.*;public class DBSamples {

private Connection db; // връзка с базата от данниstatic String url = "jdbc:odbc:testDSN"; // статичен //адрес на източника

(продължава)

Page 27: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

// конструктор

public DBSamples() {

initDB();

try {

createDB();

} catch (SQLException e) {

System.out.println("Create database error");

}

}

Page 28: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

/*** Инициализация на базата*/

protected void initDB() {try {// зареждане на драйвера JDBC/ODBC вариант

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");// зареждане на драйвера ORACLE вариант// Class.forName ("oracle.jdbc.driver.OracleDriver");// получаване на връзката JDBC/ODBC вариант

db = DriverManager.getConnection(url);// изисква експлицитно изпълнение на Commit

db.setAutoCommit(false);} catch (Exception e) {

System.out.println("Could not initialize the database.");e.printStackTrace();

}}

(продължава)

Page 29: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

/** създаване на база данни */protected void createDB() throws SQLException {// обект от PreparedStatement, представящ командатаPreparedStatement statement = null;try {statement = db.prepareStatement("CREATE TABLE StudentRegister (" +

"StudentFN CHAR(6) NOT NULL PRIMARY KEY, " +"NAME CHAR(30) NOT NULL, " +"PersonSex CHAR(3) NOT NULL," +"PersonTitle CHAR(10) NOT NULL, " +"UpdDate DATETIME)");

statement.execute();db.commit();statement.close();

} catch (SQLException e) {// e.printStackTrace();

}}

(продължава)

Page 30: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

/** * Добавяне на студент в базата от данни */

protected void insert(ArrayList oColl, int index) {// обект от PreparedStatement, представящ командатаPreparedStatement statement = null;try {

statement = db.prepareStatement("INSERT INTO StudentRegister

VALUES(?,?,?,?,?)");Student oStudent = (Student) oColl.get(index);statement.setString(1, oStudent.getStrFacNumer());statement.setString(2, oStudent.getName());

Page 31: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

statement.setString(3, oStudent.getSex());statement.setString(4, oStudent.getTitle());java.util.Date updDate = oStudent.getLastDate(); //

new java.util.Date();java.sql.Date sqlToday = new

java.sql.Date(updDate.getTime());statement.setDate(5, sqlToday);statement.executeUpdate();db.commit();statement.close();

} catch (SQLException e) {// e.printStackTrace();

}}

Page 32: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

/*** четене на студентите от базата и запис в колекция*/

public void loadFromDB(ArrayList oColl) {PreparedStatement statement = null;try {

// Изпълнение на заявкатаResultSet rs = statement.executeQuery("select *

from StudentRegister");// четене на данни и запис в контейнерStudent oStudent = new Student();

Page 33: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

while (rs.next()) {

oStudent.setStrFacNumer(rs.getString("StudentFN"));oStudent.setName(rs.getString("NAME"));oStudent.setSex(rs.getString("PersonSex"));oStudent.setTitle(rs.getString("PersonTitle"));java.sql.Date sqlDate = rs.getDate("UpdDate");java.util.Date dbDate = new java.util.Date(sqlDate.getTime());oStudent.setDate(dbDate);

// добавяне на студента в колекцията …}

} catch (Exception e) {oColl.clear(); // нулиране на данните

}}

Page 34: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

public static void main(String[] args) {

CollectionSamples objFile = new CollectionSamples("Input.txt");

objFile.printColl(objFile.oColl);

DBSamples db = new DBSamples();

for (int i = 0; i < objFile.oColl.size(); i++) {

try {

db.insert((ArrayList) objFile.oColl, i);

} catch (SQLException e) {

e.printStackTrace();

}

}

CollectionSamples objDB = new CollectionSamples();

db.loadFromDB((ArrayList) objDB.oColl);

objDB.printColl(objFile.oColl);

}

}// край на класа

Page 35: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

Пример:CollectionSamples.java пример за клас съдържащ в себе си колекция

от данни за студентите. Те се прочитат от файл и се записват в база от данни

package dbTest;

import java.io.*;import java.io.RandomAccessFile;import java.util.*;public class CollectionSamples {// Създаване на колекция от класа ArrayList

public Collection oColl;public CollectionSamples() {oColl = new ArrayList();

}

Page 36: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

// Конструкторpublic CollectionSamples(String fileName ) {try {RandomAccessFile myFile = new RandomAccessFile(fileName,"r");String[] res = new String[4]; //Ivanov m mr. 6136001String strLine;oColl = new ArrayList();while((strLine = myFile.readLine()) != null ) { res = strLine.split(" ");Object oPersonExpl = new Student(res[0],res[1],res[2],res[3]);oColl.add(oPersonExpl);

}myFile.close();

}(продължава)

Page 37: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

catch (FileNotFoundException e){

System.out.println("File Not Found ...");

}

catch(EOFException e) { // стандартни изключения

System.out.println("End of file encountered ...");

}

catch (IOException e){

System.out.println("Input/Output Error ....");

}

} // край на конструктора

Page 38: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Взаимодействие на езика с базата от данни

// Отпечатване на колекцияpublic void printColl(Collection c) {

for(Iterator It = c.iterator(); It.hasNext();)

System.out.println(It.next().toString());

}

public static void main(String[] args) {

CollectionSamples obj = newCollectionSamples("Input.txt");

obj.printColl(obj.oColl);

}

}

Page 39: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данни

Page 40: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данни

Избор на драйвер:

Page 41: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данниСъздаване на даннов източник Access

Page 42: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данниСъздаване на даннов източник Access

Page 43: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данниСъздаване на даннов източник Access

Page 44: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данниСъздаване на даннов източник Access

Резултат: името на данновия източник, който се използва в примерния код за достъп до базата от данни Access:

static String url = "jdbc:odbc:testDSN";

Page 45: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данниСъздаване на даннов източник Access

Java 7+public void initDB() {

try {

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

db = DriverManager.getConnection("jdbc:ucanaccess://C:/…/People.mdb");

db.setAutoCommit(false);

statement = db.createStatement();

} catch (Exception e) {

System.out.println("Could not initialize the database.");

e.printStackTrace();

}

}

Page 46: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Настройка на връзката с базата от данниСъздаване на даннов източник Access

Java 7+public void closeDB() {

try {

if (statement != null) {

db.commit();

statement.close();

}

if (db != null) {

db.close();

}

} catch (Exception e) {

System.out.println("Could not close the current connection.");

e.printStackTrace();

}

}

Page 47: Тема 10. Взаимодействие на Java с базитеот данниТема 10. Взаимодействие на Java с базитеот ... PersonTitle CHAR(10) NOT

Въпроси ?