تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الثامن - تخزين البيانات الضخمة بقاعدة البيانات اوراكل بواسطة الجافا
#1
كاتب الموضوع : tibo


بسم الله الرحمن الرحيم

هل لديك مشروع و تريد تخزين و استرجاع البيانات من صور و مقاطع صوتية و مرئية بقاعدة بيانات Oracle؟

هذا الدرس سوف تقوم من خلاله بعمل المطلوب. و سوف نقوم باستعراض الدرس بالشفرات البرمجية المطلوبة لفهم الموضوع على أكمل وجه (و الكمال لله تعالى).



الـ BLOB و الـ CLOB: و هي اختصار لـ Binary Large Object و اختصار لـ Character Large Object. من ناحية أخرى، هذان النوعان صمما لحفظ و استرجاع البيانات الضخمة بقاعدة البيانات. و التي تصل سعة التخزين إلى أربع جيجابايت (4 GB) من البيانات. و هما من الأنواع التي توجد بالـ SQL3، و التي هي مدعومة من الـ JDBC 2.0. الـ JDBC 2.0 تخدم نوعان جديدان و هما الـ BLOB و الـ CLOB للتعامل مع الأنواع الجديدة من الـ SQL3. و بهذا الدرس سوف نستخدم الـ BLOB لتخزين و استرجاع الصور من و إلى قاعدة البيانات.

أولاً سوف نقوم بإنشاء جدول جديد باستخدام SQL Plus أو بأي طريقة أخرى و نسميه demo:

CREATE TABLE demo (id NUMBER(6), image BLOB);

كما تلاحظ يوجد لدينا عمودان. الأول و هو مخصص لإضافة رقم خاص لكل صورة و هو من نوع NUMBER، و العمود الثاني و هو لتخزين البيانات (مثل: الصور و المقاطع الصوتية و المرئية) و هو من نوع BLOB.

سوف نقوم باستعراض أربع أمور:

تخزين البيانات بقاعدة البيانات.
استرجاع البيانات من قاعدة البيانات و حفظها على هيئة ملفات.
حذف البيانات من قاعدة البيانات.
إظهار البيانات و استخدامها ببرامج الجافا.



تخزين البيانات بقاعدة البيانات:
الآن سوف نقوم بكتابة شفرة برمجية بلغة الجافا لتخزين الصور بقاعدة بيانات Oracle.

كود :
import java.io.*;
import java.sql.*;
import oracle.sql.BLOB;
import oracle.jdbc.driver.*;

public class WriteBlob {
private Connection con;
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2";
private String user = "scott";
private String password = "tiger";

public WriteBlob() {
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection(url, user, password);
}
catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception, IOException {
new WriteBlob().process();
}
public void process() throws IOException, SQLException {
int rows = 0;
FileInputStream fin = null;
OutputStream out = null;
ResultSet rslt = null;
Statement stmt = null;
BLOB photo = null; // NOTE: oracle.sql.BLOB!!!
long person_id = 0;

try {
con.setAutoCommit(false);
stmt = con.createStatement();
rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT");
while (rslt.next()) {
rows++;
photo = (BLOB)rslt.getBlob("image");
}
rslt.close();
rslt = null;
/**
* If it doesn't exist, then insert a row in the information table
* This creates the LOB locators
*/
if (rows == 0) {
rows = stmt.executeUpdate("INSERT INTO demo VALUES (1, empty_blob())");
System.out.println(rows + " rows inserted");
// Retrieve the locator
rows = 0;
rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT");
rslt.next();
photo = ((OracleResultSet)rslt).getBLOB("image");
rslt.close();
rslt = null;
}
stmt.close();
stmt = null;
// Now that we have the locator, lets store the photo
File binaryFile = new File("jfc.gif");
fin = new FileInputStream(binaryFile);
out = photo.getBinaryOutputStream();
// Get the optimal buffer size from the BLOB
byte[] buffer = new byte[photo.getBufferSize()];
int length = 0;
while ((length = fin.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
// you need to close the output stream before
// you commit, or the changes are lost!
out.close();
out = null;
fin.close();
fin = null;
con.commit();
}
catch (SQLException e) {
System.err.println("SQL Error: " + e.getMessage());
}
catch (IOException e) {
System.err.println("IO Error: " + e.getMessage());
}
finally {
if (rslt != null) {
try {
rslt.close();
}
catch (SQLException ignore) {}
}
if (stmt != null) {
try {
stmt.close();
}
catch (SQLException ignore) {}
}
if (out != null) {
try {
out.close();
}
catch (IOException ignore) {}
}
if (fin != null) {
try {
fin.close();
}
catch (IOException ignore) {}
}
}
}
protected void finalize() throws Throwable {
if (con != null) {
try {
con.close();
}
catch (SQLException ignore) {}
}
super.finalize( );
}
}
و الآن سوف نقوم بشرح مبسط للشفرة البرمجية السابقة:

كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700]private [/color][color=#0000bb]String url [/color][color=#007700]= [/color][color=#dd0000]"jdbc:oracle:thin:@127.0.0.1:1521:ORCL2"[/color][COLOR=#007700];
private [/COLOR][color=#0000bb]String user [/color][color=#007700]= [/color][color=#dd0000]"scott"[/color][COLOR=#007700];
private [/COLOR][color=#0000bb]String password [/color][color=#007700]= [/color][color=#dd0000]"tiger"[/color][COLOR=#007700];
  
[/COLOR][color=#0000bb]هنا سوف نقوم بتحديد نوع الـ Driver و بالمثال السابق استخدمنا thin driver و قمنا بتحديد مكان قاعدة البيانات و هي موجودة بالجهاز المحلي و تحديد المنفذ و هو 1521 و حددنا اسم الـ SID لقاعدة البيانات و هي ORCL2 [/color][color=#007700]([/color][color=#0000bb]يجب تغيير المتغيرات عند الحاجة لذلك[/color][color=#007700]). [/color][color=#0000bb]و قمنا أيضاً بتحديد اسم المستخدم و كلمة المرور له[/color][COLOR=#007700].
  
[/COLOR][color=#0000bb]rows [/color][color=#007700]= [/color][color=#0000bb]stmt[/color][color=#007700].[/color][color=#0000bb]executeUpdate[/color][color=#007700]([/color][color=#dd0000]"INSERT INTO demo VALUES (1, empty_blob())"[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#0000bb]rows [/color][color=#007700]+ [/color][color=#dd0000]" rows inserted"[/color][COLOR=#007700]);
[/COLOR][COLOR=#ff8000]// Retrieve the locator
[/COLOR][color=#0000bb]rows [/color][color=#007700]= [/color][color=#0000bb]0[/color][COLOR=#007700];
[/COLOR][color=#0000bb]rslt [/color][color=#007700]= [/color][color=#0000bb]stmt[/color][color=#007700].[/color][color=#0000bb]executeQuery[/color][color=#007700]([/color][color=#dd0000]"SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT"[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]rslt[/color][color=#007700].[/color][color=#0000bb]next[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]photo [/color][color=#007700]= (([/color][color=#0000bb]OracleResultSet[/color][color=#007700])[/color][color=#0000bb]rslt[/color][color=#007700]).[/color][color=#0000bb]getBLOB[/color][color=#007700]([/color][color=#dd0000]"image"[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]rslt[/color][color=#007700].[/color][color=#0000bb]close[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]rslt [/color][color=#007700]= [/color][color=#0000bb]null[/color][COLOR=#007700];
  
[/COLOR][color=#0000bb]بعد ذلك قمنا بالاتصال بقاعدة البيانات [/color][color=#007700]([/color][color=#0000bb]تستطيع قراءة الدرس السابق عن الاتصال بقاعدة البيانات بموقع الموسوعة العربية للكمبيوتر و الانترنت أو الفريق العربي للتكنولوجيا[/color][color=#007700]). [/color][color=#0000bb]و من ثم قمنا بإضافة BLOB فارغ [/color][color=#007700]([/color][color=#0000bb]يجب أولاً إضافة empty_blob[/color][color=#007700]() [/color][color=#0000bb]لقاعدة البيانات و استرجاعها من قاعدة البيانات، و بعد ذلك نقوم بإرسال البيانات إلى قاعدة البيانات[/color][COLOR=#007700]).
  
[/COLOR][COLOR=#ff8000]// Now that we have the locator, lets store the photo
[/COLOR][color=#0000bb]File binaryFile [/color][color=#007700]= new [/color][color=#0000bb]File[/color][color=#007700]([/color][color=#dd0000]"jfc.gif"[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]fin [/color][color=#007700]= new [/color][color=#0000bb]FileInputStream[/color][color=#007700]([/color][color=#0000bb]binaryFile[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]out [/color][color=#007700]= [/color][color=#0000bb]photo[/color][color=#007700].[/color][color=#0000bb]getBinaryOutputStream[/color][COLOR=#007700]();
[/COLOR][COLOR=#ff8000]// Get the optimal buffer size from the BLOB
[/COLOR][color=#0000bb]byte[/color][color=#007700][] [/color][color=#0000bb]buffer [/color][color=#007700]= new [/color][color=#0000bb]byte[/color][color=#007700][[/color][color=#0000bb]photo[/color][color=#007700].[/color][color=#0000bb]getBufferSize[/color][COLOR=#007700]()];
[/COLOR][color=#0000bb]int length [/color][color=#007700]= [/color][color=#0000bb]0[/color][COLOR=#007700];
while (([/COLOR][color=#0000bb]length [/color][color=#007700]= [/color][color=#0000bb]fin[/color][color=#007700].[/color][color=#0000bb]read[/color][color=#007700]([/color][color=#0000bb]buffer[/color][color=#007700])) != -[/color][color=#0000bb]1[/color][COLOR=#007700]) {
    [/COLOR][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]write[/color][color=#007700]([/color][color=#0000bb]buffer[/color][color=#007700], [/color][color=#0000bb]0[/color][color=#007700], [/color][color=#0000bb]length[/color][COLOR=#007700]);
}
[/COLOR][COLOR=#ff8000]// you need to close the output stream before
// you commit, or the changes are lost!
[/COLOR][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]close[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]out [/color][color=#007700]= [/color][color=#0000bb]null[/color][COLOR=#007700];
[/COLOR][color=#0000bb]fin[/color][color=#007700].[/color][color=#0000bb]close[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]fin [/color][color=#007700]= [/color][color=#0000bb]null[/color][COLOR=#007700];
[/COLOR][color=#0000bb]con[/color][color=#007700].[/color][color=#0000bb]commit[/color][COLOR=#007700]();  
[/COLOR][color=#0000bb][/color][/COLOR]

بالجزء السابق من الشفرة البرمجية نحدد اسم الملف (على سبيل المثال: jfc.gif)، و من ثم نقوم بتخزينه بقاعدة البيانات. و بعد ذلك قفل الملف و تنفيذ المطلوب بقاعدة البيانات لكي لا نخسر ما قمنا به.



استرجاع البيانات من قاعدة البيانات و حفظها على هيئة ملفات:
الآن سوف نقوم باسترجاع البيانات (على سبيل المثال: الصورة السابقة) على الجهاز من قاعدة البيانات.



كود :
import java.io.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.*;

public class ReadBlob {
private Connection con = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private BLOB blob = null;

private String selectSQL = "SELECT image FROM demo WHERE id = ?";
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2";
private String user = "scott";
private String password = "tiger";

public ReadBlob() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
try {
con = DriverManager.getConnection(url, user, password);
pstmt = con.prepareStatement(selectSQL);
pstmt.setInt(1, 1); //for set the ID (line 13)
rs = pstmt.executeQuery();
while(rs.next()) {
blob = ((OracleResultSet)rs).getBLOB("image");
}
InputStream blobStream = blob.getBinaryStream();
FileOutputStream fileOutStream = new FileOutputStream("abc.gif");
byte[] buffer = new byte[10];
int nbytes = 0;
while ((nbytes = blobStream.read(buffer))!= -1) {
fileOutStream.write(buffer,0,nbytes);
}
fileOutStream.flush();
fileOutStream.close();
blobStream.close();
rs.close();
pstmt.close();
con.close();
}
catch(IOException ex) {
ex.printStackTrace();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
new ReadBlob();

}
}
سوف نقوم بشرح جزأين من الشفرة البرمجية

كود :
[color=#000000][COLOR=#0000bb]con [/color][color=#007700]= [/color][color=#0000bb]DriverManager[/color][color=#007700].[/color][color=#0000bb]getConnection[/color][color=#007700]([/color][color=#0000bb]url[/color][color=#007700], [/color][color=#0000bb]user[/color][color=#007700], [/color][color=#0000bb]password[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]pstmt [/color][color=#007700]= [/color][color=#0000bb]con[/color][color=#007700].[/color][color=#0000bb]prepareStatement[/color][color=#007700]([/color][color=#0000bb]selectSQL[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]pstmt[/color][color=#007700].[/color][color=#0000bb]setInt[/color][color=#007700]([/color][color=#0000bb]1[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]); [/color][COLOR=#ff8000]//for set the ID (line 13)
[/COLOR][color=#0000bb]rs [/color][color=#007700]= [/color][color=#0000bb]pstmt[/color][color=#007700].[/color][color=#0000bb]executeQuery[/color][COLOR=#007700]();
while([/COLOR][color=#0000bb]rs[/color][color=#007700].[/color][color=#0000bb]next[/color][COLOR=#007700]()) {
     [/COLOR][color=#0000bb]blob [/color][color=#007700]= (([/color][color=#0000bb]OracleResultSet[/color][color=#007700])[/color][color=#0000bb]rs[/color][color=#007700]).[/color][color=#0000bb]getBLOB[/color][color=#007700]([/color][color=#dd0000]"image"[/color][COLOR=#007700]);
}
  
[/COLOR][color=#0000bb]نقوم باسترجاع الصورة التي تحمل الرقم المخصص [/color][color=#007700]([/color][color=#0000bb]على سبيل المثال الرقم[/color][color=#007700]: [/color][color=#0000bb]1[/color][COLOR=#007700]).
  
[/COLOR][color=#0000bb]InputStream blobStream [/color][color=#007700]= [/color][color=#0000bb]blob[/color][color=#007700].[/color][color=#0000bb]getBinaryStream[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]FileOutputStream fileOutStream [/color][color=#007700]= new [/color][color=#0000bb]FileOutputStream[/color][color=#007700]([/color][color=#dd0000]"abc.gif"[/color][COLOR=#007700]);
[/COLOR][color=#0000bb]byte[/color][color=#007700][] [/color][color=#0000bb]buffer [/color][color=#007700]= new [/color][color=#0000bb]byte[/color][color=#007700][[/color][color=#0000bb]10[/color][COLOR=#007700]];
[/COLOR][color=#0000bb]int nbytes [/color][color=#007700]= [/color][color=#0000bb]0[/color][COLOR=#007700];
while (([/COLOR][color=#0000bb]nbytes [/color][color=#007700]= [/color][color=#0000bb]blobStream[/color][color=#007700].[/color][color=#0000bb]read[/color][color=#007700]([/color][color=#0000bb]buffer[/color][color=#007700]))!= -[/color][color=#0000bb]1[/color][COLOR=#007700]) {
     [/COLOR][color=#0000bb]fileOutStream[/color][color=#007700].[/color][color=#0000bb]write[/color][color=#007700]([/color][color=#0000bb]buffer[/color][color=#007700],[/color][color=#0000bb]0[/color][color=#007700],[/color][color=#0000bb]nbytes[/color][COLOR=#007700]);
}
  
[/COLOR][color=#0000bb]باستخدام getBinaryStream[/color][color=#007700]() [/color][color=#0000bb]نقوم باسترجاع البيانات كاملة و حفظها على هيئة ملف gif[/color][COLOR=#007700].  
[/COLOR][color=#0000bb][/color][/COLOR]

حذف البيانات من قاعدة البيانات:
لحذف البيانات بشكل صحيح يجب على المبرمج إسناد القيمة التالية:
إذا قمنا بإسناد NULL لعمود الصور عند الحذف، فسوف نحصل على NullPointerException عند تخزين البيانات لنفس العمود مرة أخرى أو نقوم بإضافة empty_blob() و بعد ذلك تخزين البيانات.



إظهار البيانات و استخدامها ببرامج الجافا:
و أخيراً سوف نقوم بعرض البيانات بالبرامج (على سبيل المثال: عرض الصورة السابقة من قاعدة البيانات).

كود :
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.*;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Main extends JFrame {
private Connection con = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private BLOB blob = null;

private String selectSQL = "SELECT image FROM demo WHERE id = ?";
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2";
private String user = "scott";
private String password = "tiger";

private JPanel panel = new JPanel();
private ImageIcon icon;
private JLabel imageLabel;

public Main() {
super("Main");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
try {
con = DriverManager.getConnection(url, user, password);
pstmt = con.prepareStatement(selectSQL);
pstmt.setInt(1, 1); //for set the ID (line 14)
rs = pstmt.executeQuery();
rs.next();

blob = ((OracleResultSet)rs).getBLOB("image");
icon = new ImageIcon(blob.getBytes(1, (int)blob.length()));

rs.close();
pstmt.close();
con.close();

imageLabel = new JLabel(icon);
}
catch(Exception ex) {
ex.printStackTrace();
}

Container cp = getContentPane();
panel.add(imageLabel);
cp.add("Center", panel);
pack();
setVisible(true);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new Main();
}
}
ارجو ان يكون الشرح واضح
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  المصفوفات و انواعها في الجافا ..(5) RaggiTech 0 1,690 19-10-12, 01:12 PM
آخر رد: RaggiTech
  الدوال و الاجراءات و الفرق بينهما في الجافا ..(4) RaggiTech 0 1,641 19-10-12, 01:06 PM
آخر رد: RaggiTech
  الحلقات التكرارية في الجافا ... (3) RaggiTech 0 1,510 19-10-12, 12:59 PM
آخر رد: RaggiTech
  بني التحكم و حالاتها في الجافا + امثلة عملية .. (2) RaggiTech 1 789 19-10-12, 12:55 PM
آخر رد: RaggiTech
  المتغيرات - المعاملات في الجافا + امثلة .. (1) RaggiTech 0 1,364 19-10-12, 12:51 PM
آخر رد: RaggiTech
  الدرس السادس عشر - الطرق Methods RaggiTech 0 639 19-10-12, 12:42 PM
آخر رد: RaggiTech
  الدرس الخامس عشر - أوامر التحكّم - التكرار RaggiTech 0 643 19-10-12, 12:40 PM
آخر رد: RaggiTech
  الدرس الرابع عشر - أوامر التحكّم - الجمل الشرطية RaggiTech 0 759 19-10-12, 12:38 PM
آخر رد: RaggiTech
  الدرس الثالث عشر - العمليات RaggiTech 0 501 19-10-12, 12:36 PM
آخر رد: RaggiTech
  الدرس الحادي عشر - إستدعاء حزمة الواجهة الرسومية والعمل عليها RaggiTech 0 803 19-10-12, 12:33 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم