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