JDBC - Streaming von ASCII- und Binärdaten

Ein PreparedStatement-Objekt kann Eingabe- und Ausgabestreams verwenden, um Parameterdaten bereitzustellen. Auf diese Weise können Sie ganze Dateien in Datenbankspalten einfügen, die große Werte enthalten können, z. B. CLOB- und BLOB-Datentypen.

Es gibt folgende Methoden, mit denen Daten gestreamt werden können:

  • setAsciiStream(): Diese Methode wird verwendet, um große ASCII-Werte bereitzustellen.

  • setCharacterStream(): Diese Methode wird verwendet, um große UNICODE-Werte bereitzustellen.

  • setBinaryStream(): Diese Methode wird verwendet, um große Binärwerte bereitzustellen.

Die Methode setXXXStream () erfordert neben dem Parameterplatzhalter einen zusätzlichen Parameter, die Dateigröße. Dieser Parameter informiert den Treiber darüber, wie viele Daten mithilfe des Streams an die Datenbank gesendet werden sollen.

Beispiel

Angenommen, wir möchten eine XML-Datei XML_Data.xml in eine Datenbanktabelle hochladen. Hier ist der Inhalt dieser XML-Datei -

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

Bewahren Sie diese XML-Datei in demselben Verzeichnis auf, in dem Sie dieses Beispiel ausführen möchten.

In diesem Beispiel wird eine Datenbanktabelle XML_Data erstellt und anschließend die Datei XML_Data.xml in diese Tabelle hochgeladen.

Kopieren Sie das folgende Beispiel in JDBCExample.java, fügen Sie es wie folgt ein, kompilieren Sie es und führen Sie es wie folgt aus:

// 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/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   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

Lassen Sie uns nun das obige Beispiel wie folgt zusammenstellen:

C:\>javac JDBCExample.java
C:\>

Wenn du rennst JDBCExampleerzeugt es das folgende Ergebnis -

C:\>java JDBCExample
Connecting to database...
Creating XML_Data table...
<?xml version="1.0"?>
<Employee>
<id>100</id>
<first>Zara</first>
<last>Ali</last>
<Salary>10000</Salary>
<Dob>18-08-1978</Dob>
<Employee>
Goodbye!
C:\>