标签:
大数据对象主要指的是CLOB和BLOB两种类型的字段,在CLOB中可以存储海量文字,例如存储一本小说。在BLOB中可以存储二进制文件,如电影,图片等,如果在程序中要处理大的数据对象,则必须使用PreparedStatement 完成,所有的内容要通过IO流的方式从大字段文本中保存和读取。
写入大数据对象的主要方法:
读取大数据对象的主要方法:
CLOB表示大文本数据(Character Large Object),在MySQL中提供了LONGTEXT字段表示大文本数据,这个字段的最大存储容量问4G。
可以通过IO流的方式读取文件内容:
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/root" ; // 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) ; // 创建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) ; 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中的getClob()方法,将全部的内容变为Clob对象的内容,直接使用Clob可以很方便的取得大数据的文本,也可以对文本数据进行简单的操作。
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/root" ; // 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) ; // 创建PreapredStatement对象 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流读取:
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileOutputStream ; import java.sql.ResultSet ; import java.io.InputStream ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo02{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ; // 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,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 执行查询 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; InputStream input = rs.getBinaryStream(2) ; File f = new File("d:" + File.separator + "loadmldn.gif") ; // 图片文件 OutputStream out = null ; out = new FileOutputStream(f) ; int temp = 0 ; while((temp=input.read())!=-1){ // 边读边写 out.write(temp) ; } input.close() ; out.close() ; } pstmt.close() ; conn.close() ; // 数据库关闭 } };
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.sql.Blob ; import java.sql.ResultSet ; import java.io.File ; import java.io.FileOutputStream ; import java.io.InputStream ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo03{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ; // 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,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 执行查询 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; Blob b = rs.getBlob(2) ; File f = new File("d:" + File.separator + "loadmldn.gif") ; // 图片文件 OutputStream out = null ; out = new FileOutputStream(f) ; out.write(b.getBytes(1,(int)b.length())) ; out.close() ; } pstmt.close() ; conn.close() ; // 数据库关闭 } };
这篇主要总结了下Java数据库中对大数据对象的操作,但是从实际使用和开发的过程来看,把太大的文件放在数据库中是一个不明智的选择,数据过大时往往是采用映射路径的方式写入的。
标签:
原文地址:http://blog.csdn.net/tryitboy/article/details/43561295