大对象:
大对象处理主要指的是clob和blob两种类型的字段,在clob中可以存放海量文字,
如存储异步《三国演义》或者《红楼梦》等;在blob中可以存储二进制数据,
如图片,电影等等,如果在程序中要想存储大对象,必须用PreparedStatement完成,
所有的内容要通过IO流的方式从大文本字段中保存和读取;
将一个文本文件写入到数据表的一个字段中:
drop table userclob;
create table userclob(
id int auto_increment primary_key,
name varchar(30) not null,
note LongText
);
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.*;
import java.text.*;
public class Demo{
//定义数据库的驱动程序
public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
//定义数据库的连接地址:
public static final String DBURL="jdbc:mysql://localhost:3306/lid";
//定义数据库的用户名
public static final String DBUSER="root";
//定义数据库的密码
public static final String DBPASSWORD="123";
public static void main(String args[]) throws Exception{
Connection conn=null;
PreparedStatement pstmt=null;//数据库操作
ResultSet rs=null;
//加载数据库驱动
Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
String sql="insert into userclob(name,note) values(?,?)";
pstmt=conn.prepareStatement(sql);//实例化PreparedStatement
File f=new File("D:"+File.separator+"note.txt");
InputStream in=null;
in=new FileInputStream(f);//通过输入流读取文件
pstmt.setString(1,"yuj");
pstmt.setAsciiStream(2,in,(int)f.length());
pstmt.executeUpdate();
pstmt.close();
conn.close();
}
}
读出数据库中的内容:
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;
import java.io.*;
import java.text.*;
public class Demo{
//定义数据库的驱动程序
public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
//定义数据库的连接地址:
public static final String DBURL="jdbc:mysql://localhost:3306/lid";
//定义数据库的用户名
public static final String DBUSER="root";
//定义数据库的密码
public static final String DBPASSWORD="123";
public static void main(String args[]) throws Exception{
Connection conn=null;
PreparedStatement pstmt=null;//数据库操作
ResultSet rs=null;
//加载数据库驱动
Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
int id=1;
String sql="select name,note from userclob where id=?";
pstmt=conn.prepareStatement(sql);//实例化PreparedStatement
pstmt.setInt(1,id);
rs=pstmt.executeQuery();
if(rs.next()){
String name=rs.getString(1);
StringBuffer note=new StringBuffer();
InputStream in=rs.getAsciiStream(2);
Scanner scan=new Scanner(in);
scan.useDelimiter("\r\n");
while(scan.hasNext()){
note.append(scan.next()).append("\n");
}
System.out.print("内容:"+note);
}
rs.close();
pstmt.close();
conn.close();
}
}
以上内容直接通过ResultSet读取进来的,当然也可以使用ResultSet中提供的getClob()
方法,将全部的内容变为Clob对象的内容,直接使用Clob可以方便的取得大文本的数据;
也可对这些数据进行简单的操作,如截取指定长度的文本等;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Clob;
import java.util.*;
import java.io.*;
import java.text.*;
public class Demo{
//定义数据库的驱动程序
public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
//定义数据库的连接地址:
public static final String DBURL="jdbc:mysql://localhost:3306/lid";
//定义数据库的用户名
public static final String DBUSER="root";
//定义数据库的密码
public static final String DBPASSWORD="123";
public static void main(String args[]) throws Exception{
Connection conn=null;
PreparedStatement pstmt=null;//数据库操作
ResultSet rs=null;
//加载数据库驱动
Class.forName(DBDRIVER);//创建一个该驱动类的Class对象;
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
int id=1;
String sql="select name,note from userclob where id=?";
pstmt=conn.prepareStatement(sql);//实例化PreparedStatement
pstmt.setInt(1,id);
rs=pstmt.executeQuery();
if(rs.next()){
String name=rs.getString(1);
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();
}
}