目标:

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

掌握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. WSDL格式浅析

    其中,WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作.这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上 ...

  2. AGC 022 C - Remainder Game

    题面在这里! 显然权值是 2^i 这种的话就是要你贪心,高位能不选就不选. 并且如果 % x 之后再去 % 一个>=x的数是没有用的,所以我们可以把操作的k看成单调递减序列. 这样的话就是一个有 ...

  3. CodeForces - 1000D Yet Another Problem On a Subsequence

    题面在这里! 好智障的一个dp啊,一段开头的数字相当于下面要跟多少个数,直接滚动数组dp就行了... #include<bits/stdc++.h> #define ll long lon ...

  4. 【tarjan+缩点】BZOJ1051-受欢迎的牛

    [题意] 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎. ...

  5. 【MySQL笔记】数据库的查询

    数据库的查询 注:文中 [ ...] 代表该部分可以去掉. 理论基础:对表对象的一组关系运算,即选择(selection).投影(projection)和连接(join) 1.select语句 子语句 ...

  6. JavaScript之几种创建函数的区别以及优缺点。

    工厂模式 function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = ...

  7. python一个简单的爬虫测试

    之前稍微学了一点python,后来一直都没用,今天稍微做一个小爬虫试一试.. 参考了: http://www.cnblogs.com/fnng/p/3576154.html 太久没用了,都忘记pych ...

  8. 每天一个linux命令21之ln: linux 下的软链和硬链

    首先理解一下一下inode:Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件. 表面上,用户通过文件名,打开文件.实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应 ...

  9. Unicode中的BOM

    BOM简述 BOM是byte order mark的缩写,在UTF-16和UTF-32中需要使用BOM来区分字节的顺序,因为我们目前的CPU有两种系列,一种是大端模式,一种是小端模式(我们常用的电脑手 ...

  10. 人工智能有简单的算法吗?Appendix: Is there a simple algorithm for intelligence?

    In this book, we've focused on the nuts and bolts of neural networks: how they work, and how they ca ...