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

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

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

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

  • TINYTEXT: CLOB类型,最多28-1(255)个字符。

  • 文本: 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:创建一个准备好的语句

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

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

步骤3:为占位符设置值

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

如果它是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

getClob()ResultSet接口的方法接受代表列索引的整数(或代表列名称的String值),并检索指定列的值,并以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()方法,可以使用FileOutputStream对象的write()方法将Clob的内容作为Reader对象获取,并使用检索到的内容创建文本文件。

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 {
      //注册驱动程序
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      //获得连接
      String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //创建表
      Statement stmt = con.createStatement();
      stmt.execute("CREATE TABLE Technologies( Name VARCHAR(255), Type VARCHAR(255), Article LONGTEXT)");
      System.out.println("Table Created......");

      //插入值
      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();
      //检索数据
      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