如何将对象持久化到数据库中BLOB

如何将对象持久化到数据库中BLOB,第1张

对象持久化,也就是可以把这个对象永远的保存起来,这里的保存不仅是对象本身,还包括他的属性和所依赖的其他类。通常,对象可以持久化到文件或者是数据库中。我这里只介绍如何将对象存储到数据库中。恰巧Oracle数据库为我们提供了这样的方便。

在Oracle中,有一种blog的字段类型,它是用来存储大量的二进制数据的。我们就利用这个字段去存储对象信息。

首先建立一个测试表:

create table TESTBLOB

(

NAME VARCHAR2(50) not null,

CONTENT BLOB not null,

ID NUMBER(8) not null

)alter table TESTBLOB

add constraint IDFORTEST primary key (ID);

只用三个字段,其中id是属性,content是我们要存储对象的字段。

先来看看我们要存入的对象:

import javaioSerializable;

import javautilDate;

import javautilList;

public class TestObject implements Serializable {

private static final long serialVersionUID = 4558876142427402513L;

/

@param args

/

private String name;

private String password;

private Date date;

private List<City> cityList;

public List<City> getCityList() {

return cityList;

}

public void setCityList(List<City> cityList) {

thiscityList = cityList;

}

public Date getDate() {

return date;

}

public void setDate(Date date) {

thisdate = date;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

thispassword = password;

}

}

记得要实现Serializable接口,可以看到这是一个包含了string,date,和list类型的对象,为了给测试增加复杂度,我们的list是另外一个对象(city)的list,如下:

import javaioSerializable;

public class City implements Serializable{

private static final long serialVersionUID = 4558876127402513L;

private String name;

private String code;

public String getCode() {

return code;

}

public void setCode(String code) {

thiscode = code;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

}

City对象包括了城市名称和区号。下面是主要的应用了。

import javaioBufferedInputStream;

import javaioByteArrayInputStream;

import javaioByteArrayOutputStream;

import javaioInputStream;

import javaioObjectInputStream;

import javaioObjectOutputStream;

import javaioOutputStream;

import javasqlConnection;

import javasqlDriverManager;

import javasqlResultSet;

import javasqlStatement;

import javautilArrayList;

import javautilDate;

import javautilList;

import oraclesqlBLOB;

public class Test {

public static void main(String[] args) {

//创建测试用对象

City beijing = new City();

beijingsetName("北京");

beijingsetCode("010");

City shanghai = new City();

shanghaisetName("上海");

shanghaisetCode("020");

City tianjin = new City();

tianjinsetName("天津");

tianjinsetCode("021");

List<City> cityList = new ArrayList<City>();

cityListadd(beijing);

cityListadd(shanghai);

cityListadd(tianjin);

TestObject obj = new TestObject();

objsetName("yangsq");

objsetPassword("111");

objsetDate(new Date());

objsetCityList(cityList);

try{

//将对象存入blob字段

ByteArrayOutputStream byteOut=new ByteArrayOutputStream();

ObjectOutputStream outObj=new ObjectOutputStream(byteOut);

outObjwriteObject(obj) ;

final byte[] objbytes=byteOuttoByteArray();

ClassforName("oraclejdbcdriverOracleDriver");

Connection con = DriverManagergetConnection(

"jdbc:oracle:thin:@:1521:", "yangsq", "yangsq");

consetAutoCommit(false);

Statement st = concreateStatement();

stexecuteUpdate("insert into TESTBLOB (ID, NAME, CONTENT) values (1, 'test1', empty_blob())");

ResultSet rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1 for update");

if (rsnext()) {

BLOB blob = (BLOB) rsgetBlob("CONTENT");

OutputStream outStream = blobgetBinaryOutputStream();

outStreamwrite(objbytes, 0, objbyteslength);

outStreamflush();

outStreamclose();

}

byteOutclose();

outObjclose();

concommit();

//取出blob字段中的对象,并恢复

rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1");

BLOB inblob = null;

if (rsnext()) {

inblob = (BLOB) rsgetBlob("CONTENT");

}

InputStream is = inblobgetBinaryStream();

BufferedInputStream input = new BufferedInputStream(is);

byte[] buff = new byte[inblobgetBufferSize()];

while(-1 != (inputread(buff, 0, bufflength)));

ObjectInputStream in =

new ObjectInputStream(

new ByteArrayInputStream(

buff));

TestObject w3 = (TestObject)inreadObject();

Systemoutprintln(w3getName());

Systemoutprintln(w3getPassword());

Systemoutprintln(w3getDate());

List<City> list = w3getCityList();

for(City city : list){

Systemoutprintln(citygetName() + " " + citygetCode());

}

stclose();

conclose();

} catch (Exception ex) {

exprintStackTrace();

Systemexit(1);

}

}

}

代码的蓝色部分创建了要存储的对象。再看红色的对象写入部分,它首先把对象转化成二进制流的形式。对于blob字段,我们不能简单的在insert时插入,实际上,insert时,对于blob字段,只能先插入一个空的blob对象empty_blob(),然后再进行"select CONTENT from TESTBLOB where ID=1 for update"对blob字段进行更新。返回后,我们只要把对象的二进制流写入即可。

OutputStream outStream = blobgetBinaryOutputStream();

outStreamwrite(objbytes, 0, objbyteslength);

需要注意的是,上述步骤必须设置consetAutoCommit(false),否则oracle会抛出异常。

接下来,绿色的代码是读取数据库中blob字段的对象,并恢复。我们要知道的是,所有对blob字段的 *** 作都是二进制的,即插入时是二进制流,读出时也是二进制流。然后用io修饰器(ObjectInputStream)去修饰。以前学习java时,感觉它的io好繁琐啊,现在感觉还真是各有其用。下面是测试的输出结果。

yangsq

111

Tue Mar 27 12:11:28 CST 2007

北京 010

上海 020

天津 021

需要说明一下,buff的size一定要足够大,否则将抛出异常。在这里,我使用的是inblobgetBufferSize()来设置buff的size,这并不是一种好的方法,因为一般inblobgetBufferSize()都是32768,很可能出现异常,所以这个size最好自己设置,或系统运行时刻设置(幸好java提供数组长度的运行时刻设置)。

我大概明白了,估计是这个意思,就是客户给你一个URL,这个URL指定一个资源,有可能是或者视频,需要把这个资源以BLOB的方式存进数据库里面。

其实这应该是两个步骤,先或者这个资源的>

问题一:sql怎么建立索引 CREATE INDEX

为给定表或视图创建索引。

只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。

语法

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON { table | view } ( column [ ASC | DESC ] [ ,n ] )

[ WITH [ ,n] ]

[ ON filegroup ]

::=

{ PAD_INDEX |

FILLFACTOR = fillfactor |

IGNORE_DUP_KEY |

DROP_EXISTING |

STATISTICS_NOREPUTE |

SORT_IN_TEMPDB

}

--这是基本语法,建立索引,只针对查询和一些更新和删除的速度,像性别一列,如果表里面有1000行,如果只有1行是男,这样用索引的话肯定高,如果有990行是男,那么它不如直接扫描了,这是选择性

问题二:oracle 数据库如何建立索引 如何用索引 5分 方法如下:

Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名);

例如:

create index index_userid on tbl_detail(userid);

如何找数据库表的主键字段的名称

SELECT FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA'; select from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';

Oracle 在创建主键(可以不加constrai浮t SYS_AAA),会为库表自动创建索引,

索引的列为主键列。 并且当库表某些列名或者库表名改变时候,

Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。 关键系统库表: desc dba_constraints desc dba_cons_columns

desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS

例子1:更改库表的列名

ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),

constraint SYS_AAA primary key(ID) );

查找约束名字

select cCONSTRAINT_NAME,ctable_name,ccCOLUMN_NAME from user_constraints c, user_cons_columns cc

where cconstraint_name=ccconstraint_name and ctable_name ='AAA' AND CCONSTRAINT_TYPE='P';

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME ------------------------------ ------------ ------------- SYS_AAA AAA ID

查找索引

select index_name,index_type,uniqueness from user_indexes where table_name='AAA'; INDEX_NAME INDEX_TYPE UNIQUENES

问题三:如何正确合理的建立MYSQL数据库索引 如何正确合理的建立MYSQL数据库索引

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。

在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL

); 我们随机向里面插入了10000条记录,其中有一条:5555, admin。

在查找username=admin的记录 SELECT FROM mytable WHERE

username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

MySQL索引类型包括:

(1)普通索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

◆创建索引

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

◆修改表结构

ALTER mytable ADD INDEX [indexName] ON (username(length))

◆创建表的时候直接指定

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length)) ); 删除索引的语法:

DROP INDEX [indexName] ON mytable;

(2)唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

◆创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

◆修改表结构

ALTER mytable ADD UNIQUE [indexName] ON (username(length))

◆创建表的时候直接指定

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,

UNIQUE [indexName] (username(length)) );

(3)主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,

PRIMARY KEY(ID) ); 当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

(4)组合索引

为了形象地对比单列索引和组合索引,为表添加多个字段:

CREATE TABLE mytable( ID INT>>

问题四:数据库索引有哪几种,怎样建立索引 索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。 根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。 在数据库表中创建的索引可以是是唯一索引、主键索引和聚集索引 景安服务器即使为您解答

问题五:数据库创建索引后怎么使用 索引在筛选率低于一定的值的情况是会很有效果

主要还是看你的查贰语句是怎么写的

记住,在筛选条件中,不要在字段上使用函数查询条件要尽量简单能够让数据库引擎更好地分析到合适的执行计划

问题六:怎么创建数据库的索引 打个比方

create table t1(a int);

create index i1 on t1(a);

那么t1表的列a就创建了索引。以后查询t1表,列a有查询条件的时候就可以用到这个索引。

使用索引提高查询效率是数据库自己的事情,一般情况下不需要人为干预索引的使用

问题七:请问数据库的索引创建后要怎么用啊? 索引要针对where语句中频繁出现的字段创建,索引增加查询检索效率,降低插入速度,耗费硬盘空间

问题八:SQL server中 表中如何创建索引? if exists(select from sysobjects where naem = 'newindex')

drop index newindex

create index

--===================================

竟然没有悬赏唉

那算了吧

我还是都告诉你吧

看个示例

自己琢磨去:

--==============================================

use master

go

if db_id(N'zhangxu')is not null

drop database zhangxu

go

create database zhangxu

sp_helpdb zhangxu

use zhangxu

go

IF EXISTS (SELECT FROM SYSOBJECTS WHERE NAME = N'WORKER')

DROP TABLE WORKER

GO

create table worker

(

w_id int identity (1000,1) not null,

w_name Nvarchar(10) unique,

w_age SMALLINT CONSTRAINT CK_W_AGE CHECK(w_age>20 and w_age>

问题九:数据库创建索引有什么优点和缺点 数据库中索引的优缺点

为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

以上就是关于如何将对象持久化到数据库中BLOB全部的内容,包括:如何将对象持久化到数据库中BLOB、如何使用Blob数据类型在Postgres-database、数据库怎么建索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9853957.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存