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类完成。
大对象
大对象处理主要指的是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类完成。
相关文章推荐
- java数据库编程--处理大对象数据(处理CLOB数据)
- java数据库编程——Insert and Retrieve Images from MySql Table Using Java
- Java的数据库连接编程(JDBC)技术
- Java、XML与数据库编程实践(二)
- Java数据库编程中的技巧
- Java的数据库连接编程(JDBC)技术
- java数据库编程--JDBC操作步骤以及数据库连接
- Java数据库编程中的技巧
- JAVA学习笔记整理十一(数据库编程)
- Java、XML与数据库编程实践(一)
- 从零开始学Java 第20章 数据库编程
- java连接常见数据库的连接字符串-Java基础-Java-编程开发
- Java数据库编程中的几个常用技巧
- 赵雅智_java 数据库编程(1)
- 《使用Java实现数据库编程》Lesson5 事务、视图、索引、备份和恢复
- Java数据库编程中查询结果的表格式输出
- 阿里巴巴Java 开发手册编程规约之MySQL 数据库
- Java数据库编程中查询结果的输出
- JAVA数据库编程——JDBC(一)