首页 > 其他分享 >JDBC流ASCII和二进制数据

JDBC流ASCII和二进制数据

时间:2024-09-08 09:22:19浏览次数:13  
标签:xml XML JDBC 二进制 Data stmt data close ASCII

PreparedStatement对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如CLOBBLOB数据类型。

有以下方法可用于流式传输数据 -

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

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

实例

考虑要将XML文件xml_data.xml上传到数据库表中。下面是XML文件的内容 -

<?xml version="1.0"?>
<Employee>
    <id>125</id>
    <first>Max</first>
    <last>Su</last>
    <Salary>18000</Salary>
    <Dob>18-08-1978</Dob>
<Employee>

XML

将此XML文件保存在要运行此示例的同一目录中。

此示例将在数据库创建一个表:xml_data,然后将文件xml_data.xml上传到此表中。

复制以下示例代码,并保存在文件:StreamingData.java 中,编译并运行如下 -

// Import required packages
import java.sql.*;
import java.io.*;
import java.util.*;

public class StreamingData {
   // 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 = "root";
   static final String PASS = "123456";

   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,125);
      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=125";
      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

Java

编译上面代码,如下 -

F:\worksp\jdbc>javac -Djava.ext.dirs=F:\worksp\jdbc\libs StreamingData.java

Shell

执行上面编译后的代码,得到以下结果 -

F:\worksp\jdbc>java -Djava.ext.dirs=F:\worksp\jdbc\libs StreamingData
Connecting to database...
Thu Jun 01 21:42:00 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Creating XML_Data table...
<?xml version="1.0"?>
<Employee>
        <id>125</id>
        <first>Max</first>
        <last>Su</last>
        <Salary>18000</Salary>
        <Dob>18-08-1978</Dob>
<Employee>
Goodbye!

F:\worksp\jdbc>

Shell

在执行上面语句后,将在数据库:emp下创建一个名称为:xml_data的表,现在查询xml_data表中的数据,如下所示 -

mysql> select * from xml_data;
+-----+-----------------------------------------------------------------------------------------------------------------------------------+
| id  | Data                                                                                                                              |
+-----+-----------------------------------------------------------------------------------------------------------------------------------+
| 125 | <?xml version="1.0"?>
<Employee>
    <id>125</id>
    <first>Max</first>
    <last>Su</last>
    <Salary>18000</Salary>
    <Dob>18-08-1978</Dob>
<Employee> |
+-----+-----------------------------------------------------------------------------------------------------------------------------------+
1 row in set

mysql>

标签:xml,XML,JDBC,二进制,Data,stmt,data,close,ASCII
From: https://blog.csdn.net/unbelievevc/article/details/141804131

相关文章

  • JDBC,SQL注入,事务,C3P0与Druid连接池(最详细解析)bh
    JDBCJDBC(JavaDataBaseConnectivty,Java数据库连接)API,是一种用于执行Sql语句的JavaAPI,可以为关系型数据库提供统一的访问,其由一组Java编写的类和接口组成.JDBC驱动程序起初,SUN公司推出JDBCAPI希望能适用于所有数据库,但实际中是不可能实现的,各个厂商提供的数据库......
  • 67. 二进制求和
    67.二进制求和给你两个二进制字符串a和b,以二进制字符串的形式返回它们的和。示例1:输入:a=“11”,b=“1”输出:“100”示例2:输入:a=“1010”,b=“1011”输出:“10101”提示:1<=a.length,b.length<=104a和b仅由字符‘0’或‘1’组成字符......
  • 【YashanDB知识库】修改字段长度后,jdbc驱动接口报YAS-04007 Message:result set metada
    问题现象yashandb修改表的字段长度后,客户的业务接口报YAS-04007异常,截图如下:问题的风险及影响客户的业务在访问yashandb时异常出错,影响使用问题影响的版本所有的yashandb版本问题发生原因使用jdbc接口获取PreparedStatement以后,修改表的字段长度,再用前面获取的PreparedStatement继......
  • postgresql java jdbc 负载均衡解决方案
    在PostgreSQL和JavaJDBC的环境中实现负载均衡,可以有效提升数据库性能和可用性。以下是一个基于PostgreSQL和JavaJDBC的负载均衡解决方案,包括主从复制、连接池、以及负载均衡器的集成。1.PostgreSQL主从复制PostgreSQL的主从复制是实现读写分离的重要前提。主节点(Ma......
  • 细致刨析JDBC ① 基础篇
    “加油”我已经说腻了,下次我要说:”祝你拥有随时停留和休息的底气“                                                                                               ......
  • 【C++编程题】格雷码与自然二进制码转换
        格雷码是数字信号处理中常用编码方式。格雷码中任意两个相邻代码的二进制位中只有一位不同,对于最大编码和最小编码也成立。1.异或法转换1.1二进制码转格雷码二进制码转格雷码[1]1)将二进制最高位保留;2)对于二进制码中剩余的任意第i位,将其与......
  • Monocle:一款基于LLM的二进制文件自然语言搜索工具
    关于MonocleMonocle是一款基于LLM的二进制文件自然语言搜索工具,该工具由LLM驱动,用于对已编译的目标二进制文件执行自然语言搜索,并查找加密代码、密码字符串和安全缺陷漏等。功能介绍Monocle是一款由大型语言模型支持的工具,用于对已编译的目标二进制文件执行自然语言搜索......
  • 信息学奥赛初赛天天练-82-NOIP2014普及组-完善程序-机器语言、汇编语言、高级语言、计
    1NOIP2014普及组基础题11以下哪个是面向对象的高级语言()A汇编语言BC++CFortranDBasic2TB代表的字节数是()A2的10次方B2的20次方C2的30次方D2的40次方3二进制数00100100和00010101的和是()A00101000B001010......
  • 二进制基础和STM32的常用位运算
    目录一、引言二、二进制基础1.二进制的表示2.二进制的优势 3.二进制与十进制的转换三、位运算基础1.按位与(&)2.按位或(|)3.按位异或(^)4.按位取反(~)5.左移(<<)6.右移(>>)四、STM32的常用位运算1.清0操作2.置1操作五、实际应用场景六、注意事项一、引言   ......
  • ShardingSphere-JDBC实现数据加解密
    一、什么是ShardingSphere?        ShardingSphere定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。ApacheShardingSphere旨......