JDBC ASCII和二进制数据流

PreparedStatement 对象能够使用输入和输出流提供参数数据。这使您能够将整个文件放置到可以保存大值(如 CLOB 和 BLOB 数据类型)的数据库列中。

有以下方法,可用于流数据-

  • setAsciiStream(): 此方法用于提供较大的ASCII值。

  • setCharacterStream(): 此方法用于提供较大的UNICODE值。

  • setBinaryStream(): 此方法用于提供较大的二进制值。

setXXXStream ()方法除了参数占位符之外,还需要一个额外的参数,即文件大小。此参数告知驱动程序应该使用流向数据库发送多少数据。

在线示例

例如我们想将XML文件XML_Data.xml上载到数据库表中。这是此XML文件的内容-

<?xmlversion="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中,如下编译并运行:

//导入所需的软件包importjava.sql.*;importjava.io.*;importjava.util.*;publicclassJDBCExample{//JDBC驱动程序名称和数据库URLstaticfinalStringJDBC_DRIVER="com.mysql.jdbc.Driver";staticfinalStringDB_URL="jdbc:mysql://localhost/EMP";//数据库凭证staticfinalStringUSER="username";staticfinalStringPASS="password";publicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementpstmt=null;Statementstmt=null;ResultSetrs=null;try{//注册JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");//打开连接System.out.println("Connectingtodatabase...");conn=DriverManager.getConnection(DB_URL,USER,PASS);//创建一个Statement对象并构建表stmt=conn.createStatement();createXMLTable(stmt);//打开一个FileInputStreamFilef=newFile("XML_Data.xml");longfileLength=f.length();FileInputStreamfis=newFileInputStream(f);//创建PreparedStatement并流式传输数据StringSQL="INSERTINTOXML_DataVALUES(?,?)";pstmt=conn.prepareStatement(SQL);pstmt.setInt(1,100);pstmt.setAsciiStream(2,fis,(int)fileLength);pstmt.execute();//关闭输入流fis.close();//进行查询以获取行SQL="SELECTDataFROMXML_DataWHEREid=100";rs=stmt.executeQuery(SQL);//获取第一行if(rs.next()){//从输入流中检索数据InputStreamxmlInputStream=rs.getAsciiStream(1);intc;ByteArrayOutputStreambos=newByteArrayOutputStream();while((c=xmlInputStream.read())!=-1)bos.write(c);//打印结果System.out.println(bos.toString());}//清理环境rs.close();stmt.close();pstmt.close();conn.close();}catch(SQLExceptionse){//处理JDBC错误se.printStackTrace();}catch(Exceptione){//处理Class.forName的错误e.printStackTrace();}finally{//用于关闭资源try{if(stmt!=null)stmt.close();}catch(SQLExceptionse2){}//我们无能为力try{if(pstmt!=null)pstmt.close();}catch(SQLExceptionse2){}//我们无能为力try{if(conn!=null)conn.close();}catch(SQLExceptionse){se.printStackTrace();}}//结束trySystem.out.println("Goodbye!");}//结束mainpublicstaticvoidcreateXMLTable(Statementstmt)throwsSQLException{System.out.println("CreatingXML_Datatable...");//创建SQL语句StringstreamingDataSql="CREATETABLEXML_Data"+"(idINTEGER,DataLONG)";//如果存在,请首先删除表。try{stmt.executeUpdate("DROPTABLEXML_Data");}catch(SQLExceptionse){}//没做什么//建立表。stmt.executeUpdate(streamingDataSql);}//结束createXMLTable}//结束JDBCExample

现在让我们编译上面的示例,如下所示:

C:\>javacJDBCExample.javaC:\>

运行时JDBCExample,它将产生以下结果-

C:\>javaJDBCExampleConnectingtodatabase...CreatingXML_Datatable...<?xmlversion="1.0"?><Employee><id>100</id><first>Zara</first><last>Ali</last><Salary>10000</Salary><Dob>18-08-1978</Dob><Employee>Goodbye!C:\>
编辑于2024-05-20 14:34