什么是 JDBC Clob 数据类型?如何存储和读取数据?

jdbcjava 8mysqlmysqli database

CLOB 通常代表字符大对象,SQL Clob 是一种内置数据类型,用于存储大量文本数据。使用此数据类型,您可以存储最多 2,147,483,647 个字符的数据。

JDBC API 的 java.sql.Clob 接口代表 CLOB 数据类型。由于 JDBC 中的 Clob 对象是使用 SQL 定位器实现的,因此它保存指向 SQL CLOB(而不是数据)的逻辑指针。

MYSQL 数据库使用四个变量为该数据类型提供支持。

  • TINYTEXT: CLOB 类型,最大长度为 28-1 (255) 个字符。

  • TEXT: CLOB 类型,最大长度为 216-1 (65535) 个字符。

  • MEDIUMTEXT: CLOB 类型,最大长度为 224-1 (16777215) 个字符。

  • LONGTEXT: CLOB 类型,最大长度为 232-1 (4294967295)字符。

将 Clob 数据类型存储到 数据库的表中

要将 Clob 数据类型存储到数据库,请使用 JDBC 程序按照以下步骤操作

步骤 1:连接到数据库

您可以使用 DriverManager 类的 getConnection() 方法连接到数据库。

通过将 MySQL URL 即 jdbc:mysql://localhost/sampleDB(其中 sampleDB 是数据库名称)、用户名和密码作为参数传递给 getConnection() 方法,连接到 MySQL 数据库。

String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");

步骤 2:创建 Prepared 语句

使用 Connection 接口的 prepareStatement() 方法创建 PreparedStatement 对象。将插入查询(带占位符)作为参数传递给此方法。

PreparedStatement pstmt = con.prepareStatement("INSERT INTO Technologies(Name,
Type, Article ) VALUES (?, ?, ?)");

步骤 3:将值设置为占位符

使用 PreparedStatement 接口的 setter 方法将值设置为占位符。根据列的数据类型选择方法。例如,如果列是 VARCHAR 类型,则使用 setString() 方法;如果是 INT 类型,则可以使用 setInt() 方法。

如果是 Clob 类型,则可以使用 setCharacterStream() 或 setClob() 方法为其设置值。向这些方法传递一个表示参数索引的整数变量和一个 Reader 类的对象作为参数。

pstmt.setString(1, "JavaFX");
pstmt.setString(2, "Java Library");
FileReader reader = new FileReader("E:\images\javafx.txt");
pstmt.setClob(3, reader);
pstmt.execute();

步骤 4:执行语句

使用 PreparedStatement 接口的 execute() 方法执行上面创建的 PreparedStatement 对象。

从数据库检索 blob

ResultSet 接口的 getClob() 方法接受表示列索引的整数(或表示列名称的字符串值),并检索指定列的值并以 Clob 对象的形式返回。

while(rs.next()) {
   System.out.println(rs.getString("Name"));
   System.out.println(rs.getString("Type"));
   Clob clob = rs.getClob("Article");
}

Clob 接口的 getCharacterStream() 方法检索当前 Clob 对象的内容并返回 Reader 对象。

使用 getClob() 方法,您可以将 Clob 的内容作为 Reader 对象获取,并使用 FileOutputStream 对象的 write() 方法使用检索到的内容创建文本文件。

Reader r = clob.getCharacterStream();
char cbuf[] = new char[r.read()];
r.read(cbuf);
FileOutputStream outPutStream = new
FileOutputStream("E:\images\clob_output"+i+".txt");
outPutStream.write(cbuf.toString().getBytes());

示例

以下示例在 MySQL 数据库中创建一个包含 Clob 数据类型的表。将文件中的大型文本数据插入其中。检索文本并将其存储在另一个文本文件中。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class ClobExample {
   public static void main(String args[]) throws Exception {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      //Getting the connection
      String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Creating a table
      Statement stmt = con.createStatement();
      stmt.execute("CREATE TABLE Technologies( Name VARCHAR(255), Type VARCHAR(255), Article LONGTEXT)");
      System.out.println("Table Created......");

      //Inserting values
      String query = "INSERT INTO Technologies(Name, Type, Article ) VALUES (?, ?, ?)";
      PreparedStatement pstmt = con.prepareStatement(query);
      pstmt.setString(1, "JavaFX");
      pstmt.setString(2, "Java Library");
      FileReader reader = new FileReader("E:\images\javafx.txt");
      pstmt.setClob(3, reader);
      pstmt.execute();
      pstmt.setString(1, "CoffeeScript");
      pstmt.setString(2, "Scripting Language");
      reader = new FileReader("E:\images\coffeescript.txt");
      pstmt.setClob(3, reader);
      pstmt.execute();
      pstmt.setString(1, "Cassandra");
      pstmt.setString(2, "NoSQL Database");
      reader = new FileReader("E:\images\cassandra.txt");
      pstmt.setClob(3, reader);
      pstmt.execute();
      //Retrieving the data
      ResultSet rs = stmt.executeQuery("select * from Technologies");
      int j = 0;
      System.out.println("Contents of the table are: ");
      while(rs.next()) {
         System.out.println(rs.getString("Name"));
         Clob clob = rs.getClob("Article");
         Reader r = clob.getCharacterStream();
         String filePath = "E:\Data\clob_output"+j+".txt";
         FileWriter writer = new FileWriter(filePath);
         int i;
         while ((i=r.read())!=-1) {
            writer.write(i);
         }
         writer.close();
         System.out.println(filePath);
         j++;
      }
   }
}

输出

Connection established......
Table Created......
Contents of the table are:
JavaFX
Java Library
E:\images\clob_output1.txt
CoffeeScript
Scripting Language
E:\images\clob_output2.txt
Cassandra
NoSQL Database
E:\images\clob_output3.txt

相关文章