jdbc基础 (三) 大文本、二进制数据处理

LOB (Large Objects)   分为:CLOBBLOB,即大文本和大二进制数据

CLOB:用于存储大文本

BLOB:用于存储二进制数据,例如图像、声音、二进制文件

在mysql中,只有BLOB,没有CLOB,mysql存储大文本用TEXT

 

TEXT  分为:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT

BLOB 分为:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

取值范围如下图:

jdbc基础 (三) 大文本、二进制数据处理

 

下面来看具体的代码实现:

 1 package com.cream.ice.jdbc;

 2 

 3 import java.io.File;

 4 import java.io.FileNotFoundException;

 5 import java.io.FileReader;

 6 import java.io.FileWriter;

 7 import java.io.Reader;

 8 import java.io.Writer;

 9 import java.sql.Connection;

10 import java.sql.PreparedStatement;

11 import java.sql.ResultSet;

12 import java.sql.SQLException;

13 

14 import org.junit.Test;

15 

16 /**

17  * 大文本数据操作

18  * 

19  * 假设数据库中已存在表test: 

20  * create table test(

21  *        id int primary key,

22  *        content longtext

23  * );

24  * 

25  * @author ice

26  *

27  */

28 public class ClobDemo {

29     

30     Connection connection = null;

31     PreparedStatement statement = null;

32     ResultSet resultSet=null;

33     

34     @Test

35     public void add(){

36         try {

37             connection=JdbcUtils.getConnection();

38             statement=connection.prepareStatement("insert into test (id,content) values (?,?)");

39             statement.setInt(1, 1);

40             

41             //大文本要使用流的形式。将d:/test.txt内容添加至该记录的content字段

42             File file = new File("d:/test.txt");

43             Reader reader = new FileReader(file);

44             //不能使用long的参数,因为mysql根本支持不到那么大的数据,所以没有实现

45             statement.setCharacterStream(2, reader, (int)file.length());

46             

47             int i = statement.executeUpdate();

48             if(i>0)

49                 System.out.println("插入成功");

50             

51         } catch (SQLException e) {

52             e.printStackTrace();

53         } catch (FileNotFoundException e) {

54             e.printStackTrace();

55         } finally{

56             JdbcUtils.releaseResources(null, statement, connection);

57         }

58     }

59     

60     @Test

61     public void read(){

62         try {

63             connection = JdbcUtils.getConnection();

64             statement = connection.prepareStatement("select * from test where id=?");

65             statement.setInt(1, 1);

66 

67             //将读取内容保存到E盘上

68             resultSet = statement.executeQuery();

69             while(resultSet.next()){

70                 Reader reader = resultSet.getCharacterStream("content");

71                 Writer writer = new FileWriter("e:/test.txt");

72                 char buffer[] = new char[1024];

73                 int len = -1;

74                 while((len=reader.read(buffer))!=-1){

75                     writer.write(buffer, 0, len);

76                 }

77                 reader.close();

78                 writer.close();

79             }

80         } catch (Exception e) {

81             e.printStackTrace();

82         } finally{

83             JdbcUtils.releaseResources(resultSet, statement, connection);

84         }

85     }

86 }
 1 package com.cream.ice.jdbc;

 2 

 3 import java.io.FileInputStream;

 4 import java.io.FileOutputStream;

 5 import java.io.InputStream;

 6 import java.io.OutputStream;

 7 import java.sql.Connection;

 8 import java.sql.PreparedStatement;

 9 import java.sql.ResultSet;

10 

11 import org.junit.Test;

12 

13 /**

14  * 大二进制数据操作

15  * 

16  * 假设数据库中已存在表test: 

17  * create table test(

18  *        id int primary key,

19  *        content longblob

20  * );

21  * 

22  * @author ice

23  *

24  */

25 public class BlobDemo {

26     Connection connection = null;

27     PreparedStatement statement = null;

28     ResultSet resultSet=null;

29     

30     @Test

31     public void add(){

32         try {

33             connection=JdbcUtils.getConnection();

34             statement=connection.prepareStatement("insert into test (id,content) values (?,?)");

35             statement.setInt(1, 1);

36             

37             InputStream in = new FileInputStream("d:/test.jpg");

38             statement.setBinaryStream(2, in, in.available());

39             

40             int i = statement.executeUpdate();

41             if(i>0)

42                 System.out.println("插入成功");

43             

44         } catch (Exception e) {

45             e.printStackTrace();

46         } finally{

47             JdbcUtils.releaseResources(null, statement, connection);

48         }

49     }

50     

51     @Test

52     public void read(){

53         try {

54             connection = JdbcUtils.getConnection();

55             statement = connection.prepareStatement("select * from test where id=?");

56             statement.setInt(1, 1);

57 

58             //保存到E盘上

59             resultSet = statement.executeQuery();

60             while(resultSet.next()){

61                 InputStream in = resultSet.getBinaryStream("content");

62                 OutputStream out = new FileOutputStream("e:/test.jpg");

63                 byte b[] = new byte[1024];

64                 int len = -1;

65                 while((len=in.read(b))!=-1){

66                     out.write(b, 0, len);

67                 }

68                 out.close();

69                 in.close();

70             }

71         } catch (Exception e) {

72             e.printStackTrace();

73         } finally{

74             JdbcUtils.releaseResources(resultSet, statement, connection);

75         }

76     }

77 }

 

这里使用了我上一篇jdbc基础中的JdbcUtils工具类,同时也使用了单元测试来测试两个成员方法,代码已亲测可运行。

 

csdn博文地址:jdbc基础 (三)  大文本、二进制数据处理

你可能感兴趣的:(jdbc)