`

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来操作,可以避免此问题。

分享到:
评论

相关推荐

    datax读写MySQL8的插件

    在大数据处理领域,MySQL作为广泛应用的关系型数据库,其数据的读取与写入往往是必不可少的操作。针对MySQL 8.x版本,DataX提供了专门的读写插件,以满足高效稳定的数据同步需求。本文将详细介绍DataX MySQL8读写...

    jdbc-mysql-connector-j-8.0.31.jar jdbc-sqljdbc41.jar

    本话题将深入探讨两个关键的Java数据库连接器(JDBC)驱动,即`jdbc-mysql-connector-j-8.0.31.jar`(用于MySQL)和`jdbc-sqljdbc41.jar`(用于SQL Server),以及它们在JMeter中的应用。 首先,`jdbc-mysql-...

    jdbc批量插入大字段

    在Oracle数据库中,Blob类型用于存储大量的二进制数据...总之,批量插入大字段是处理大量Blob数据的关键策略,通过JDBC提供的批处理功能,结合合理的事务管理和内存管理,可以显著提升Oracle数据库中的大数据插入效率。

    JDBC 图片录入mysql库 完整版

    - 对于大数据量的图片,考虑分块读写,避免一次性加载大量数据导致内存溢出。 通过以上介绍,你应该对使用JDBC将图片录入MySQL数据库有了全面的理解。实际开发中,可以根据具体需求和项目规模,选择合适的数据存储...

    自动读取mysql数据库字段并自动生成java属性和set和get方法

    在压缩包子文件的文件名称列表中,"FieldToRead--属性读写"可能表示的是一个实现此功能的具体文件,或者是一个示例,用于展示如何读取数据库字段并生成Java属性的读写方法。该文件可能是代码示例、配置文件或者是...

    简单的spark 读写hive以及mysql

    在大数据处理领域,Apache Spark 和 Apache Hive 以及 MySQL 是三个重要的组件。Spark 提供了高效的数据处理能力,而 Hive 则是基于 Hadoop 的数据仓库工具,MySQL 是一种广泛使用的开源关系型数据库。本篇文章将...

    ShardingJDBC5.1.1按月分库分表、读写分离、自动创表完整demo

    ShardingJDBC作为一款轻量级的Java框架,能够有效地解决大数据量下的分库分表、读写分离等问题,提高系统的并发处理能力。本文将通过一个基于SpringBoot、Mybatis-Plus和Druid的数据源管理的完整示例,详细介绍如何...

    mysql-connector-j-8.4.0.jar.rar

    总之,MySQL Connector/J 8.4.0.jar是Java开发者连接MySQL数据库不可或缺的工具,它的存在极大地简化了Java应用程序与MySQL数据库的集成过程,使得开发者可以充分利用Java和MySQL的特性,构建高效、安全的数据库应用...

    mysql数据抽取,自动生成hive建表语句

    在大数据处理领域,MySQL作为一款常用的在线事务处理(OLTP)数据库系统,常常用于存储实时、高并发的数据。而Hive则是一种基于Hadoop的数据仓库工具,它提供了SQL-like的查询语言(HQL)来处理分布式存储的大规模...

    jmeter mysql和oracle jdbc驱动包 两个

    在IT行业中,数据库是数据存储和管理的核心工具,而JDBC(Java Database Connectivity)则是Java程序与各种数据库进行交互的标准接口。本主题聚焦于JMeter如何利用JDBC驱动包来连接MySQL和Oracle数据库,以及涉及的...

    Mysql 百万级数据优化资料

    从给定的文件标题、描述、标签以及部分内容中,我们可以提炼出关于MySQL百万级数据优化的关键知识...通过综合考虑并优化这些因素,可以有效提升数据库处理大规模数据的能力,从而满足高并发、大数据量的应用场景需求。

    Amoeba搞定mysql主从读写分离

    Amoeba作为透明的数据分片中间件,会拦截应用程序对MySQL的SQL请求,然后根据预设的策略将读写操作路由到不同的数据库实例。对于写操作,Amoeba通常只将请求发送到主库,确保数据的一致性;而对于读操作,它可以将...

    ORACLE数据库中插入大字段数据的解决方法

    在ORACLE数据库中插入大字段数据时,可能会遇到性能问题或者由于字段长度限制导致的错误。...同时,通过分析`MysqlToOracle.java`源码,我们可以学习到如何在Java环境下进行跨数据库的数据迁移和大字段的处理。

    java实现mysql数据库的表导出到excel文件

    在Java项目中,我们需要添加MySQL的JDBC驱动(如mysql-connector-java.jar)作为依赖,以便能够执行SQL语句并获取数据。 接下来,我们需要处理Excel文件。Java中常用的处理Excel文件的库有Apache POI。Apache POI是...

    intelliJ Idea SpringBoot MySQL实例

    最后,运行项目,通过浏览器或Postman测试API接口,确保SpringBoot应用能够正常连接MySQL数据库,并进行数据操作。 总结,本文介绍了如何使用IntelliJ IDEA、SpringBoot和MySQL搭建一个简单的Java应用。通过实践这...

    sharding-jdbc-example

    在现代的分布式数据库系统中,Sharding-JDBC作为一个轻量级的Java框架,为了解决大数据量下的性能瓶颈,提供了数据分片、读写分离、分布式事务等核心功能。本示例以"sharding-jdbc-example"为主题,涵盖了Spring-...

    java_mysql_数据类型对照.doc

    - **BLOB类型**:用于存储图像、音频、视频等非结构化数据时非常有用,但需要注意性能问题,大量读写BLOB数据可能会影响数据库的响应速度。 - **BOOLEAN类型**:尽管MySQL中使用TINYINT来表示布尔值,但在Java中...

    利用poi把excel数据批量导入mysql

    本文将详细讲解如何使用Apache POI库处理Excel文件,并通过Java的JDBC接口将数据批量插入到MySQL数据库中。 Apache POI是Java领域的一个开源库,专门用于读写Microsoft Office格式的文件,包括Excel(.xls或.xlsx)...

    读写数据库数据的mr程序

    在大数据处理领域,MapReduce是一种广泛使用的编程模型,尤其在Hadoop生态系统中,它被用于处理和生成大规模数据集。...对于理解和掌握大数据处理流程,以及Hadoop、MySQL和HBASE的集成应用,具有重要的实践意义。

Global site tag (gtag.js) - Google Analytics