JDBC流ASCII和二进制数据

PreparedStatement对象必须使用输入和输出流提供参数数据的能力。这使能够将整个文件到数据库列,可容纳较大的值,如CLOB和BLOB数据类型。

有下列方法,可用于将数据传送:

  • setAsciiStream(): 这个方法是用来提供大的ASCII值。

  • setCharacterStream(): 这个方法是用来提供大的UNICODE值。

  • setBinaryStream(): 这个方法是用来提供大的二进制值。

setXXXStream()方法需要一个额外的参数,文件大小,除了参数占位符。这个参数通知驱动有多少数据要​​使用的流被发送到数据库中。

例子

考虑到要上传一个XML文件XML_Data.xml到数据库表。下面是这个XML文件的内容:

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

保持这个XML文件在要运行这个例子相同的目录。

这个例子将创建一个数据库表XML_Data,然后提交XML_Data.xml将被上传到该表中。

复制下面的例子JDBCExample.java,编译并运行,如下所示:

// Import required packagesimport 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 mainpublic 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

现在让我们来编译上面的例子如下: