前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jdbc基础 (三) 大文本、二进制数据处理

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

作者头像
欠扁的小篮子
发布2018-04-11 11:11:17
1.6K0
发布2018-04-11 11:11:17
举报
文章被收录于专栏:技术碎碎念技术碎碎念

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

CLOB:用于存储大文本

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

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

TEXT  分为:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT

BLOB 分为:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

取值范围如下图:

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

代码语言:javascript
复制
 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 }
代码语言:javascript
复制
 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工具类,同时也使用了单元测试来测试两个成员方法,代码已亲测可运行。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-05-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档