JDBC:數據庫操作:處理大對象CLOB數據


目標:

了解大對象處理基本原理,

掌握CLOB數據的讀,寫操作。

可以使用CLOB類處理大文本數據。

大對象處理主要指CLOB和BLOB兩種類型字段。可以大量存儲文字。

要想在程序中處理這樣的大數據操作,則必須使用preparedStatement完成。所有文件內容通過IO流方式從大文本字段中保存和讀取。

 

寫入大數據對象;

使用PreparedStatement接口中的方法。

void setAsciiStream(int parameterIndex, InputStream x, int length) 將指定輸入流寫入數據庫文本字段 void setBinaryStream(int parameterIndex, InputStream x, int length) 將二進制輸入流數據寫入二進制字段中。

讀取大數據對象

使用ResultSet接口下方法讀取:

CLOB表示大文本數據,MySQL中提供了LONGTEXT表示大文本數據,此字段最大保存數據量4G。

例如,下面數據庫腳步:

create table userclob
(
    id int,
    name varchar(30),
    note longtext
)

將以上的文本寫入到數據表的字段中。

package 類集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
public class ClobDemo01{
    // 定義MySQL的數據庫驅動程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定義MySQL數據庫的連接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL數據庫的連接用戶名
    public static final String DBUSER = "root" ;
    // MySQL數據庫的連接密碼
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有異常拋出
        Connection conn = null ;        // 數據庫連接
        PreparedStatement pstmt = null ;//聲明數據庫預處理對象
        String name = "小華" ;    // 表示姓名
        String sql = "INSERT INTO userclob(name,note) VALUES (?,?) " ;
        Class.forName(DBDRIVER) ; // 加載驅動程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;//建立連接
        pstmt = conn.prepareStatement(sql) ; // 創建PreapredStatement對象
        File f = new File("d:" + File.separator + "mldn.txt") ;//創建文件對象實例
        InputStream input = null ; input = new FileInputStream(f) ; // 通過輸入流讀取文件
        pstmt.setString(1,name) ;//設置第一個字段的值pstmt.setAsciiStream(2,input,(int)f.length()) ;//將input實例指定的輸入流設置給第二個字段,
        pstmt.executeUpdate() ;//執行更新操作。
        conn.close() ;            // 數據庫關閉
    }
};

執行后查看結果:

下面使用IO流進行讀取操作:

package 類集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
import java.io.InputStream ;
import java.util.Scanner ;
public class ClobDemo01{
    // 定義MySQL的數據庫驅動程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定義MySQL數據庫的連接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL數據庫的連接用戶名
    public static final String DBUSER = "root" ;
    // MySQL數據庫的連接密碼
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有異常拋出
        Connection conn = null ;        // 數據庫連接
        PreparedStatement pstmt = null ;
        ResultSet rs = null ;
        int id = 3 ;        // 讀取的編號
        String sql = "SELECT name,note FROM userclob WHERE id=? " ;
        Class.forName(DBDRIVER) ;    // 加載驅動程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ; // 創建PreapredStatement對象
        pstmt.setInt(1,id) ;
        rs = pstmt.executeQuery() ;    //進行查詢操作
        if(rs.next()){        //如果查詢的結果有值的話,讀取第一條數據
            String name = rs.getString(1) ;//讀取這條數據的第一個字段值。
            StringBuffer note = new StringBuffer() ;
            System.out.println("姓名:" + name) ;
            InputStream input = rs.getAsciiStream(2) ;//通過ResultSet接口的方法讀取字節流,讀取這條數據第二個字段值,
            Scanner scan = new Scanner(input) ; // 使用Scanner類讀取內容
            scan.useDelimiter("\r\n") ;    // 將文件換行作為分割符
            while(scan.hasNext()){
                note.append(scan.next()).append("\n") ;
            }
            System.out.println("內容:" + note) ;
            input.close() ;
        }
        rs.close() ;
        pstmt.close() ;
        conn.close() ;            // 數據庫關閉
    }
};

輸出結果:

 

CLOB類

以上做法是將大文本數據對象直接通過ResultSet讀取進來的,當然也可使用ResultSet中提供的getClob()方法,將全部內容編成CLOB對象,

直接使用CLOB可以方便取得大文本的數據。也可對這些文本進行簡單操作,如截取指定字符串文本等。

ResultSet類獲取CLOB對象方法:

 Clob getClob(int columnIndex) 以 Java 編程語言中 Clob 對象的形式獲取此 ResultSet 對象的當前行中指定列的值。 

CLOB類有一個方法進行文本截取。

 String getSubString(long pos, int length) 獲取此 Clob 對象指定的 CLOB 值中指定子字符串的副本

CLOB類還有一個截斷文本方法:

 void truncate(long len) 截取此 Clob 指定的 CLOB 值,使其長度為 len 個字符。 

 

package 類集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.Clob ;
import java.sql.ResultSet ;
public class ClobDemo01{
    // 定義MySQL的數據庫驅動程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定義MySQL數據庫的連接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL數據庫的連接用戶名
    public static final String DBUSER = "root" ;
    // MySQL數據庫的連接密碼
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有異常拋出
        Connection conn = null ;        // 數據庫連接
        PreparedStatement pstmt = null ;
        ResultSet rs = null ;
        int id = 3 ;        // 讀取的編號
        
        String sql = "SELECT name,note FROM userclob WHERE id=? " ;
        Class.forName(DBDRIVER) ;    // 加載驅動程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;    // 創建PreapredStatement對象
        pstmt.setInt(1,id) ;//設置第一個參數的值為變量id的值
        rs = pstmt.executeQuery() ;
        if(rs.next()){
            String name = rs.getString(1) ;
            System.out.println("姓名:" + name) ;
            Clob c = rs.getClob(2) ;
            String note = c.getSubString(1,200) ;//截取前200個字符串
            System.out.println("內容:" + note ) ;
            c.truncate(100) ; // 只能讀100個內容
            System.out.println("部分讀取內容:" + c.getSubString(1,(int)c.length())) ;
        }
        rs.close() ;
        pstmt.close() ;
        conn.close() ;            // 數據庫關閉
    }
};

 

輸出結果:

Tue Apr 18 23:18:51 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
姓名:小華
內容:345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsaf345436453646fasdfdsagdfsadgwrtrfrgdsavdaf
sdfsadfdsafsdafdsafasd345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsafsdafdsafasd345436453646fasdfdsa
部分讀取內容:345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsaf345436453646fasdfdsagdfsadgwrtrfrgdsavdaf
sdfsa

 

 

使用CLOB類可以非常方便的處理大數據的讀取功能

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM