CLOB (Character Large Object) là kiểu dữ liệu SQL built-in lưu lượng lớn dữ liệu văn bản. Cho phép lưu tới 2,147,483,647 ký tự.
Interface java.sql.Clob của JDBC API đại diện cho kiểu CLOB. Vì Clob object trong JDBC dùng SQL locator, nó giữ con trỏ logic đến SQL CLOB (không phải dữ liệu).
MySQL hỗ trợ kiểu này bằng bốn biến thể:
TINYTEXT: CLOB tối đa 255 ký tự (2^8-1).
TEXT: CLOB tối đa 65535 ký tự (2^16-1).
MEDIUMTEXT: CLOB tối đa 16,777,215 ký tự (2^24-1).
LONGTEXT: CLOB tối đa 4,294,967,295 ký tự (2^32-1).
Lưu Clob datatype vào bảng database
Các bước lưu Clob dùng JDBC:
Bước 1: Kết nối database
Dùng getConnection() của DriverManager. Kết nối MySQL URL jdbc:mysql://localhost/sampleDB, username, password:
String mysqlUrl = "jdbc:mysql://localhost/sampleDB"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
Bước 2: Tạo PreparedStatement
Tạo PreparedStatement bằng prepareStatement() của Connection. Truyền câu insert có placeholder:
PreparedStatement pstmt = con.prepareStatement("INSERT INTO Technologies(Name, Type, Article ) VALUES (?, ?, ?)");
Bước 3: Thiết lập giá trị cho placeholder
Dùng setter methods của PreparedStatement. Với Clob dùng setCharacterStream() hoặc setClob(). Truyền chỉ số tham số và Reader object:
pstmt.setString(1, "JavaFX");
pstmt.setString(2, "Java Library");
FileReader reader = new FileReader("E:\\images\\javafx.txt");
pstmt.setClob(3, reader);
pstmt.execute();
Bước 4: Thực thi statement
Thực thi PreparedStatement bằng execute() của PreparedStatement.
Truy xuất blob từ database
Phương thức getClob() của ResultSet nhận chỉ số cột hoặc tên cột, trả về Clob object.
while(rs.next()) {
System.out.println(rs.getString("Name"));
System.out.println(rs.getString("Type"));
Clob clob = rs.getClob("Article");
}
Phương thức getCharacterStream() của interface Clob lấy nội dung Clob object hiện tại trả về Reader object.
Dùng getClob() lấy nội dung Clob làm Reader object, tạo file text với nội dung truy xuất, dùng write() của FileOutputStream:
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());
Ví dụ
Ví dụ tạo bảng MySQL có Clob, chèn text lớn từ file, truy xuất lại lưu vào file text khác:
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 {
// Đăng ký Driver
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// Lấy kết nối
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Kết nối thành công......");
// Tạo bảng
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE Technologies( Name VARCHAR(255), Type VARCHAR(255), Article LONGTEXT)");
System.out.println("Bảng đã tạo......");
// Chèn giá trị
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();
// Truy xuất dữ liệu
ResultSet rs = stmt.executeQuery("select * from Technologies");
int j = 0;
System.out.println("Nội dung bảng:");
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++;
}
}
}
Kết quả
Kết nối thành công...... Bảng đã tạo...... Nội dung bảng: JavaFX Java Library E:\images\clob_output1.txt CoffeeScript Scripting Language E:\images\clob_output2.txt Cassandra NoSQL Database E:\images\clob_output3.txt