jdbc之mysql慕课_JDBC读写MySQL的大字段数据

不管你是新手还是老手,大字段数据的操作常常令你感到很头痛。因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。本人以前用到Spring+iBatis架构来操作大字段,结果以惨烈失败而告终,在网上寻求解决方案,也没找到答案。最终以JDBC来实现了大字段操作部分。

本文以MySQL为例,通过最基本的JDBC技术来处理大字段的插入、读取操作。

环境:

MySQL5.1

JDK1.5

一、认识MySQL的大字段类型

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

BLOB 列被视为二进制字符串(字节字符串)。TEXT列被视为非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。TEXT列有一个字符集,并且根据字符集的 校对规则对值进行排序和比较。

在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。

当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合。

几种类型的大字段最大长度说明:

TINYBLOB最大长度为255(2^[8]–1)字节的BLOB列。

TINYTEXT最大长度为255(2^[8]–1)字符的TEXT列。

BLOB[(M)]最大长度为65,535(2^[16]–1)字节的BLOB列。可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。

TEXT[(M)]最大长度为65,535(2^[16]–1)字符的TEXT列。可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。

MEDIUMBLOB最大长度为16,777,215(2^[24]–1)字节的BLOB列。

MEDIUMTEXT最大长度为16,777,215(2^[24]–1)字符的TEXT列。

LONGBLOB最大长度为4,294,967,295或4GB(2^[32]–1)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。

LONGTEXT最大长度为4,294,967,295或4GB(2^[32]–1)字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。

二、创建测试环境

create table user (

id int(11) not null auto_increment,

name varchar(50) not null,

pswd varchar(50) default null,

pic longblob,

remark longtext,

primary key (id)

);

三、插入读取blob

import lavasoft.common.DBToolkit;

import java.io.*;

import java.sql.*;

/**

* 操作MySQL5的blob字段

*

* @author leizhimin 2009-12-3 11:34:50

*/

public class BlobTest {

public static void main(String[] args) {

insertBlob();

queryBlob();

}

public static void insertBlob() {

Connection conn = DBToolkit.getConnection();

PreparedStatement ps = null;

try {

String sql = "insert into testdb.user (name, pswd, pic) values (?, ?, ?)";

ps = conn.prepareStatement(sql);

ps.setString(1, "zhangsan");

ps.setString(2, "111");

//设置二进制参数

File file = new File("D:\\new\\dbtools\\src\\res\\PIC.PNG");

InputStream in = new BufferedInputStream(new FileInputStream(file));

ps.setBinaryStream(3, in, (int) file.length());

ps.executeUpdate();

in.close();

} catch (IOException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBToolkit.closeConnection(conn);

}

}

public static void queryBlob() {

Connection conn = DBToolkit.getConnection();

PreparedStatement ps = null;

Statement stmt = null;

ResultSet rs = null;

try {

String sql = "select pic from user where id = 24";

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

if (rs.next()) {

InputStream in = rs.getBinaryStream(1);

File file = new File("D:\\new\\dbtools\\src\\res\\PIC_COPY.PNG");

OutputStream out = new BufferedOutputStream(new FileOutputStream(file));

byte[] buff = new byte[1024];

for (int i = 0; (i = in.read(buff)) > 0;) {

out.write(buff, 0, i);

}

out.flush();

out.close();

in.close();

}

rs.close();

stmt.close();

} catch (IOException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBToolkit.closeConnection(conn);

}

}

}

注意,要确保二进制数据长度足够大,否则可能导致数据写入不完整的问题。

三、插入读取clob字段

clob在MySQL5中对应的就是text字段,可以根据实际需要选择合适的长度。

package lavasoft.jdbctest;

import lavasoft.common.DBToolkit;

import java.io.*;

import java.sql.*;

/**

* 操作MySQL5的Clob字段

*

* @author leizhimin 2009-12-3 13:56:16

*/

public class ClobTest {

public static void main(String[] args) {

insertClob();

queryClob();

}

public static void insertClob() {

Connection conn = DBToolkit.getConnection();

PreparedStatement ps = null;

try {

String sql = "insert into testdb.user (name, pswd, remark) values (?, ?, ?)";

ps = conn.prepareStatement(sql);

ps.setString(1, "zhangsan");

ps.setString(2, "111");

//设置二进制参数

File file = new File("D:\\new\\dbtools\\src\\res\\PIC.PNG");

//                        InputStreamReader reader = new InputStreamReader(new FileInputStream("D:\\new\\dbtools\\src\\res\\TEXT.txt"),"GB18030");

InputStreamReader reader = new InputStreamReader(new FileInputStream("D:\\new\\dbtools\\src\\res\\TEXT.txt"));

ps.setCharacterStream(3, reader, (int) file.length());

ps.executeUpdate();

reader.close();

} catch (IOException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBToolkit.closeConnection(conn);

}

}

public static void queryClob() {

Connection conn = DBToolkit.getConnection();

PreparedStatement ps = null;

Statement stmt = null;

ResultSet rs = null;

try {

String sql = "select remark from user where id = 1";

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

if (rs.next()) {

Reader reader = rs.getCharacterStream(1);

File file = new File("D:\\new\\dbtools\\src\\res\\TEXT_COPY.txt");

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file));

//                                OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file),"ISO-8859-1");

//                                OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file),"GB18030");

char[] buff = new char[1024];

for (int i = 0; (i = reader.read(buff)) > 0;) {

writer.write(buff, 0, i);

}

writer.flush();

writer.close();

reader.close();

}

rs.close();

stmt.close();

} catch (IOException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBToolkit.closeConnection(conn);

}

}

}

在处理blob字段时候,由于直接处理的是二进制流,所以没啥问题。在处理clob字段的时候,由于数据库对clob是以字符的形式进行存储,这就有一个编码问题。本文虽然成功的插入读取了clob字段,但是还没有解决乱码问题,因为JDBC在获取到clob的时候,已经对其进行了编码,Reader reader = rs.getCharacterStream(1); 这就导致了编码的混乱,如果要彻底解决,还需要看看MySQL驱动的实现。通过非常规手段来解决。为了绕开此问题,可以将clob的数据存储为blog来操作,可以避免此问题。

©著作权归作者所有:来自51CTO博客作者leizhimin的原创作品,如需转载,请注明出处,否则将追究法律责任

MySQL数据库休闲J2SE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值