JDBC - Streaming ASCII i dane binarne

Obiekt PreparedStatement ma możliwość używania strumieni wejściowych i wyjściowych do dostarczania danych parametrów. Umożliwia to umieszczanie całych plików w kolumnach bazy danych, które mogą zawierać duże wartości, takie jak typy danych CLOB i BLOB.

Istnieją następujące metody, których można użyć do strumieniowego przesyłania danych -

  • setAsciiStream(): Ta metoda służy do dostarczania dużych wartości ASCII.

  • setCharacterStream(): Ta metoda służy do dostarczania dużych wartości UNICODE.

  • setBinaryStream(): Ta metoda służy do dostarczania dużych wartości binarnych.

Metoda setXXXStream () wymaga dodatkowego parametru, rozmiaru pliku, oprócz symbolu zastępczego parametru. Ten parametr informuje sterownik, ile danych należy przesłać do bazy danych za pomocą strumienia.

Przykład

Rozważmy, że chcemy przesłać plik XML XML_Data.xml do tabeli bazy danych. Oto zawartość tego pliku XML -

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

Zachowaj ten plik XML w tym samym katalogu, w którym zamierzasz uruchomić ten przykład.

W tym przykładzie zostanie utworzona tabela bazy danych XML_Data, a następnie plik XML_Data.xml zostanie przesłany do tej tabeli.

Skopiuj i wklej następujący przykład w JDBCExample.java, skompiluj i uruchom w następujący sposób -

// 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

Teraz skompilujmy powyższy przykład w następujący sposób -

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

Kiedy biegasz JDBCExample, daje następujący wynik -

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:\>