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 java.sql.*; import java.io.*; import java.util.*; public class JDBCExample { // JDBC驱动程序名称和数据库URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // 数据库凭证 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{ // 注册JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 打开连接 System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //创建一个Statement对象并构建表 stmt = conn.createStatement(); createXMLTable(stmt); //打开一个FileInputStream File f = new File("XML_Data.xml"); long fileLength = f.length(); FileInputStream fis = new FileInputStream(f); //创建PreparedStatement并流式传输数据 String SQL = "INSERT INTO XML_Data VALUES (?,?)"; pstmt = conn.prepareStatement(SQL); pstmt.setInt(1,100); pstmt.setAsciiStream(2,fis,(int)fileLength); pstmt.execute(); //关闭输入流 fis.close(); // 进行查询以获取行 SQL = "SELECT Data FROM XML_Data WHERE id=100"; rs =stmt.executeQuery(SQL); // 获取第一行 if (rs.next ()){ //从输入流中检索数据 InputStream xmlInputStream =rs.getAsciiStream(1); int c; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while (( c =xmlInputStream.read()) != -1) bos.write(c); //打印结果 System.out.println(bos.toString()); } // 清理环境 rs.close(); stmt.close(); pstmt.close(); conn.close(); }catch(SQLException se){ //处理JDBC错误 se.printStackTrace(); }catch(Exception e){ //处理Class.forName的错误 e.printStackTrace(); }finally{ //用于关闭资源 try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// 我们无能为力 try{ if(pstmt!=null) pstmt.close(); }catch(SQLException se2){ }// 我们无能为力 try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } }//结束try System.out.println("Goodbye!"); }//结束main public static void createXMLTable(Statement stmt) throws SQLException{ System.out.println("Creating XML_Data table..." ); //创建SQL语句 String streamingDataSql = "CREATE TABLE XML_Data " + "(id INTEGER, Data LONG)"; //如果存在,请首先删除表。 try{ stmt.executeUpdate("DROP TABLE XML_Data"); }catch(SQLException se){ }// 没做什么 //建立表。 stmt.executeUpdate(streamingDataSql); }//结束createXMLTable }//结束JDBCExample
现在让我们编译上面的示例,如下所示:
C:\>javac JDBCExample.java C:\>
运行时JDBCExample,它将产生以下结果-
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:\>