Blob (วัตถุขนาดใหญ่ไบนารี) วัตถุไบนารีขนาดใหญ่เป็นภาชนะที่สามารถเก็บไฟล์ไบนารีได้ ในคอมพิวเตอร์ blobs มักจะเป็นประเภทของฟิลด์ที่ใช้ในฐานข้อมูลเพื่อจัดเก็บไฟล์ไบนารี Blobs เป็นไฟล์ขนาดใหญ่ blobs ทั่วไปคือรูปภาพหรือไฟล์เสียง เนื่องจากขนาดของพวกเขาพวกเขาจะต้องประมวลผลในวิธีพิเศษ (ตัวอย่างเช่น: การอัปโหลดดาวน์โหลดหรือจัดเก็บไว้ในฐานข้อมูล)
1. แนวคิดพื้นฐาน
ในการพัฒนาจริงบางครั้งจำเป็นต้องใช้โปรแกรมเพื่อบันทึกข้อความขนาดใหญ่หรือข้อมูลไบนารีลงในฐานข้อมูลสำหรับการจัดเก็บโดยตรง
สำหรับ MySQL มีเพียง blobs แต่ไม่มี clobs MySQL ใช้ข้อความเพื่อจัดเก็บข้อความขนาดใหญ่และข้อความและ blobs แบ่งออกเป็น:
tinyText, text, mediacttext และ longtext
Tinyblob, Blob, Mediumblob และ Longblob
2. สร้างสภาพแวดล้อมการทดสอบ
2.1. โครงสร้างโครงการทดสอบสร้างขึ้น
ดังที่แสดงในภาพ:
2.2. เขียนไฟล์กำหนดค่า db.properties
driver = com.mysql.jdbc.driverurl = jdbc: mysql: // localhost: 3306/jdbcstudyusername = rootpassword = xdp
2.3. เขียนคลาสเครื่องมือ JDBCUTILS
แพ็คเกจ me.gacl.utils; นำเข้า java.io.inputstream; นำเข้า java.sql.connection; นำเข้า java.sql.driverManager; นำเข้า java.sql.resultset; นำเข้า java.sql.sqlException; import java.sql.Statement; ไดรเวอร์สตริงคงที่ = null; url สตริงคงที่ส่วนตัว = null; ชื่อผู้ใช้สตริงคงที่ส่วนตัว = null; รหัสผ่านสตริงคงที่ส่วนตัว = null; Static {ลอง {// อ่านข้อมูลการเชื่อมต่อฐานข้อมูลในไฟล์ db.properties inputstream ใน = jdbcutils.class.getClassLoader (). getResourceasstream ("db.properties"); คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.load (in); // รับไดรเวอร์การเชื่อมต่อฐานข้อมูล = prop.getProperty ("ไดรเวอร์"); // รับที่อยู่ URL การเชื่อมต่อฐานข้อมูล url = prop.getProperty ("url"); // รับการเชื่อมต่อฐานข้อมูลชื่อผู้ใช้ชื่อผู้ใช้ = prop.getProperty ("ชื่อผู้ใช้"); // รับรหัสผ่านการเชื่อมต่อฐานข้อมูลรหัสผ่าน = prop.getProperty ("รหัสผ่าน"); // โหลดคลาสไดรเวอร์ฐานข้อมูล forName (ไดรเวอร์); } catch (exception e) {โยนข้อยกเว้นใหม่ IniNitializerError (E); }} / *** @method: getConnection* @description: รับวัตถุการเชื่อมต่อฐานข้อมูล* @anthor: Lofty Wolf** @return การเชื่อมต่อฐานข้อมูลการเชื่อมต่อวัตถุ* @throws sqlexception* / การเชื่อมต่อแบบคงที่สาธารณะ } / ** * @method: release * @description: RELEASE Resources, * ทรัพยากรที่จะเผยแพร่รวมถึงวัตถุฐานข้อมูลการเชื่อมต่อการเชื่อมต่อวัตถุคำสั่งที่รับผิดชอบในการดำเนินการคำสั่ง SQL และวัตถุผลลัพธ์ที่เก็บข้อมูลการสืบค้น * @anthor: 光克 * * @param conn * @param st * @param rs if (rs! = null) {ลอง {// ปิดวัตถุ ResultSet ที่เก็บผลลัพธ์การสืบค้น rs.close (); } catch (exception e) {e.printstacktrace (); } rs = null; } if (st! = null) {ลอง {// ปิดวัตถุคำสั่งที่รับผิดชอบในการดำเนินการคำสั่ง sql s.close (); } catch (exception e) {e.printstacktrace (); }} if (conn! = null) {ลอง {// ปิดวัตถุการเชื่อมต่อฐานข้อมูลการเชื่อมต่อวัตถุ conn.close (); } catch (exception e) {e.printstacktrace (); - 3. ใช้ JDBC เพื่อประมวลผลข้อความขนาดใหญ่ใน MySQL
สำหรับประเภทข้อความใน MySQL สามารถเรียกใช้วิธีการต่อไปนี้เพื่อตั้งค่าได้
precedStatement.SetcharactersTream (ดัชนี, เครื่องอ่าน, ความยาว); // โปรดทราบว่าต้องตั้งค่าความยาวและตั้งค่าเป็นประเภท int
สำหรับประเภทข้อความใน MySQL คุณสามารถโทรหาวิธีการต่อไปนี้เพื่อรับ
reader = resultset.getCharactersTream (สตริง columnLabel); 2 สตริง s = resultset.getString (สตริง columnLabel);
3.1. ตัวอย่างทดสอบ
1. เขียนสคริปต์ทดสอบ SQL
สร้างฐานข้อมูล jdbcstudy; ใช้ jdbcstudy; สร้าง Table TestClob (ID int หลัก Auto_Increment, Resume Text);
2. เขียนรหัสทดสอบดังนี้:
แพ็คเกจ me.gacl.demo; นำเข้า java.io.file; นำเข้า java.io.filereader; นำเข้า java.io.filewriter; นำเข้า java.io.reader; นำเข้า java.sql.connection; นำเข้า java.sql.prepreadedstatement; me.gacl.utils.jdbcutils; นำเข้า org.junit.test;/*** @classname: jdbcoperaclob* @description: ใช้ jdbc เพื่อใช้งานข้อความขนาดใหญ่ของ mysql* @author: Lonely Canglang* @date: 2014-9-19 10:10 @Method: เพิ่ม * @description: แทรกข้อมูลข้อความขนาดใหญ่ลงในฐานข้อมูล * @anthor: 发年 * */ @test โมฆะสาธารณะเพิ่ม () {Connection Conn = null; PreparedStatement ST = NULL; ผลลัพธ์ RS = NULL; Reader Reader = null; ลอง {conn = jdbcutils.getConnection (); String SQL = "แทรกลงใน testClob (ประวัติย่อ) ค่า (?)"; st = conn.prepareStatement (SQL); // เส้นทางที่ได้รับในวิธีนี้ช่องว่างที่พื้นที่จะถูกแทนที่ด้วย "%20" โดยใช้ "String Path = JDBCoperAclob.class.getClassLoader (). getResource (" data.txt Filereader (ไฟล์); jdbcutils.release (conn, st, rs); "SELECT RESUME จาก TESTCLOB โดยที่ ID = 2"; // ใช้ resultset.getCharactersTream ("ชื่อฟิลด์") เพื่อรับเนื้อหาของเครื่องอ่านข้อมูลข้อความขนาดใหญ่ = Rs.getCharactersream ("ประวัติย่อ"); ถ่านบัฟเฟอร์ [] = ถ่านใหม่ [1024]; int len = 0; fileWriter out = new FileWriter ("D: //1.txt"); ในขณะที่ ((len = reader.read (บัฟเฟอร์))> 0) {contentstr += สตริงใหม่ (บัฟเฟอร์); out.write (บัฟเฟอร์, 0, len); } out.close (); reader.close (); } system.out.println (เนื้อหา); System.out.println ("-------------------------------------------"); System.out.println (ContentSTR); } catch (exception e) {e.printstacktrace (); } ในที่สุด {jdbcutils.release (Conn, ST, RS); -4. ใช้ JDBC เพื่อประมวลผลข้อมูลไบนารี MySQL
สำหรับประเภท Blob ใน MySQL การตั้งค่าวิธีการต่อไปนี้สามารถเรียกได้:
PreparedStatement SetBinaryStream (I, InputStream, ความยาว);
สำหรับประเภท Blob ใน MySQL คุณสามารถโทรหาวิธีการต่อไปนี้เพื่อรับ:
inputStream ใน = resultSet.getBinaryStream (สตริง columnLabel); inputStream ใน = resultSet.getBlob (สตริงคอลัมน์ label) .getBinaryStream ();
4.1. ตัวอย่างทดสอบ
1. เขียนสคริปต์ทดสอบ SQL
สร้าง Table TestBlob (ID int หลัก Auto_Increment, Image Longblob);
2. เขียนรหัสทดสอบดังนี้:
แพ็คเกจ me.gacl.demo; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.fileoutputStream นำเข้า java.io.inputstream; นำเข้า Java.sql.connection; me.gacl.utils.jdbcutils; นำเข้า org.junit.test;/ *** @classname: jdbcoperaclob* @description: ใช้ jdbc เพื่อจัดการข้อมูลไบนารีของ Mysql: ภาพ, เสียง, ข้อความไบนารี)* @author: Luke Canglang* @date jdbCoperablob { / *** @method: เพิ่ม* @description: แทรกข้อมูลไบนารีลงในฐานข้อมูล* @anthor: Luke Canglang** / @test โมฆะสาธารณะเพิ่ม () {Connection Conn = null; PreparedStatement ST = NULL; ผลลัพธ์ RS = NULL; ลอง {conn = jdbcutils.getConnection (); String SQL = "แทรกลงในค่า testBlob (image) (?)"; st = conn.prepareStatement (SQL); // เส้นทางที่ได้รับด้วยวิธีนี้ช่องว่างในนั้นจะถูกแทนที่ด้วย "%20" แทน String Path = JDBCoperablob.class.getClassLoader () GetResource ("01.jpg"). getPath (); // แทนที่ "%20" จะถูกแทนที่ด้วย spaces path = path.replaceall ("%20", ""); ไฟล์ไฟล์ = ไฟล์ใหม่ (พา ธ ); FileInputStream FIS = ใหม่ FileInputStream (ไฟล์); // สตรีมที่สร้างขึ้น St.SetBinaryStream (1, FIS, (int) file.length ()); int num = stexecuteUpdate (); if (num> 0) {system.out.println ("แทรกสำเร็จ!"); } fis.close (); } catch (exception e) {e.printstacktrace (); } ในที่สุด {jdbcutils.release (Conn, ST, RS); }} / *** @method: อ่าน* @description: อ่านข้อมูลไบนารีในฐานข้อมูล* @anthor: 六后** / @Test โมฆะสาธารณะอ่าน () {Connection Conn = NULL; PreparedStatement ST = NULL; ผลลัพธ์ RS = NULL; ลอง {conn = jdbcutils.getConnection (); String sql = "เลือกภาพจาก testblob โดยที่ id =?"; st = conn.prepareStatement (SQL); St.setint (1, 1); RS = St.ExecuteQuery (); if (rs.next ()) {// inputstream ใน = rs.getBlob ("image"). getBinaryStream (); // วิธีนี้สามารถเป็น inputStream ใน = rs.getBinaryStream ("image"); int len = 0; บัฟเฟอร์ไบต์ [] = ไบต์ใหม่ [1024]; fileOutputStream out = new fileOutputStream ("D: //1.jpg"); ในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {out.write (บัฟเฟอร์, 0, len); } in.close (); out.close (); }} catch (exception e) {e.printstacktrace (); } ในที่สุด {jdbcutils.release (Conn, ST, RS); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น