JDBC - 流式传输 ASCII 和二进制数据

  • 简述

    PreparedStatement 对象能够使用输入和输出流来提供参数数据。这使您可以将整个文件放入可以保存大值(例如 CLOB 和 BLOB 数据类型)的数据库列中。
    有以下方法,可用于流式传输数据 -
    • setAsciiStream() − 此方法用于提供大的 ASCII 值。
    • setCharacterStream() − 此方法用于提供较大的 UNICODE 值。
    • setBinaryStream() − 此方法用于提供较大的二进制值。
    除了参数占位符之外,setXXXStream() 方法还需要一个额外的参数,即文件大小。此参数通知驱动程序应使用流向数据库发送多少数据。
    此示例将创建一个数据库表 XML_Data,然后将 XML 内容写入该表中。
    将以下示例复制并粘贴到 FirstApplication.java 中,编译并运行如下 -
    
    
    import java.io.ByteArrayInputStream;
    
    import java.io.ByteArrayOutputStream;
    
    import java.io.File;
    
    import java.io.FileInputStream;
    
    import java.io.FileNotFoundException;
    
    import java.io.IOException;
    
    import java.io.InputStream;
    
    import java.sql.Connection;
    
    import java.sql.DriverManager;
    
    import java.sql.PreparedStatement;
    
    import java.sql.ResultSet;
    
    import java.sql.SQLException;
    
    import java.sql.Statement;
    
    
    
    public class TestApplication {
    
       static final String DB_URL = "jdbc:mysql://localhost/TUTORIALSPOINT";
    
       static final String USER = "guest";
    
       static final String PASS = "guest123";
    
       static final String QUERY = "SELECT Data FROM XML_Data WHERE id=100";
    
       static final String INSERT_QUERY="INSERT INTO XML_Data VALUES (?,?)";
    
       static final String CREATE_TABLE_QUERY = "CREATE TABLE XML_Data (id INTEGER, Data LONG)";
    
       static final String DROP_TABLE_QUERY = "DROP TABLE XML_Data";
    
       static final String XML_DATA = "<Employee><id>100</id><first>Alex</first><last>Moo</last><Salary>10000</Salary><Dob>18-08-1978</Dob></Employee>";
    
       
    
       public static void createXMLTable(Statement stmt) 
    
          throws SQLException{
    
          System.out.println("Creating XML_Data table..." );
    
          //Drop table first if it exists.
    
          try{
    
             stmt.executeUpdate(DROP_TABLE_QUERY);
    
          }catch(SQLException se){
    
          }
    
          stmt.executeUpdate(CREATE_TABLE_QUERY);
    
       }
    
    
    
       public static void main(String[] args) {
    
          // Open a connection
    
          try(Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
    
             Statement stmt = conn.createStatement();
    
             PreparedStatement pstmt = conn.prepareStatement(INSERT_QUERY);
    
          ) {            
    
             createXMLTable(stmt);
    
    
    
             ByteArrayInputStream bis = new ByteArrayInputStream(XML_DATA.getBytes());
    
    
    
             pstmt.setInt(1,100);
    
             pstmt.setAsciiStream(2,bis,XML_DATA.getBytes().length);
    
             pstmt.execute();
    
    
    
             //Close input stream
    
             bis.close();
    
    
    
             ResultSet rs = stmt.executeQuery(QUERY);
    
             // 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();
    
    
    
          } catch (SQLException | IOException e) {
    
             e.printStackTrace();
    
          } 
    
       }
    
    }
    
    
    现在让我们编译上面的例子如下 -
    
    
    C:\>javac FirstApplication.java
    
    C:\>
    
    
    当你跑 FirstApplication,它产生以下结果 -
    
    
    C:\>java FirstApplication
    
    Creating XML_Data table...
    
    <Employee><id>100</id><first>Alex</first><last>Moo</last><Salary>10000</Salary><Dob>18-08-1978</Dob></Employee>
    
    C:\>