الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Blob And Clob And Insert To Mysql

بدأه Tigger_it في 4 أغسطس 2009 · 13 رد · 1,343 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه

في مصطلحين في JDBC الي هما BLOB and CLOB ممكن حد يقولنا شو هما وشو الفرق بينهم

وكييفيه عملية Insert للنوعين في قاعده بيانات MySQL

وشكرا

:)

ab66i830gh93.gif

i25sctz8qnls.jpg

#2

تعريف Sun

Clob

اقتباس
An SQL CLOB is a built-in type that stores a Character Large Object as a column value in a row of a database table.

Blob

اقتباس
An SQL BLOB is a built-in type that stores a Binary Large Object as a column value in a row of a database table.

يعني blob لbinary date وclob للtext data

وتوجد الميثود setClob و setBlob في PreparedStatement، الأولى ممكن تمرر له object يرث من Reader وللثانية object يرث من InputStream

#3

بالزبط هاي النقطه الي كنت بدي اصل الها انو ال blob بيستخدم في binary date عشان هيك انا شفت في بعض الكتب انو blob بستخدم في حاله اردت حفظ صور في الداتا بيس بيسخدمو ال blob عشان يحولو الصورة الي binary data ويتم حفظ الصورة ولكن لست متاكد من النقطه هاي

عشان هيك كنت بدي اسئل هل صحيح هاي الجمله واذا صحيح كيف يتم تحويل الي binary ومن ثم حفظها في الداتا بيس ..

ab66i830gh93.gif

i25sctz8qnls.jpg

#4

كما قلت لك، إستعمل setBlob الخاصة بPreparedStatement وأيضا getBlob الخاصة بResutlSet

وهنا مثال لتخزين صورة في قاعدة البيانات ومثال آخر يقرأ الصورة من قاعدة البيانات ويخزنها في القرص الصلب

الجدول الذي استعملته "images" يحتوي على عمودين، الأول فيه مسار الصورة والثاني فيه الصورة نفسها

أظن أن المثال واضح لا يحتاج للشرح، لكن إذا كان هناك تساؤل فاطرحه


import java.io.*;

public class StoreBlob {
public static void main(String[] args) throws Exception {
Connection con = null;
PreparedStatement st = null;
File image = new File("image.png");
try {
con = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
st = con.prepareStatement("insert into images values (?, ?)");
st.setString(1, image.getPath());
st.setBlob(2, new FileInputStream(image));
st.executeUpdate();
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}
}
 import java.sql.*;


import java.io.*;

public class RetrieveBlob {
public static void main(String[] args) throws Exception {
Connection con = null;
PreparedStatement st = null;
try {
con = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
st = con.prepareStatement("select * from images");
ResultSet rs = st.executeQuery();
rs.next();
String imagePath = rs.getString(1);
Blob bl = rs.getBlob(2);
byte[] data = bl.getBytes(1L, (int)bl.length());
FileOutputStream out = new FileOutputStream("newImage.png");
out.write(data);
out.close();
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}
}
 import java.sql.*;

#5

تمام المثال الاول فهمتو وزبط وكل شي المثال الثاني في سطرين ما فهمتو ممكن توضيح اكثير :

Blob bl = rs.getBlob(2);
			 byte[] data = bl.getBytes(1L, (int)bl.length());
			 FileOutputStream out = new FileOutputStream("newImage.png");
			 out.write(data);
ab66i830gh93.gif

i25sctz8qnls.jpg

#6
Blob bl = rs.getBlob(2);

كما تعلم، ResultSet لديها ميثود خاص بكل نوع، getInt, getString, ....، وهنا استعملنا getBlob، والرقم 2 يعني العمود الثاني

Blob هي interface موجودة في الpackage java.sql وهي تمثل معطى من نوع BLOB، والميثود getBlob ترجع object يكون يعمل implementation لهذه الinterface، وكل jdbc driver يجب أن يوفر هذه الimplentation

byte[] data = bl.getBytes(1L, (int)bl.length());

نسترجع الصورة على شكل مصفوفة من صنف byte عن طريق الميثود getBytes، الargument الأول هو نقطة البداية، أي أننا سنبدأ من البايت الأول، L لجعل القيمة من صنف long، لأن الميثود تنتظر قيمة long

الargument الثاني هو نقطة النهاية، وهي تساوي طول الصورة


out.write(data);
FileOutputStream out = new FileOutputStream("newImage.png");

الآن لدي الصورة على شكل مصفوفة byte، وأريد كتابتها في القرص الصلب، فأستعمل FileOutputStream والميثود write التي تقبل مصفوفة byte وتكتبها في الملف الذي أعطينا إسمه في الconstructor

أنا لا أشرح جيدا، لذلك لم أرفق الكود بالشرح، لأن شرحي كارثي كما العادة :D

#7

لا بالعكس طريقة شرحك رائعه وسهله كثير ومفهومه كثير الحمد لله هلا فهمت المثال كويس وراح اطبقو واذا لقيت مشاكل ثانيه راح اقولك

:)

ab66i830gh93.gif

i25sctz8qnls.jpg

#8

بما أنك فهمت هات الفلوس :cash: ، أنا لا أشرح بالمجان :evil:

#9

:lol: طيب انا لسه ضيف جديد عليكم في القسم ما في مراعاه الي :P

ab66i830gh93.gif

i25sctz8qnls.jpg

#10

بما أنك جديد سأعملك تخفيض B)

#11

يعنى ما في مجال لازم ادفع :D طيب قديش التخفيض

ab66i830gh93.gif

i25sctz8qnls.jpg

#12

سأكون كريما هذه المرة ولن أطالبك بأي شيء :wink:

#13

الله يزيد كرمك دايما ودايما ان شالله وان شاء الله بكون مجتهد معكم في القسم :)

تم تعديل هذه المشاركة بواسطة Tigger_it في 5 أغسطس 2009 في 11:36

ab66i830gh93.gif

i25sctz8qnls.jpg

#14

استاذي herch

شكرا لك على الاجابة المفصلة الرائعة وبارك الله في علمك .

مواضيع مشابهة