تخزين البيانات الضخمة بقاعدة البيانات اوراكل بواسطة الجافا

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

 

 

هل لديك مشروع و تريد تخزين و استرجاع البيانات من صور و مقاطع صوتية و مرئية بقاعدة بيانات 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( );

     }

}

 

و الآن سوف نقوم بشرح مبسط للشفرة البرمجية السابقة:

 

private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2";

private String user = "scott";

private String password = "tiger";

 

هنا سوف نقوم بتحديد نوع الـ Driver و بالمثال السابق استخدمنا thin driver و قمنا بتحديد مكان قاعدة البيانات و هي موجودة بالجهاز المحلي و تحديد المنفذ و هو 1521 و حددنا اسم الـ SID لقاعدة البيانات و هي ORCL2 (يجب تغيير المتغيرات عند الحاجة لذلك). و قمنا أيضاً بتحديد اسم المستخدم و كلمة المرور له.

 

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;

 

بعد ذلك قمنا بالاتصال بقاعدة البيانات (تستطيع قراءة الدرس السابق عن الاتصال بقاعدة البيانات بموقع الموسوعة العربية للكمبيوتر و الانترنت أو الفريق العربي للتكنولوجيا). و من ثم قمنا بإضافة BLOB فارغ (يجب أولاً إضافة empty_blob() لقاعدة البيانات و استرجاعها من قاعدة البيانات، و بعد ذلك نقوم بإرسال البيانات إلى قاعدة البيانات).

 

// 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();

 

 

بالجزء السابق من الشفرة البرمجية نحدد اسم الملف (على سبيل المثال: 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();

     }

}

 

 

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

 

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");

}

 

نقوم باسترجاع الصورة التي تحمل الرقم المخصص (على سبيل المثال الرقم: 1).

 

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);

}

 

باستخدام getBinaryStream() نقوم باسترجاع البيانات كاملة و حفظها على هيئة ملف gif.

 

 

 

حذف البيانات من قاعدة البيانات:

لحذف البيانات بشكل صحيح يجب على المبرمج إسناد القيمة التالية:

 

UPDATE demo SET image = empty_blob() WHERE id = ?

 

 إذا قمنا بإسناد 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();

     }

}

 

و هنا صورة للبرنامج السابق:

 

 

لتحميل الشفرات البرمجية: اضغط هنا و لتحميل الدرس على هيئة PDF: اضغط هنا

 

 

 


Copyright © www.kettaneh.net