处理CLOB数据
在实际开发中,CLOB用于存储大文本数据,但是,对MySQL而言,大文本数据的存储是用TEXT类型表示的。为了大家更好地学习JDBC中CLOB数据的处理方式,接下来,通过一个案例来演示,具体步骤如下:
(1)首先在数据库chapter01中,创建一个数据表testclob,创建表的SQL语句如下所示:
create table testclob(
id int primary key auto_increment,
resume text
);
(2)在工程chapter01中,新建一个类CLOBDemo01,该类实现了向数据库写入大文本数据的功能,CLOBDemo01的具体实现方式如例1所示。
例1 CLOBDemo01.java
1 package cn.itcast.jdbc.example;
2 import java.io.*;
3 import java.sql.Connection;
4 import java.sql.PreparedStatement ;
5 import cn.itcast.jdbc.example.utils.JDBCUtils;
6 public class CLOBDemo01 {
7 public static void main(String[] args) {
8 Connection conn = null;
9 PreparedStatement preStmt = null;
10 try {
11 conn = JDBCUtils.getConnection();
12 String sql = "insert into testclob values(?,?)";
13 preStmt = conn.prepareStatement(sql);
14 File file = new File("D:\\itcast.txt");
15 Reader reader = new InputStreamReader(
16 new FileInputStream(file),"utf-8");
17 preStmt.setInt(1, 1);
18 preStmt.setCharacterStream(2, reader, (int) file.length());
19 preStmt.executeUpdate();
20 } catch (Exception e) {
21 e.printStackTrace();
22 } finally {
23 // 释放资源
24 JDBCUtils.release(null, preStmt, conn);
25 }
26 }
27 }
在例1中,由于文本数据保存在文件中,因此使用FileInputstream读取文件中的数据,然后通过PreparedStatement对象将数据写入到表testclob的resume字段中。
(3)在工程chapter01中,新建一个类CLOBDemo02,该类用于读取表testclob中的数据,CLOBDemo2的具体实现方式如例2所示。
例2 CLOBDemo2.java
1 package cn.itcast.jdbc.example;
2 import java.io.*;
3 import java.sql.Connection;
4 import java.sql.PreparedStatement ;
5 import java.sql.ResultSet;
6 import cn.itcast.jdbc.example.utils.JDBCUtils;
7 public class CLOBDemo02 {
8 public static void main(String[] args) {
9 Connection conn = null;
10 PreparedStatement preStmt = null;
11 ResultSet rs = null;
12 try {
13 conn = JDBCUtils.getConnection();
14 String sql = "select * from testclob";
15 preStmt = conn.prepareStatement(sql);
16 rs = preStmt.executeQuery();
17 if (rs.next()) {
18 Reader reader = rs.getCharacterStream("resume");
19 Writer out = new FileWriter("resume.txt");
20 int temp;
21 while ((temp = reader.read()) != -1) {
22 out.write(temp);
23 }
24 out.close();
25 reader.close();
26 }
27 } catch (Exception e) {
28 e.printStackTrace();
29 } finally {
30 // 释放资源
31 JDBCUtils.release(rs, preStmt , conn);
32 }
33 }
34 }
在例2中,将PreparedStatement对象读取到的数据保存到ResultSet中,然后通过循环的方式不断把内容取出来,写入到resume.txt文件中。程序执行完毕后,会在工程chapter01的根目录下发现resume.txt文件。