`
paladin1988
  • 浏览: 326300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC备忘录6_处理大段文本和二进制数据

    博客分类:
  • JDBC
 
阅读更多

 

varchar()最大容量为255个,当需要更大的数据时候,我们需要使用大段文本数据类型 clob

各种数据库对clob类型的支持不同,在mysql中使用text(只能存放纯文本)

将文本文件的内容存入clob字段中

如果文件中只有ascii码,没有中文字符则使用下面的方法
ps.setAsciiStream(int parameterIndex, InputStream x, int length)

不确定文件内容的编码时,可以使用
setCharacterStream(int parameterIndex, Reader reader, int length)

 

存入

	public static void create() throws Exception {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			String sql = "insert into clob_test(big_text) values (?) ";
			ps = conn.prepareStatement(sql);
			File file = new File("src/cn/itcast/jdbc/JdbcUtils.java");
			Reader reader = new BufferedReader(new FileReader(file));
			ps.setCharacterStream(1, reader, file.length());
			int i = ps.executeUpdate();
			System.out.println("i=" + i);
			reader.close();
		} finally {
			JdbcUtils.free(rs, ps, conn);
		}
		
	}

 

它的主要原理是通过IO的Reader,将文件内容读到字符流中,然后写入到数据库中(File-->Reader-->DB)。
对于内存而言,把文件的内容载入内存,文件-->内容,需要读取的字符流Reader。
由于java 的String类型是没有限制的,
所以可以通过把Reader转化成String,然后通过 ps.setString(1, str)的形式插入数据库;

 

 

读取clob类型的时候,先获取Reader,然后在写到其他地方。

 

	public static void read() throws Exception {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			conn = JdbcUtils.getConnection();
			String sql = "select big_text from clob_test where id = ? ";
			ps = conn.prepareStatement(sql);
			ps.setInt(1, 1);
			rs = ps.executeQuery();

			while (rs.next()) {
				File file = new File("clob.txt");
				Clob clob = rs.getClob("big_text");
				Reader reader = clob.getCharacterStream();
				Writer writer = new BufferedWriter(new FileWriter(file));
				char[] buffer = new char[1024];
				
				//这里为什么要定义hasReader呢
				//因为在最后一次读取的时候不一定可以可以读到1024个数据
				//所以这里应该使用读取多少就写入多少
				int hasRead = 0;
				while ( (hasRead = reader.read(buffer)) > 0) {
					writer.write(buffer, 0, hasRead);
				}
				
				reader.close();
				writer.close();
			}
		} finally {
			JdbcUtils.free(rs, ps, conn);	
		}
	}

 

 

大的二进制文本字段,在mysql中叫Blob
blob类型存放的数据小,无法存储时候可以使用longblob

blob类型的处理和大段文本数据处理的方式是一致的,都是借助IO来进行处理。
blob类型处理二进制文本信息,只能通过流处理,而不能通过字符来处理。

 

public class BlobTest {
	public static void main(String[] args) throws SQLException, IOException {
//		writeBlob();
		readBlob();
	}
	
	public static void readBlob() throws SQLException, IOException {
		String sql = "select big_blob from blob_test where id = ? ";
		Connection conn = JdbcUtils.getConnection();
		PreparedStatement pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, 2);
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next()) {
			Blob blob = rs.getBlob("big_blob");
			InputStream is = blob.getBinaryStream();
			File file = new File("a.jpg");
			OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
			
			byte[] buffer = new byte[1024];
			int hasRead = 0;
			
			while ((hasRead = is.read(buffer)) > 0) {
				os.write(buffer, 0, hasRead);
			}
			
			is.close();
			os.close();
		}
		
		JdbcUtils.free(rs, pstmt, conn);
	}
	
	public static void writeBlob() throws SQLException, IOException {
		String sql = "insert into blob_test(big_blob) values(?) ";
		Connection conn = JdbcUtils.getConnection();
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		File file = new File("bg.jpg");
		InputStream is = new BufferedInputStream(new FileInputStream(file));
		pstmt.setBlob(1, is, file.length());
		
		boolean flag = pstmt.execute();
		System.out.println("flag = " + flag);
		is.close();
		
		JdbcUtils.free(null, pstmt, conn);
		
	}
}

 

分享到:
评论

相关推荐

    Oracle,SQL2000,MYSQL存取图片或二进制数据的功能文件

    `MySQLUploader.java`文件可能包含处理MySQL数据库中图片或二进制数据的Java代码,使用JDBC连接,加载MySQL驱动,通过PreparedStatement执行SQL语句将二进制数据存入数据库。读取时,可以使用ResultSet的...

    MySQL存取大文本及二进制文件(图片)

    在MySQL数据库中,存储大文本(例如长篇文章、HTML代码)和二进制文件(如图片、PDF文档)是一项常见的需求。...正确理解和使用这些技术和数据类型,可以有效地管理和处理大数据量的文本和二进制资源。

    jdbc.zip_java jdbc_java+jdbc_jdbc_jdbc Java_zip

    5. **处理结果**:对于查询语句,使用ResultSet对象遍历和处理结果;对于更新语句,检查返回的更新计数。 6. **关闭资源**:在完成操作后,必须关闭ResultSet、Statement和Connection,以释放数据库资源。 在客户端...

    SqlServer与Oracle保存与读取图片二进制流

    4. **跨数据库操作**:在SQL Server和Oracle之间迁移或共享图片数据时,可能需要使用数据迁移工具或编程接口,如ODBC或JDBC,将二进制流从一个数据库复制到另一个。 5. **性能考虑**: - **存储效率**:存储二进制...

    图片以二进制存取数据库

    编程语言会提供API来处理二进制数据和SQL语句的执行。 5. **关闭连接**:操作完成后,记得关闭数据库连接,以释放资源。 取出图片显示的步骤: 1. **查询图片数据**:使用SELECT语句从数据库中获取图片的二进制...

    PROGRESS_DATADIRECT_JDBC_DRIVER_PIVOTAL_GREENPLUM_5.1.4.000275.zip

    Greenplum数据库本身是基于PostgreSQL的,但进行了大规模扩展,特别是增强了并行处理能力,以处理大规模的数据仓库和数据湖场景。它采用了MPP(Massively Parallel Processing)架构,能将数据分布到多个节点进行...

    JDBC基础知识1_保存大文本_分页_批处理

    标题“JDBC基础知识1_保存大文本_分页_批处理”揭示了本文将要讨论的是Java数据库连接(Java Database Connectivity, JDBC)的基础知识,主要包括如何在数据库中处理大文本数据、实现分页查询以及利用批处理提高...

    JSP+JDBC+DB.rar_ jsp jdbc_jdbc_jdbc jsp_jdbc mdb jsp_jsp jdbc

    标题"JSP+JDBC+DB.rar_ jsp jdbc_jdbc_jdbc jsp_jdbc mdb jsp_jsp jdbc"表明这是一个关于如何使用JSP和JDBC来处理数据库操作的资源包,可能包含了多种不同的数据库连接方式。描述中的“Java做的采用多种方式连接各种...

    实现数据库二进制流转换成图片保存本地

    在IT领域,数据库中存储图片通常以二进制流(Binary Stream)的形式进行,这是因为二进制流可以高效地处理图像数据,同时节省存储空间。本文将深入探讨如何实现从数据库中的二进制流转换为图片,并将其保存到本地...

    JDBC_Sybase.zip_jdbc Sybase _sybase _sybase jdbc_sybase jdbc dow

    它包含了一个简单的示例项目,以及相关的数据库文件和文档,可以帮助读者了解JDBC的基本用法,例如创建数据库连接、执行SQL查询、处理结果集等。此外,通过阅读“使用前的说明.txt”,用户可以更好地理解如何设置...

    ReadImages_sourcel1r_dieq2j_读取SQL数据库二进制图片_

    综上所述,从SQL数据库中读取二进制图片并生成本地文件是一项常见的任务,涉及数据库操作、二进制数据处理和文件I/O。通过理解这些基本概念和技术,你可以有效地管理和利用存储在数据库中的图像资源。在给定的压缩包...

    Sybase ASE 16.0 jdbc驱动包 jdbc4-1.6.0_03_26972.jar

    Sybase ASE 16 jdbc驱动包 jdbc4-1.6.0_03_26972.jar

    MVC_jdbc.rar_ mvc jdbc_MVC JDBC_MVC_jdbc_jdbc mvc_servlet+jdbc

    1. **Model(模型)**:模型层是业务逻辑的承载者,负责处理数据和业务规则。在本项目中,模型层可能包含对数据库的操作,如通过JDBC(Java Database Connectivity)接口来执行SQL语句,进行数据的存取。JDBC是Java...

    java连接Access2010读取图片二进制

    在循环中,代码读取每条记录的`id`字段和`data`字段,`data`字段包含了二进制图片数据。`rs.getString("id")`获取`id`字段的值,而`rs.getBinaryStream("data")`则返回`data`字段的二进制输入流。 接下来,使用`...

    JDBC.rar_jdbc_同学录系统_学生通讯录_校园卡_校园卡 java

    标题中的“JDBC.rar_jdbc_同学录系统_学生通讯录_校园卡_校园卡_java”揭示了这个压缩包文件包含的内容与Java编程语言、JDBC(Java Database Connectivity)技术以及一个具体的项目应用有关,该项目涉及到同学录系统...

    JPA完成单表注解配置说明包括日期,大文本,二进制文本,枚举

    对于日期、大文本、二进制文本和枚举字段的处理,JPA会自动进行转换,使它们能够在数据库中正确存储和检索。 在“JPA_Dome”压缩包中,可能包含了上述示例的完整代码,你可以下载并运行这些代码以加深理解。通过...

    SQL Server JDBC 驱动.zip_SQL Server for JDBC_jdbc_jdbc sql _sql jd

    1. **msbase.jar**: 这个库文件包含了SQL Server JDBC驱动的基础类,提供了对基本数据库操作的支持,如连接、查询和事务处理。它实现了JDBC接口,使得Java程序员能够按照标准的JDBC方式来操作SQL Server数据库。 2....

    Jdbc.zip_JDBC程序_oracle_oracle jdbc

    标题中的“Jdbc.zip_JDBC程序_oracle_oracle jdbc”表明这是一个关于使用Java数据库连接(JDBC)与Oracle数据库交互的程序示例。在描述中提到,“一段Jdbc连Oracle的程序,并实现数据查询”,这暗示我们将探讨如何...

    从数据库中读取二进制图片

    通过以上方法,我们可以高效地从数据库中读取和处理二进制图片。这个过程涉及到数据库操作、二进制数据处理以及图片编码等多个技术点,理解并掌握这些知识对于开发涉及数据库存储和检索图片的应用至关重要。

    JDBC+DAO.rar_DAO JDBC_java d_jdbc d_jdbc dao_留言系统

    标题"JDBC+DAO.rar_DAO JDBC_java d_jdbc d_jdbc dao_留言系统"中,关键词主要包括"JDBC"、"DAO"和"留言系统",这表明这是一个基于Java的数据库操作(JDBC)和数据访问对象(DAO)模式实现的简单留言系统。...

Global site tag (gtag.js) - Google Analytics