16/06/2010, 09:04
|
المشاركة رقم: 1
|
| المعلومات |
| الكاتب: |
|
| اللقب: |
عضــــو جديــــد |
| الصورة الرمزية |
|
|
| البيانات |
| التسجيل : |
May 2010 |
| العضوية : |
146 |
| الاهتمامات : |
الجزائر |
| الإقامة : |
المطالعة |
| المواضيع : |
33 |
| الردود : |
67 |
| المجموع : |
100 |
| بمعدل : |
0.02 يوميا |
| الاختراقات : |
[] |
| مجتمعنا : |
[] |
| الصنف : |
Not Hacker |
| آخر تواجد : |
20/02/2011/16:08 |
| سبب الغياب : |
|
| معدل التقييم: |
17 |
| نقاط التقييم: |
10 |
شكراً: 0
تم شكره 11 مرة في 11 مشاركة
| الإتصالات |
| الحالة: |
|
| وسائل الإتصال: |
|
|
3.تخزين البيانات الضخمة بقاعدة البيانات اوراكل بواسطة الجافا
هل لديك مشروع و تريد تخزين و استرجاع البيانات من صور و مقاطع صوتية و مرئية بقاعدة بيانات ..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.
سوف نقوم باستعراض أربع أمور:
- <LI class=MsoNormal dir=rtl style="TEXT-JUSTIFY: kashida; MARGIN: 0in 0in 0pt; TEXT-ALIGN: justify; TEXT-KASHIDA: 0%; mso-list: l0 level1 lfo1; tab-stops: list .5in">تخزين البيانات بقاعدة البيانات. <LI class=MsoNormal dir=rtl style="TEXT-JUSTIFY: kashida; MARGIN: 0in 0in 0pt; TEXT-ALIGN: justify; TEXT-KASHIDA: 0%; mso-list: l0 level1 lfo1; tab-stops: list .5in">استرجاع البيانات من قاعدة البيانات و حفظها على هيئة ملفات. <LI class=MsoNormal dir=rtl style="TEXT-JUSTIFY: kashida; MARGIN: 0in 0in 0pt; TEXT-ALIGN: justify; TEXT-KASHIDA: 0%; mso-list: l0 level1 lfo1; tab-stops: list .5in">
- حذف البيانات من قاعدة البيانات.
- إظهار البيانات و استخدامها ببرامج الجافا.
تخزين البيانات بقاعدة البيانات:
الآن سوف نقوم بكتابة شفرة برمجية بلغة الجافا لتخزين الصور بقاعدة بياناتOracle.
الشفرة البرمجية:
كود:
import java.io.*;
import java.sql.*;
import oracle.sql.BLOB;
import oracle.jdbc.driver.*;
publicclass 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();
}
}
publicstaticvoid main(String[] args) throws Exception, IOException {
new WriteBlob().process();
}
publicvoid 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 (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 =newbyte[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) {}
}
}
}
protectedvoid 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 =newbyte[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.*;
publicclass 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 =newbyte[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();
}
}
publicstaticvoid 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 =newbyte[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.*;
publicclass 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() {
publicvoid windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
publicstaticvoid main(String args[]) {
new Main();
}
}
و هنا صورة للبرنامج السابق:

لتحميل الشفرات البرمجية : مخالف
التعديل الأخير تم بواسطة yasMouh ; 16/06/2010 الساعة 16:23
سبب آخر: الرابط مخالف
|
|
|