您的位置:首页 > 数据库

Java数据库编程---Clob

2014-02-13 19:47 375 查看
处理大对象数据—处理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类完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: