Java实现图片上传到数据库的两种方法:bytea与大对象特性对比

【java 如何上传图片到数据库】是由【小 s】上传并分享的,此文档有 5 页,能够免费在线阅读。若想了解更多关于【java 如何上传图片到数据库】的内容,可利用淘豆网的站内搜索功能,挑选适合自己的文档。以下是截取该文章内的部分文字,若要获取完整电子版,需将此文档下载到设备中,以便于编辑和打印。《摘抄1》

Java实现图片上传到数据库的两种方法:bytea与大对象特性对比

PostgreSQL 存在两种不同的用以存储二进制数据的方法。二进制数据能够运用二进制数据类型。

bytea 被存储在表中,或者利用大对象特性,此特性会以一种特殊的格式将二进制数据进行存储。

在一个独立的表中,接着通过在你的表中保存一个数值来引用它,这个数值的类型为 oid ,用于指向该表。

你要判断哪种方法比较合适,就必须理解每种方法的局限。bytea 数据类型不适合用来存储。

有非常多的二进制数据。类型为 bytea 的字段能够存储最多 1G 字节的二进制数。

据了解,这样做会需要数量极为庞大的内存去处理如此巨大的数值。存储二进制大对象的方式是……

法更适宜存储极为庞大的数值,不过它也存在自身的局限性。尤其在删除包含大对象引用的那一行时,会……

大对象未被删除。删除大对象是一项需单独执行的操作。大对象存在一些安全性方面的问题。

任何联接到数据库的人都能够查看或者更改大对象,即便他们没有查看或更新包含大对象的相关内容。

象引用的行的权限也一样。

。

引入了一种与以往版本不一样的行为,有方法 getBytes()和 setBytes()。

setBinaryStream()会对 bytea 类型进行操作。

这些方法用于操作与 OID 类型相关联的大对象。我们能够通过在 Connection 上进行 compatible 的设置。

。

要使用 bytea 数据类型,你可以使用 getBytes(),可以使用 setBytes(),可以使用 getBinaryStream(),或者

者setBinaryStream()方法。

要使用大对象的功能,你能够使用 PostgreSQLJDBC 驱动所提供的 LargeObject 类,也可以运用

用getBLOB()和setBLOB()方法。

重要的是,你需要在一次 SQL 事务中访问大对象。你能够通过进行调用的方式来实现。

setAutoCommit(false)打开一个事务。

在未来的 JDBC 驱动里,getBLOB()方法或许不再对大对象进行操作,setBLOB()方法或许也不再对大对象进行操作。

象是用于处理 bytea 数据类型的。所以,倘若你要使用大对象,我们建议你使用 LargeObject。

API。

Example31-8 包含一些例子,这些例子是关于怎样使用 PostgreSQLJDBC 驱动来处理二进制数据的。

Example31-

例如,假定你拥有一个表,此表中包含一幅图像以及它的文件名。并且,你还希望在 bytea 字段中存储该图像。

像∶

创建一个名为 images 的表,其中包含 imgname 列(文本类型)和 imgbytea 列。

要插入一幅图象,你可以:

Filefile=newFile("");

创建一个用于读取文件的 FileInputStream 对象,将指定的文件传递给它,即 fis 被初始化为新的 FileInputStream 对象,其参数为 file 。

PreparedStatement ps 是“INSERT INTO images VALUES(?,?)”;

(1,());

(2,fis,());

();

();

();

这里,setBinaryStream()会将来自一个流的一定数量的字节转换为类型为 bytea 的字段。例如,它能够把流中的字节进行这样的转换操作。

如果图像的内容被放在了 byte[] 里面,那么你能够使用 setBytes() 方法来处理这件事。

检索一幅图象会更容易。在这里,我使用 PreparedStatement 进行检索,当然,使用 Statement 也是可以的。

的):

PreparedStatement ps 是这样的:“SELECT img FROM images WHERE imgname”。

=?");

(1,"");

ResultSetrs=();

if(rs!=null){

while(()){

byte[]imgBytes=(1);

//从这开始使用数据

();

();

这里的二进制数据是以 byte 数组的形式进行检索的。同时,你还可以使用一个输入流。

你或许需要存储一个容量很大的文件,所以希望利用 LargeObject 类来存储这个文件。

创建一个名为 imageslo 的表,该表包含 imgname 字段(文本类型)和 imgOID 字段(oid 类型)。

要插入一个图像,你可以用∶

//所有大对象API调用都必须在一次事务中

(false);

//获取大对象管理器以便进行操作

LargeObjectManagerlobj=

(()conn).getLargeObjectAPI();

//创建一个新的大对象

intoid=(|);

//打开一个大对象进行写

LargeObjectobj=(oid,);

//现在打开文件

Filefile=newFile("");

FileInputStreamfis=newFileInputStream(file);

//从文件拷贝数据到大对象

bytebuf[]=newbyte[2048];

ints,tl=0;

while((s=(buf,0,2048))>0){

(buf,0,s);

tl+=s;

//关闭大对象

();

//现在向imgeslo插入行

(1,());

(2,oid);

();

();

();

从大对象中检索图像∶

//所有LargeObjectAPI调用都必须在一个事务里

(false);

//获取大对象管理器以便进行操作

LargeObjectManagerlobj=

(()conn).getLargeObjectAPI();

PreparedStatement ps 是从 images 表中选择 imgoid,条件是在某个特定的范围内。

imgname=?");

(1,"");

ResultSetrs=();

if(rs!=null){

while(()){

//打开大对象读

intoid=(1);

LargeObjectobj=(oid,);

//读取数据

bytebuf[]=newbyte[()];

(buf,0,());

//在这里对读取的数据做些处理

//关闭对象

();

();

();

PrevHomeNext

创建数据库对象以及更改数据库对象的操作在 PostgreSQL 中是对 JDBC API 的扩展。

《摘抄2》

postgreSQL中怎样建个带图片字段的表啊?

postgreSQL中怎样建个带图片字段的表啊?

是不是这样啊:

createtabletest(

idint4notnull,

namevarchar(10)notnull,

tupianBLOB,

primarykey(id)

);

如不是那应该是怎么建啊?

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读