JDBC读写MySQL的大字段数据

JDBC读写MySQL的大字段数据

 

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

 

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

 

环境:

MySQL5.1

JDK1.5

 

一、认识MySQL的大字段类型

 

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

 

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

 

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

 

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

 

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

 

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

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,2954GB(2^[32]1)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。

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

 

二、创建测试环境

 

 

 

createtableuser (

    id int(11) notnull auto_increment,

    namevarchar(50) notnull,

    pswd varchar(50) defaultnull,

    pic longblob,

    remark longtext,

    primarykey (id)

);

 

三、插入读取blob

 

 

 

 

import lavasoft.common.DBToolkit; import java.io.*; import java.sql.*; /** * 操作MySQL5的blob字段 * * @author leizhimin 2009-12-3 11:34:50 */ publicclass BlobTest { publicstaticvoid main(String[] args) { insertBlob(); queryBlob(); } publicstaticvoid 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); } } publicstaticvoid 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 = newbyte[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字段

 

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

 

 

 

 

package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.io.*; import java.sql.*; /** * 操作MySQL5的Clob字段 * * @author leizhimin 2009-12-3 13:56:16 */ publicclass ClobTest { publicstaticvoid main(String[] args) { insertClob(); queryClob(); } publicstaticvoid 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); } } publicstaticvoid 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 = newchar[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来操作,可以避免此问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值