1. 程式人生 > 實用技巧 >大物件資料LOB

大物件資料LOB

【 大物件資料LOB的應用】

自足學習後問自己這四個問題(檢驗自己學習效果){

1.what:無結構的大型資料 LOB Large Object

2.why:使用者可以用來儲存大型無結構資料

3.how:JDBC 特殊資料型別 LOB 程式碼能寫出來 講清楚-->思路沒問題(虛擬碼)--->肯定可以寫出來(工具,搜尋)

4.when/where 使用者可以用來儲存大型無結構資料

}

6.1 LOB資料型別概述(注意:存路徑)

由於無結構的資料往往都是大型的,儲存量非常大,而LOB(large object)型別主要用來支援無結構的大型資料.使用者可以用LOB資料型別來儲存大型的無結構資料,特別是文字,圖形,視訊和音訊等多媒體資料,系統還提供了隨機訪問這些LOB型別資料的有效辦法.

LOB資料型別可以分為以下幾種:Oracle sun mysql jdk

  1. BLOB:二進位制LOB型別,使用者存放無結構的二進位制資料,最大4GB. binary 二進位制

  2. CLOB:字元LOB型別,用於存放字元資料,最大可以儲存4GB. char character lob

  3. NLOB:字元LOB型別,和CLOB相同,支援國家字符集.多字符集 GBK

  4. BFILE:二進位制檔案型別,與資料庫外的作業系統檔案相關聯,該檔案儲存二進位制大物件.

對於BLOB和CLOB資料,表中儲存的是指向該LOB資料的定位器,對於BFILE(資料存放在資料庫的作業系統檔案上),表中儲存的是指向外部檔案的定位器.BLOB和CLOB資料型別屬於Oracle內部資料型別,儲存在資料庫的表空間中,在事務中可以使用DBMS_LOB包過程/PL/SQL程式或OCI程式修改,可以提交或回滾修改.而BFILE資料是隻讀的.

BFILE型別僅提供隨機讀取資料,事務不能保證該型別的完整性,資料的完整性和可用性要在作業系統下維護.

DBA要保證檔案的存在和訪問許可權.初始化引數SESSION_MAX_OPEN_FILES設定一個會話最多可同時開啟的檔案最大數.

使用LOB型別資料的限制:

系統不支援分散式LOB,使用者不能在SELECT子句或WHERE子句中使用遠端LOB定位器,也不能在DBMS_LOB包的子程式中使用遠端定位器,也不能引用包含LOB屬性的遠端表中的物件.

LOB列不能用於聚集表.

LOB列不能出現在查詢語句的GROUP BY,ORDER BY ,DISTINCT(去重複)之後,也不允許出現在分組函式和連線函式中.

LOB型別不能出現在陣列的定義中.

LOB型別不能夠出現在建有分割槽索引的表中.

NCLOB型別不能作為物件型別的屬性,當可以作為物件型別的方法的引數型別.

IOE

IBM DB2

Oracle

MySQL

不同的資料庫系統提供大物件資料型別有所不同,上面我們介紹了Oracle資料庫系統(DBA)用於儲存大物件資料的相關資料型別,那麼MySQL資料庫和SQLServer2012資料庫系統又使用哪些型別來儲存這些LOB型別資料呢?

MySQL資料庫系統又使用了哪些型別來儲存這些LOB型別資料呢?

MySQLAB 對應Oracle用於儲存LOB型別資料的資料型別: 十個億 MariaDB MySQL

BLOB和TEXT型別;

MySQL的BLOB與LONBBLOB型別對應於Oracle的BLOB資料型別,而MySQL資料庫的TEXT/LONGTEXT可以用於儲存與Oracle資料庫系統提供的CLOB型別資料.

SQLServer2012資料庫儲存LOB型別的資料型別有:TEXT,VARBINARY,和IMAGE型別等,其中TEXT型別對應於Oracle資料庫中的CLOB型別,而VARBINARY和IMAGE型別對應於Oracle中的BLOB型別.

下面我們將介紹MySQL資料庫對LOB型別資料的存取(讀寫)操作.

CREATE DATABASE lob;

USE lob;

CREATE TABLE TEXTCLOB(

CID INT NOT NULL PRIMARY KEY,

CNAME VARCHAR(20),

NOTES LONGTEXT

);

SELECT * FROM TEXTCLOB;

1. 阿里開發規範

2. java經典程式設計300例 涵蓋了S1和S2幾乎所有技術點

3.計算機英文單詞 參與

JDBC連線資料庫的主要步驟:

1. Class.forName("com.mysql.jdbc.Driver");//反射 類物件 四種

2.獲取連線 Connection conn=DriverManager.getConnection(URL,USER,PASSWORD);

3.編寫SQL語句併發送 PrepapredStatement pstm=conn.prepareStatement(sql);

4.獲得資料庫返回結果 (ResultSet rs) 增刪改(int)

5.關閉資源 public static void closeResource(Connection conn,PreparedStatement pstm,ResultSet rs)

接下來我們開始編寫JDBC程式程式碼,實現CLOB型別資料的讀寫操作,在完成此任務之前,先將JDBC連線資料庫以及關閉資料庫程式碼編寫一個MySQLConnectionUtil.java類中,該類的程式碼如下所示:

1.工具類 方法:封裝,設定為靜態方法,好處,呼叫方便.


package com.guigu.jdbc;

import java.sql.*;

public class MySQLConnectionUtil {
private static String DRIVER="com.mysql.jdbc.Driver";
private static String URL="jdbc:mysql://127.0.0.1:3306/lob";
private static String USERNAME="root";
private static String PASSWORD="123456";

public static Connection getConnection(){
Connection connection=null;
try {
Class.forName(DRIVER);
connection= DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}

public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){

try {
if(resultSet!=null){
resultSet.close();
}
if (preparedStatement!=null){
preparedStatement.close();
}
if (connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

}
}




package com.guigu.jdbc;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCMySQLCOLBWriter {
public static void main(String[] args) {
String sql="INSERT INTO TEXTCLOB VALUES (?,?,?)";
Connection connection=MySQLConnectionUtil.getConnection();
PreparedStatement preparedStatement=null;
try {
preparedStatement=connection.prepareStatement(sql);
File file =new File("D:/workspace/site.txt");
//使用輸入流讀寫文字檔案
InputStream inputStream=new FileInputStream(file);
//載入SQL語句中VALUES佔位符引數
preparedStatement.setInt(1,1);
preparedStatement.setString(2,"site.txt");
preparedStatement.setAsciiStream(3,inputStream);
int count = preparedStatement.executeUpdate();
if(count>0){
System.out.println("資料插入成功");
}else{
System.out.println("資料插入失敗");
}

} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
MySQLConnectionUtil.close(connection,preparedStatement,null);
}
}
}

上面的示例中,我們需要將文字檔案以檔案流的方式寫入MySQL資料庫指定的欄位是時,需要使用PreparedStatement物件呼叫其setAsciiStream()為儲存文字檔案載入資料.

下面編寫JDBC程式從MySQL資料庫指定的資料表中讀取大物件(CLOB)資料,實現程式碼如下: