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