JDBC的流数据

以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/streaming-data.html

PreparedStatement对象必须具备使用输入和输出流来提供参数数据的能力。这能够将整个文件存储到数据库列中,这样数据库就能存储大型数据,例如CLOB和BLOB数据类型。

用于流数据有下列几种方法:

  • setAsciiStream():该方法是用来提供较大的ASCII值。
  • setCharacterStream():该方法是用来提供较大的UNICODE值。
  • setBinaryStream():该方法是用来提供较大的二进制值。

setXXXStream()方法需要一个额外的参数,该参数是除了参数占位符的文件大小。这个参数通知驱动程序通过使用流有多少数据被发送到数据库中。

示例:

假要上传一个名为XML_Data.xml的XML文件到数据库的表中。下面是该XML文件的内容:

<?xml version="1.0"?>
<Employee>
<id>100</id>
<first>Zara</first>
<last>Ali</last>
<Salary>10000</Salary>
<Dob>18-08-1978</Dob>
<Employee>

将该XML文件和要运行的示例保存在相同的目录的。

这个示例将创建一个数据库表XML_Data,然后XML_Data.xml将被上传到该表中。

将下面的示例拷贝并粘帖到JDBCExample.java中,编译并运行它,如下所示:

//Import required packages
import java.sql.*;
import java.io.*;
import java.util.*;

public class JDBCExample {
    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/Test?serverTimezone=UTC";

    // Database credentials
    static final String USER = "root";
    static final String PASS = "root";

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // Register JDBC driver
            Class.forName("com.mysql.jdbc.Driver");

            // Open a connection
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // Create a Statement object and build table
            stmt = conn.createStatement();
            createXMLTable(stmt);

            // Open a FileInputStream
            File f = new File("XML_Data.xml");
            long fileLength = f.length();
            FileInputStream fis = new FileInputStream(f);

            // Create PreparedStatement and stream data
            String SQL = "INSERT INTO XML_Data VALUES (?,?)";
            pstmt = conn.prepareStatement(SQL);
            pstmt.setInt(1, 100);
            pstmt.setAsciiStream(2, fis, (int) fileLength);
            pstmt.execute();

            // Close input stream
            fis.close();

            // Do a query to get the row
            SQL = "SELECT Data FROM XML_Data WHERE id=100";
            rs = stmt.executeQuery(SQL);
            // Get the first row
            if (rs.next()) {
                // Retrieve data from input stream
                InputStream xmlInputStream = rs.getAsciiStream(1);
                int c;
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                while ((c = xmlInputStream.read()) != -1)
                    bos.write(c);
                // Print results
                System.out.println(bos.toString());
            }
            // Clean-up environment
            rs.close();
            stmt.close();
            pstmt.close();
            conn.close();
        } catch (SQLException se) {
            // Handle errors for JDBC
            se.printStackTrace();
        } catch (Exception e) {
            // Handle errors for Class.forName
            e.printStackTrace();
        } finally {
            // finally block used to close resources
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException se2) {
            } // nothing we can do
            try {
                if (pstmt != null)
                    pstmt.close();
            } catch (SQLException se2) {
            } // nothing we can do
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            } // end finally try
        } // end try
        System.out.println("Goodbye!");
    }// end main

    public static void createXMLTable(Statement stmt) throws SQLException {
        System.out.println("Creating XML_Data table...");
        // Create SQL Statement
        String streamingDataSql = "CREATE TABLE XML_Data " + "(id INTEGER, Data LONG)";
        // Drop table first if it exists.
        try {
            stmt.executeUpdate("DROP TABLE XML_Data");
        } catch (SQLException se) {
        } // do nothing
            // Build table.
        stmt.executeUpdate(streamingDataSql);
    }// end createXMLTable
}// end JDBCExample

当运行JDBCExample时,它将展示下面的结果:

测试工程:https://github.com/easonjim/5_java_example/tree/master/jdbcbasics/test9

时间: 2024-11-16 15:09:08

JDBC的流数据的相关文章

一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据

当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户端,此时RTSP客户端可以调用GetMediaData等接口获取媒体流数据. 一.uint8_t * RtspClient::GetMediaData(string media_type, uint8_t * buf, size_t * size, size_t max_size) 该函数的作用即获

利用OData轻易实现串流数据的可视化

OData(开放数据协议,Open Data Protocol)一直是我喜欢一种的标准(OASIS 标准),它基于RESTful协议提供了一种强大的查询和编辑数据的访问接口.虽然是微软推出的,不过在诞生之初就带有开放标准和开源的基因(最开始微软就开源了OData Client的代码).等以后有机会,我再详细介绍OData的一些知识. 之前,我所涉及的OData开发经验大都集中在对后端数据库(SQL 或 NoSQL)的访问,而今天分享的这篇文章从一种不同的视角讲述了OData的运用. 我们知道OD

JDBC之 大数据内容的传输

JDBC之 大数据内容的传输 什么是大数据内容? 在数据库中,有一条一条的记录,记录中很多字段都是几个字符就够的,假如现在要把一部小说存入数据库,这本小说当然不是几个字符组成,而是由几万字组成,这本小说的数据我们就可以说是大数据,生活中当然有各种各样的大数据:电影,音乐,图片等等... 大字符数据内容操作 大字符内容:通常是指很长的字符类型的文件,例如小说,故事等等,内容有字符组成. 下面说明一下MySQL与Oracle中的大数据类型 数据种类 数据大小 MySQL Oracle 字符 小 ch

Storm项目:流数据监控1《设计文档…

该文档为实实在在的原创文档,转载请注明作者及出处. 类型 详细 备注 2 该文档为原创模拟项目:流数据监控<1>文档<流数据监控设计文档>,相继会给出流数据监控<2>文档<流数据监控代码解析>及其他文档 2  该部分有源码(熬夜写出来的哦) CSDN中相应项目CODE链接:戳这里     相关描述 2  有任何其他想法,可以邮件[email protected] 2 文档及相关资料下载请到个人360云盘http://yunpan.cn/QGf2GDaRFpc

Xilinx VDMA 24位流输出与32位AXI总线的内存 流数据关系

测试方法采用了VDMA仅有MM2S通道, 内存中的图像帧是用MicroBlaze核写入的一个colorbar. VDMA的mhs部分如下, 因为我的输出用了Digilent的HDMI核,而这个HDMI核是32位的,我自己写了个axis_24_32的位宽转换的ip,这个暂且按下不表. BEGIN axi_vdma PARAMETER INSTANCE = axi_vdma_0 PARAMETER HW_VER = 5.04.a PARAMETER C_USE_FSYNC = 0 PARAMETER

点击流数据(Click Stream Data)及其应用

点击流(Click Stream)是指用户在网站上持续访问的轨迹.众所周知,用户对网站的每次访问包含了一系列的点击动作行为,这些点击行为数据就构成了点击流数据(Click Stream Data),它代表了用户浏览网站的整个流程.目前点击流数据的获取方法有很多,例如通过JS进行事件捕获.发布客户端应用进行采集.网站日志分析等等,本文仅以网站日志分析为例进行阐述. 点击流和网站日志是两个不同的概念,点击流是从用户的角度出发,注重用户浏览网站的整个流程:而网站日志是面向整个站点,它包含了用户行为数据

使用FFMPEG SDK解码流数据

本文以H264视频流为例,讲解解码流数据的步骤. 为突出重点,本文只专注于讨论解码视频流数据,不涉及其它(如开发环境的配置等).如果您需要这方面的信息,请和我联系. 准备变量 定义AVCodecContext.如果您使用类,可以定义成类成员.我这里定义成全局变量. static AVCodecContext * g_pCodecCtx = NULL; 定义一个AVFrame,AVFrame描述一个多媒体帧.解码后的数据将被放在其中. static AVFrame * g_pavfFrame =

保存二进制流数据到文件

/// <summary>         /// 保存二进制流文件 /// </summary> /// <param name="files">文件流数据</param> /// <param name="systemCode">系统编号</param> /// <param name="moduleName">模块名称</param> /// &

WCF传送二进制流数据基本实现步骤详解

引用:http://www.cnblogs.com/lusunqing/p/3399594.html WCF传送二进制流数据的相关操作方法在实际应用中是一个比较基础的操作应用.我们在这里将会针对此做一个详细介绍. 我们知道,在实现WCF传送二进制流数据这一操作过程中,会有一些限制因素.我们在实际应用中要特别注意这一点.今天我们就会针对这方面的问题做一个详细的介绍,希望对大家有所帮助. WCF释放服务对象最直接方式解读 WCF分布事务保证数据完整性 Silverlight调用WCF出现异常解决方案