Citirea și scrierea obiectelor de lob

Utilizarea obiectelor LOB mari (Bynary Large Object) necesită adesea o atenție deosebită. Acest lucru se datorează stocării diferitelor fișiere în tabelele bazei de date (DB). Imediat se pune întrebarea, de ce să stocați în fișierul bazei de date, dacă atunci trebuie să-l extrageți din nou sub forma unui fișier? La urma urmei, puteți crea un spațiu de stocare separat. Răspunsul se dovedește, de asemenea, simplu și banal: pentru stocarea fișierelor, trebuie să rezolvați problemele de replicare și sincronizare, acordând drepturi de acces și creând o copie de rezervă. Astfel, în cazul în care nu se poate face fără LOB-obiecte, rămâne de a alege tipul lor - binar (binary blob obiect mare) sau un personaj numit diferit (CLOB, TEXT), în baza de date a diferiți furnizori.







NOTĂ. Când lucrați cu date de caractere, este necesar să țineți cont de codificare. Această întrebare va fi luată în considerare la scrierea unui fișier text în tabelele bazei de date și descărcarea din baza de date.

Descrierea exemplului

Articolul descrie un exemplu de scriere și citire a mai multor tipuri de fișiere în câmpurile BLOB și CLOB (TEXT). Oracle Database 10g Enterprise Edition, Oracle 10g Express Edition și MySQL 5.1 au fost utilizate ca servere de baze de date.

Exemplul este un proiect Eclipse care implementează toate principiile OOP (programare orientată pe obiecte) - moștenire, încapsulare și polimorfism. Structura proiectului este prezentată în următoarea imagine.

Citirea și scrierea obiectelor de lob

În directorul "lib", există biblioteci JDBC pentru conectarea la serverele de baze de date. Când sa conectat la serverul 10g Enterprise Edition, a fost utilizată biblioteca ojdbc7.jar. În cazul serverului de 10g Express Edition, s-au folosit bibliotecile ojdbc14_g.jar, ojdbc14.jar. Pentru a conecta biblioteca la proiect în Eclipse IDE, selectați-o și selectați "Build Path / Add to Build Cale" din meniul contextual. Pentru a dezactiva utilizarea bibliotecii în proiect, utilizați fila "Java Build Path" din fereastra proprietăților proiectului.

Exemplul include următoarele module de program:

modul de bază pentru crearea unei conexiuni la serverul de baze de date și lucrul cu câmpurile BLOB și CLOB (TEXT);

Citirea unui obiect CLOB

Parametrii pentru scrierea și citirea LOB-urilor mari includ tabelul cu nume de tabel. numele câmpurilor LOB. numele câmpului cheie primar pk. ID-ul înregistrării id și calea spre fișierul fpath. Dacă este necesar, puteți modifica aceste proceduri și puteți include numele de schemă Schema (Oracle) sau baza de date a bazei de date (MySQL) ca parametru. Este posibil ca cheia primară să conțină mai multe câmpuri.

NOTĂ.
1. Rețineți că metodele de lucru cu câmpurile BLOB și CLOB nu sunt redefinite conform tabelului de mai sus. Dar aceasta se aplică în bazele de date Oracle și MySQL utilizate în exemplul respectiv. Ie putem spune că metodele JDBC "se descurcă" cu câmpurile LOB ale acestor furnizori. În plus, MySQL utilizează tipul TEXT și în Oracle CLOB.
2. Puteți folosi metode diferite pentru a scrie conținutul fișierelor în câmpurile LOB, așa cum se va demonstra în exemplul MySQL.







Mai jos este listarea DAOBase.java, unde metodele de lucru cu câmpurile BLOB și CLOB nu includ codul. Acest lucru se face în mod intenționat pentru a vizualiza structura generală a modulului DAOBase.java. În caz contrar, listarea va crește dramatic și "pentru copaci nu veți putea vedea pădurea". Codul de lucru cu câmpurile LOB este descris mai jos.

Afișați DAOBase.java

Proceduri pentru crearea createTable (sql) și îndepărtarea dropTable (sql) tabel DB nu sunt incluse în metodele comune lista DAOBase.java ca în exemplul îndeplini funcția auxiliară și este folosită pentru a „podygryshe“. În mod tipic, structura bazei de date este schimbată rar și nu este necesar să se includă în procedurile de aplicare care nu sunt utilizate.

Metode de listare pentru citirea și scrierea datelor în câmpul BLOB

Două funcții helper readBlobField și writeFromBlob2Stream au modificatori privați și sunt folosiți de metoda principală readBlobToFile atunci când descarcă un fișier din baza de date.

Pentru a scrie un fișier în câmpul BLOB, utilizați metoda setBinaryStream. primind fluxul FileInputStream ca parametru. Atunci când descărcarea unui fișier al bazei de date în metoda readBlobToFile citește primul obiect BLOB (readBlobField), atunci este scris la OutputStream flux de ieșire într-o writeFromBlob2Stream metodă, care utilizează o metodă de citire în obiectul blob getBinaryStream flux binar ().

Afișarea procedurilor de citire și scriere a datelor în câmpul CLOB

Două funcții helper readClobField și readFromClob2Stream au modificatori privați și sunt folosiți de principalele metode readClobToFile. readClobData când descărcați un fișier din baza de date.

Pentru a lua în considerare codificarea caracterelor atunci când scrieți un fișier text în baza de date este utilizat InputStreamReader și BufferedReader. Pentru intrările de fișiere în metoda câmp CLOB / TEXT este folosit obiect CLOB setCharacterStream. care este trimis la BufferedReader. Atunci când descărcarea unui fișier al bazei de date în metoda readClobToFile citește primul obiect CLOB (readClobField), atunci este scris în fluxul de ieșire în metoda BufferedWriter readFromClob2Stream, care utilizează o metodă de citire în obiectul CLOB getCharacterStream flux de simbol ().

Afișați OracleDAO.java

Înregistrarea modulului OracleDAO.java include metoda override createConnection () și metoda createTable de creare a procedurilor bazei de date. Structurile de tabelă descrise în constantele TABLE_blobs și TABLE_files sub formă de script-uri SQL includ numai câmpurile id și câmpurile de date ale tipurilor LOB corespunzătoare. În mod implicit, câmpurile de date au valori NULL, deoarece sunt utilizate în metodele de actualizare.

Când creați un obiect în designer, acesta creează imediat o conexiune la serverul de bază de date. Ca proprietate a obiectului de conexiune, codificarea conexiunii care trebuie stabilită este "utf8".

Afișați MySQLDAO.java

Afișarea modulului MySQLDAO.java include metoda override createConnection (). metoda de creare a procedurilor pentru baza de date createTable și metoda writeClob. care demonstrează o abordare diferită pentru scrierea unui fișier de caractere în câmpul TEXT. În această metodă, fluxul de fișiere FileInputStream este redirecționat imediat la fluxul setAsciiStream. Dar, pentru a nu distorsiona caracterele, codificarea corespunzătoare a fost utilizată în tabela de baze de date și conectată la server. Metoda de scriere clasa writeClob DAOBase.java a funcționat, de asemenea, fără reclamații. Astfel, aveți la dispoziție 2 moduri de a scrie un fișier text în baza de date MySQL.

Structurile de tabelă descrise în constantele TABLE_blobs și TABLE_files sub formă de script-uri SQL includ numai câmpurile id și câmpurile de date ale tipurilor LOB corespunzătoare. Pentru tabelul "fișiere", codificarea "UTF8" este setată. În mod implicit, câmpurile de date sunt NULL; sunt utilizate în metodele de actualizare.

Când creați un obiect în designer, creați imediat o conexiune la serverul de bază de date, care codifică conexiunea care trebuie setată ca "utf8".

Testați exemplul

Principalul modul de aplicație MainTest.java efectuează testarea metodelor de scriere a fișierelor în baza de date și încărcarea acestora într-un fișier. Principala metodă de testare testDAO ia ca parametru o clasă de bază (polimorfism). În metoda testDAO, este mai întâi verificată conexiunea la serverul de bază de date. Dacă conexiunea este stabilită, atunci se creează tabele în care fișierele sunt scrise și extrase.

Rezultatele testelor

Aplicația afișează mesaje și rezultate de testare pentru metode de scriere și citire a obiectelor LOB la consola.

Descărcați eșantion

Codul sursă pentru acest exemplu de scriere și citire a obiectelor LOB mari folosind JDBC poate fi descărcat aici (7,27 MB).

Când testați exemplul, trebuie să determinați parametrii conexiunii la serverul de bază de date - schema (baza de date), datele de conectare și parola.







Trimiteți-le prietenilor: