java xml二进制流传输_JDBC流ASCII和二进制数据

该博客介绍了如何使用Java的PreparedStatement对象通过流式传输将大文件(如XML)存储到数据库中。示例展示了如何设置ASCII流以上传文件到数据库表,并演示了从数据库检索和打印数据的过程。
摘要由CSDN通过智能技术生成

PreparedStatement对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如CLOB和BLOB数据类型。

有以下方法可用于流式传输数据 -

setAsciiStream():此方法用于提供大的ASCII值。

setCharacterStream():此方法用于提供较大的UNICODE值。

setBinaryStream():此方法用于提供较大的二进制值。

setXXXStream()方法除了参数占位符之外还需要额外的参数和文件大小。此参数通知驱动程序使用流向数据库发送多少数据。

实例

考虑要将XML文件xml_data.xml上传到数据库表中。下面是XML文件的内容 -

125

Max

Su

18000

18-08-1978

将此XML文件保存在要运行此示例的同一目录中。

此示例将在数据库创建一个表:xml_data,然后将文件xml_data.xml上传到此表中。

复制以下示例代码,并保存在文件:StreamingData.java 中,编译并运行如下 -

// Import required packages

import java.sql.*;

import java.io.*;

import java.util.*;

public class StreamingData {

// JDBC driver name and database URL

static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

static final String DB_URL = "jdbc:mysql://localhost/EMP";

// Database credentials

static final String USER = "root";

static final String PASS = "123456";

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,125);

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=125";

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

编译上面代码,如下 -

F:\worksp\jdbc>javac -Djava.ext.dirs=F:\worksp\jdbc\libs StreamingData.java

执行上面编译后的代码,得到以下结果 -

F:\worksp\jdbc>java -Djava.ext.dirs=F:\worksp\jdbc\libs StreamingData

Connecting to database...

Thu Jun 01 21:42:00 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

Creating XML_Data table...

125

Max

Su

18000

18-08-1978

Goodbye!

F:\worksp\jdbc>

在执行上面语句后,将在数据库:emp下创建一个名称为:xml_data的表,现在查询xml_data表中的数据,如下所示 -

mysql> select * from xml_data;

+-----+-----------------------------------------------------------------------------------------------------------------------------------+

| id | Data |

+-----+-----------------------------------------------------------------------------------------------------------------------------------+

| 125 | <?xml version="1.0"?>

125

Max

Su

18000

18-08-1978

|

+-----+-----------------------------------------------------------------------------------------------------------------------------------+

1 row in set

mysql>

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值