目标:

了解大对象处理基本原理,

掌握CLOB数据的读,写操作。

可以使用CLOB类处理大文本数据。

大对象处理主要指CLOB和BLOB两种类型字段。可以大量存储文字。

要想在程序中处理这样的大数据操作,则必须使用preparedStatement完成。所有文件内容通过IO流方式从大文本字段中保存和读取。

写入大数据对象;

使用PreparedStatement接口中的方法。

void setAsciiStream(int parameterIndex, InputStream x, int length)
将指定输入流写入数据库文本字段
void setBinaryStream(int parameterIndex, InputStream x, int length)
将二进制输入流数据写入二进制字段中。

读取大数据对象

使用ResultSet接口下方法读取:

CLOB表示大文本数据,MySQL中提供了LONGTEXT表示大文本数据,此字段最大保存数据量4G。

例如,下面数据库脚步:

create table userclob
(
id int,
name varchar(30),
note longtext
)

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

package 类集;
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/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
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) ; // 创建PreapredStatement对象
File f = new File("d:" + File.separator + "mldn.txt") ;//创建文件对象实例
InputStream input = null ;
input = new FileInputStream(f) ; // 通过输入流读取文件

pstmt.setString(1,name) ;//设置第一个字段的值
pstmt.setAsciiStream(2,input,(int)f.length()) ;//将input实例指定的输入流设置给第二个字段,
pstmt.executeUpdate() ;//执行更新操作。
conn.close() ; // 数据库关闭
}
};

执行后查看结果:

下面使用IO流进行读取操作:

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
import java.io.InputStream ;
import java.util.Scanner ;
public class ClobDemo01{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
ResultSet rs = null ;
int id = 3 ; // 读取的编号
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) ;//通过ResultSet接口的方法读取字节流,读取这条数据第二个字段值,
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读取进来的,当然也可使用ResultSet中提供的getClob()方法,将全部内容编成CLOB对象,

直接使用CLOB可以方便取得大文本的数据。也可对这些文本进行简单操作,如截取指定字符串文本等。

ResultSet类获取CLOB对象方法:

 Clob getClob(int columnIndex)
以 Java 编程语言中 Clob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。

CLOB类有一个方法进行文本截取。

 String getSubString(long pos, int length)
获取此 Clob 对象指定的 CLOB 值中指定子字符串的副本

CLOB类还有一个截断文本方法:

 void truncate(long len)
截取此 Clob 指定的 CLOB 值,使其长度为 len 个字符。
package 类集;
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 ClobDemo01{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
ResultSet rs = null ;
int id = 3 ; // 读取的编号 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) ;//设置第一个参数的值为变量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,200) ;//截取前200个字符串
System.out.println("内容:" + note ) ;
c.truncate(100) ; // 只能读100个内容
System.out.println("部分读取内容:" + c.getSubString(1,(int)c.length())) ;
}
rs.close() ;
pstmt.close() ;
conn.close() ; // 数据库关闭
}
};

输出结果:

Tue Apr 18 23:18:51 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
姓名:小华
内容:345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsaf345436453646fasdfdsagdfsadgwrtrfrgdsavdaf
sdfsadfdsafsdafdsafasd345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsafsdafdsafasd345436453646fasdfdsa
部分读取内容:345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsaf345436453646fasdfdsagdfsadgwrtrfrgdsavdaf
sdfsa

使用CLOB类可以非常方便的处理大数据的读取功能

JDBC:数据库操作:处理大对象CLOB数据的更多相关文章

  1. 处理大数据对象clob数据和blob数据

    直接上下代码: package com.learn.jdbc.chap06; import java.io.File; import java.io.FileInputStream; import j ...

  2. java操作oracle的blob,clob数据

    一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB:  ...

  3. Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值

    1 Statement和PreparedStatement的特点   a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录   b)对于创建和 ...

  4. Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

    Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...

  5. 深入浅出JDBC-操作时间与大对象(Clob/Blob)

    一.时间(Date.Time.Timestamp) java.sql.Date/java.sql.Time/java.sql.Timestamp extends java.util.Date publ ...

  6. Oracle数据库中的大对象(LOB)数据类型介绍

    一.LOB数据类型的介绍 大对象(LOB)数据类型允许我们保存和操作非结构化和半结构化数据,如文档.图形图像.视频片段.声音文件和XML文件等.DMBS_LOB 包被设计用于操作 LOB 数据类型.从 ...

  7. JDBC:数据库操作:事务

    事务特征:原子性,一致性,独立性,持久性. 要想操作事务,必须按照以下步骤完成. 1,取消掉自动提交(SET AUTOCOMMIT=0):每次执行数据库更新的时候实际上发出SQL命令之后就已经提交上去 ...

  8. JDBC数据库操作

    JDBC:   创建SQL语句对象    Statement statement = (Statement) con.createStatement() ;   调用执行     statement. ...

  9. 内置对象Clob对从数据库表中取的字符大对象CLOB类型的列值进行读取操作

    package readclobDemo.bao; import java.io.IOException; import java.io.Reader; import java.sql.Clob; i ...

随机推荐

  1. C++-STL-(map用法)

    http://blog.csdn.net/sunshinewave/article/details/8067862

  2. hdu1006 Tick and Tick (数学题 借鉴了大神的博客)

    先缩短一半的时间:早上的12个小时和下午的12小时对时钟是一样的,因为时钟12小时与0小时的三针位置相同.接着就是了解到每次所有的针从有重合到再次有重合至多有一段连续的段符合三针分离度大于n.所以只要 ...

  3. 「NOI2018」归程

    「NOI2018」归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 >\(1\) 个节点. \(m\) 条边的无向连通图(节点的编号从 \( ...

  4. BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题目大意] 出一棵边权树,每次给出一些关键点,求最小边割集, 使得1点与各个关 ...

  5. 【转载】Java中String类的方法及说明

    转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一.      String sc_ ...

  6. 中间件和auth模块

    中间件 1.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用 ...

  7. go环境变量配置liteide配置

    1.go环境变量配置 http://download.csdn.net/detail/defonds/9408855下载后直接安装如果都选默认就只要添加一个gopath就可以了 不是默认添加goroo ...

  8. 统计个位数的数目 Exercise07_07

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:统计个位数的数目 * */ public class Exercise07_07 { public static void m ...

  9. HTTP模块理解(二)

    这是我在写,用express+ajax+swig来做一个简单的应用的时候,遇到的问题.还是不太理解http模块. 后来在网上看到云栖社区的一篇<Node.js之HTTP请求与响应>,这里做 ...

  10. HDU 4639 Hehe (2013多校4 1008 水题)

    Hehe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...