JDBC - Truyền dữ liệu ASCII và Binary

Đối tượng PreparedStatement có khả năng sử dụng các luồng đầu vào và đầu ra để cung cấp dữ liệu tham số. Điều này cho phép bạn đặt toàn bộ tệp vào các cột cơ sở dữ liệu có thể chứa các giá trị lớn, chẳng hạn như kiểu dữ liệu CLOB và BLOB.

Có các phương pháp sau, có thể được sử dụng để truyền dữ liệu:

  • setAsciiStream(): Phương pháp này được sử dụng để cung cấp các giá trị ASCII lớn.

  • setCharacterStream(): Phương pháp này được sử dụng để cung cấp các giá trị UNICODE lớn.

  • setBinaryStream(): Phương pháp này được sử dụng để cung cấp các giá trị nhị phân lớn.

Phương thức setXXXStream () yêu cầu một tham số bổ sung, kích thước tệp, bên cạnh trình giữ chỗ tham số. Tham số này thông báo cho trình điều khiển bao nhiêu dữ liệu sẽ được gửi đến cơ sở dữ liệu bằng cách sử dụng luồng.

Thí dụ

Hãy xem xét chúng tôi muốn tải lên tệp XML XML_Data.xml vào một bảng cơ sở dữ liệu. Đây là nội dung của tệp XML này -

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

Giữ tệp XML này trong cùng một thư mục mà bạn sẽ chạy ví dụ này.

Ví dụ này sẽ tạo một bảng cơ sở dữ liệu XML_Data và sau đó tệp XML_Data.xml sẽ được tải lên bảng này.

Sao chép và dán ví dụ sau vào JDBCExample.java, biên dịch và chạy như sau:

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

Bây giờ chúng ta hãy biên dịch ví dụ trên như sau:

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

Khi bạn chạy JDBCExample, nó tạo ra kết quả sau:

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