الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:

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



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



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

demo.png

بالمرفقات:
1- الأكواد + صورة للتطبيق
2- الدرس على هيئه ملف PDF

BLOB.zip

بتاريخ:

السلام عليكم

شكرا لك يا أخ صلاح على هذه المشاركة، وبارك الله فيك.

بتاريخ:

شكرا جزيلا لك على هذه المعلومات المفيدة...

بتاريخ:

شكرا اخي

وجزاك الله خير
.....

بتاريخ:
  • كاتب الموضوع

العفو،،

بالنسبه للمرفقات.. ما قدرت اني ارفع الملف بشكل صحيح.. كل مره يعطيني خطأ :(

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.