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

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)
);
如不是那应该是怎么建啊?