Java数据库编程---Clob

来源:互联网 发布:安卓模拟windows系统 编辑:程序博客网 时间:2024/04/29 22:33

处理大对象数据—处理CLOB数据。


大对象

大对象处理主要指的是CLOB和BLOB两种类型的字段,在CLOB中可以存储海量文字,例如,存储一部《三国演义》或者是《红楼梦》等。在BLOB中可以存储二进制数据,如图片、电影等等,如果在程序中要想处理这样的大对象操作,则必须使用PreparedStatement完成,所有的内容要通过IO流的方式从大文本字段中保存和读取。




处理CLOB数据

CLOB表示大文本数据,在MySQL中提供了LONGTEXT表示大文本数据,此字段的最大保存数据量为4G。例如,下面有如下的数据库创建脚本:

DROP TABLE userclob;

CREATE TABLE userclob

{

     Id          INT       AUTO_INCREMENT    PRIMARY KEY    ,

     Name        VARCHAR(30)         NOT NULL,

     Note         LONGTEXT

};


现有如下一个文本文件:


将以上的文本写入到数据表的字段之中。

【ClobDemo01.java的代码如下:】

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/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    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); //创建PreparedStatement对象

    File f = new File("d:" + File.separator + "skewrain.txt");

    InputStream input = null;

    input = new FileInputStream(f);   //通过输入流读取文件

    pstmt.setString(1,name);

    pstmt.setAsciiStream(2,input,(int)f.length());

    pstmt.executeUpdate();

    conn.close();         //数据库关闭

}

};

编译运行的结果如下:


在数据库中,执行命令 SELECT  *  FROM  userclob;

执行结果如下:


可见,文本文字已经能够被正确保存到数据库中了。


下面使用IO进行读取操作,读取的时候也需要使用IO流的方式读取进来。

【ClobDemo02.java的内容如下:】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.util.Scanner;

public class ClobDemo02{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;

    ResultSet rs = null;

    int id = 1 ;   //读取的编号

    String sql = "SELECT name,note FROM userclob WHERE ID = ?";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql); //创建PreparedStatement对象

    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);

        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();

}

};

编译运行的结果如下:


可见,文件读取成功!


如果文件内容过大时,我们可以将文件的内容读取到一个本地文件中。

使用命令:java ClobDemo02  >d:\temp.txt

可以将程序的执行结果输出到一个本地文件中:【效果如下】


执行结果:



Clob类

以上的做法是将大文本数据内容直接通过ResultSet读取进来的,当然也可以使用ResultSet中提供的getClob()方法,将全部的内容变成Clob对象的内容,直接使用Clob可以方便的取得大文本的数据,也可以对这些文本数据进行一些简单的操作,如截取指定长度的文本等。


使用Clob类进行读取的方式如下:【ClobDemo03.java的内容如下】

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 ClobDemo03{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;

    ResultSet rs = null;

    int id = 1 ;   //读取的编号

    String sql = "SELECT name,note FROM userclob WHERE ID = ?";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql); //创建PreparedStatement对象

    pstmt.setInt(1,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,(int)c.length());

        System.out.println("内容: " + note); //读出全部内容

        c.truncate(100);  //只能读100个内容

        System.out.println("部分读取内容: " + c.getSubString(1,(int)c.length()));

    }

    rs.close();

    pstmt.close();

    conn.close();

}

};

编译运行的结果如下所示:【前一部分和上一个程序的执行结果相同】


可见,数据读取成功。所以要想执行大文本的读写,可以使用IO流完成,或者直接使用Clob类完成。

0 0
原创粉丝点击