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

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

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

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

实例

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

  1. <?xml version="1.0"?>
  2. <Employee>
  3. <id>125</id>
  4. <first>Max</first>
  5. <last>Su</last>
  6. <Salary>18000</Salary>
  7. <Dob>18-08-1978</Dob>
  8. <Employee>
XML

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

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

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

  1. // Import required packages
  2. import java.sql.*;
  3. import java.io.*;
  4. import java.util.*;
  5. public class StreamingData {
  6. // JDBC driver name and database URL
  7. static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  8. static final String DB_URL = "jdbc:mysql://localhost/EMP";
  9. // Database credentials
  10. static final String USER = "root";
  11. static final String PASS = "123456";
  12. public static void main(String[] args) {
  13. Connection conn = null;
  14. PreparedStatement pstmt = null;
  15. Statement stmt = null;
  16. ResultSet rs = null;
  17. try{
  18. // Register JDBC driver
  19. Class.forName("com.mysql.jdbc.Driver");
  20. // Open a connection
  21. System.out.println("Connecting to database...");
  22. conn = DriverManager.getConnection(DB_URL,USER,PASS);
  23. //Create a Statement object and build table
  24. stmt = conn.createStatement();
  25. createXMLTable(stmt);
  26. //Open a FileInputStream
  27. File f = new File("xml_data.xml");
  28. long fileLength = f.length();
  29. FileInputStream fis = new FileInputStream(f);
  30. //Create PreparedStatement and stream data
  31. String SQL = "INSERT INTO XML_Data VALUES (?,?)";
  32. pstmt = conn.prepareStatement(SQL);
  33. pstmt.setInt(1,125);
  34. pstmt.setAsciiStream(2,fis,(int)fileLength);
  35. pstmt.execute();
  36. //Close input stream
  37. fis.close();
  38. // Do a query to get the row
  39. SQL = "SELECT Data FROM XML_Data WHERE id=125";
  40. rs = stmt.executeQuery (SQL);
  41. // Get the first row
  42. if (rs.next ()){
  43. //Retrieve data from input stream
  44. InputStream xmlInputStream = rs.getAsciiStream (1);
  45. int c;
  46. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  47. while (( c = xmlInputStream.read ()) != -1)
  48. bos.write(c);
  49. //Print results
  50. System.out.println(bos.toString());
  51. }
  52. // Clean-up environment
  53. rs.close();
  54. stmt.close();
  55. pstmt.close();
  56. conn.close();
  57. }catch(SQLException se){
  58. //Handle errors for JDBC
  59. se.printStackTrace();
  60. }catch(Exception e){
  61. //Handle errors for Class.forName
  62. e.printStackTrace();
  63. }finally{
  64. //finally block used to close resources
  65. try{
  66. if(stmt!=null)
  67. stmt.close();
  68. }catch(SQLException se2){
  69. }// nothing we can do
  70. try{
  71. if(pstmt!=null)
  72. pstmt.close();
  73. }catch(SQLException se2){
  74. }// nothing we can do
  75. try{
  76. if(conn!=null)
  77. conn.close();
  78. }catch(SQLException se){
  79. se.printStackTrace();
  80. }//end finally try
  81. }//end try
  82. System.out.println("Goodbye!");
  83. }//end main
  84. public static void createXMLTable(Statement stmt)
  85. throws SQLException{
  86. System.out.println("Creating XML_Data table..." );
  87. //Create SQL Statement
  88. String streamingDataSql = "CREATE TABLE XML_Data " +
  89. "(id INTEGER, Data LONG)";
  90. //Drop table first if it exists.
  91. try{
  92. stmt.executeUpdate("DROP TABLE XML_Data");
  93. }catch(SQLException se){
  94. }// do nothing
  95. //Build table.
  96. stmt.executeUpdate(streamingDataSql);
  97. }//end createXMLTable
  98. }//end JDBCExample
Java

编译上面代码,如下 -

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

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

  1. F:\worksp\jdbc>java -Djava.ext.dirs=F:\worksp\jdbc\libs StreamingData
  2. Connecting to database...
  3. 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.
  4. Creating XML_Data table...
  5. <?xml version="1.0"?>
  6. <Employee>
  7. <id>125</id>
  8. <first>Max</first>
  9. <last>Su</last>
  10. <Salary>18000</Salary>
  11. <Dob>18-08-1978</Dob>
  12. <Employee>
  13. Goodbye!
  14. F:\worksp\jdbc>
Shell

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

  1. mysql> select * from xml_data;
  2. +-----+-----------------------------------------------------------------------------------------------------------------------------------+
  3. | id | Data |
  4. +-----+-----------------------------------------------------------------------------------------------------------------------------------+
  5. | 125 | <?xml version="1.0"?>
  6. <Employee>
  7. <id>125</id>
  8. <first>Max</first>
  9. <last>Su</last>
  10. <Salary>18000</Salary>
  11. <Dob>18-08-1978</Dob>
  12. <Employee> |
  13. +-----+-----------------------------------------------------------------------------------------------------------------------------------+
  14. 1 row in set
  15. mysql>

JDBC流ASCII和二进制数据的更多相关文章

  1. Mysql中使用JDBC流式查询避免数据量过大导致OOM

    一.前言 java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM. 二.如何使用 2.1 之前查询 public void selectData ...

  2. JDBC存储和读取二进制数据

    以下JSP文件用common-fileupload组件实现文件上传,并将文件以二进制文件的形式存入数据库 <% if("POST".equalsIgnoreCase(requ ...

  3. Node.js之使用Buffer类处理二进制数据

    Node.js之使用Buffer类处理二进制数据 Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区. 1. 创建Buffer对象 1.1 直接创建: ...

  4. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or  url  ...

  5. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url u ...

  6. [19/05/07-星期二] JDBC(Java DataBase Connectivity)_CLOB(存储大量的文本数据)与BLOB(存储大量的二进制数据)

    一. CLOB(Character Large Object ) – 用于存储大量的文本数据 – 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的.而非一般的字段,一次 ...

  7. IO流-文本IO\读写二进制数据

    文本IO 一.简述 OutputStreamWriter类使用选定的编码方式吧Unicode字符流转换为字节流,InputStreamReader类将包含字节的输入流转为可以产生Unicode字符的读 ...

  8. 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据

    [源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...

  9. Java JDBC 操作二进制数据、日期时间

    二进制数据 mysql提供了四种类型来存储二进制数据: TinyBlob    最多可存储255字节 Blob   最多可存储65KB MediumBlob    最多可存储16MB LongBlob ...

随机推荐

  1. Tornado使用-队列Queue

    1.tornado队列的特点 和python标准队列queue相比,tornado的队列Queue支持异步 2.Queue常用方法 Queue.get() 会暂停,直到queue中有元素 Queue. ...

  2. Android 视觉规范

    各种分辨率下图片尺寸 工程师通常开发三套UI布局文件,所以设计师通常也要不同的需求处理2-3套切图. con Type Standard Asset Sizes (in Pixels), for Ge ...

  3. HA&Federation【转】

    转自:http://blog.csdn.net/tutucute0000/article/details/39756123 从nameNode1.namenode2克隆出namenode3.namen ...

  4. Android MediaPlayer接口及状态迁移

    [时间:2016-09] [状态:Open] [关键词:android,mediaplayer,播放接口,播放状态图] 引言 本文内容相对简单,作为后续处理的起点,简要整理了Android Media ...

  5. linux下查看最后登陆的用户的信息

    [root@oracle ~]# last -aroot pts/1 Wed Apr 1 10:35 still logged in 10.3.12.1输入命令last -a 把从何处登入系统的主机名 ...

  6. Python 操作redis 常用方法

    Python 操作redis 1.字符串 #!/usr/bin/env python # -*- coding:utf-8 -*- import redis # python 操作str class ...

  7. 使用spring-rabbit测试RabbitMQ消息确认(发送确认,接收确认)

    1.首先是rabbitmq的配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...

  8. ARKit从入门到精通(7)-ARCamera介绍

    ARCamera是一个相机,它是连接虚拟场景与现实场景之间的枢纽.在ARKit中,它是捕捉现实图像的相机,在SceneKit中它又是3D虚拟世界中的相机.(一般第一人称3D游戏,主角其实就是一个3D相 ...

  9. iOS友盟社会化分享U-Share分享面板不显示的问题(基本配置没有错误)

    //要先是window可视化 [self.window makeKeyAndVisible]; //添加友盟分享[[UMSocialManager defaultManager] openLog:YE ...

  10. pip修改国内源

    Linux在~/.pip/pip.conf文件中添加或修改, windows不存在该目录,在当前用户目录下创建pip.ini(例如 C:\Users\bin\pip\pip.ini): [global ...