对象持久化
对象持久化(Object Persistence)是对数据的一种处理方式,使数据一直存在(文件,数据库),不因掉电等因素而擦除。
持久化的手段主要有:
1.序列化(Stream->File)
2.XML
3.DB
对象持久化概念的最常见应用为ORM(Object / Relational Mapping),即【对象】与【关系型】的映射,具体体现为OO的程序与关系型DB的交互。
DBMS
DB通常有其配套的DBMS,现在的DBMS大致可分为两类:
1.关系型数据库RDBMS(Relational Database Management System):常规数据库。将每个对象的各个属性分开,存在table中。
2.对象型数据库ODBMS(Object Database Management System):商业发展不如RDBMS。
主流RDBMS:
收费:Oracle,DB2,SQL Server
免费:mysql,sqlite
后起之秀:moogoDB
SQL
提到了DB,那么SQL也不得不提:结构化查询语言(Structured Query Language),与数据库引擎进行交互。
特点:
1.大部分DBMS都使用同一SQL规范。
2.部分DBMS有自己独有的“方言”。
分类:
DDL=DB Definition Language,对DB中的对象存储进行管理的SQL,常见的建表、删表、改表结构均为此类。
DML=DB Manipulation Language,对DB中的对象数据进行控制的SQL,常见的增删改查均为此类。
DCL=DB Control Language,对DB中的用户、权限进行管理的SQL,常见的有grant、deny、revoke等。
JDBC
JDBC(Java Database Connectivity)是一套Java的API,定义了一套操作数据库的规范,能与大多数DBMS对接进行操作。
由不同DBMS的驱动来不同地实现这套接口,从而方便地操纵DB。
下图描述了JDBC的结构概念,Java程序员只需要在Java Application中调用JDBC API接口,接口由各DBMS提供的驱动(JDBC Driver)来实现。
服务命令(Windows)
Oracle数据库启动/停止服务:
net start OracleOraDb10g_home1TNSListener / net stop OracleOraDb10g_home1TNSListener net start OracleServiceORCL / net stop OracleServiceORCL
mysql数据库启动/停止服务:
net start mysql / net stop mysql
常见字段类型(Oracle)
number(m,n):小数点前最长m位,小数点后最多n位。
char:存储大小固定,不够的补空格
varchar:可变字符串
varchar2:varchar的升级版,Oracle专用
varchar与varchar2的区别:
1.varchar2一般对所有字符都按两字节处理,varchar对数字字母以一字节处理,汉字、全角符号等按两字节。
2.varchar2对空串按null处理,varchar仍按空串。
3.varchar2对字符的处理方式还受数据库字符集影响。
sysdate:系统时间,例:select to_char(sysdate,'HH-mm-ss') from dual;
常见DDL
创建表:
-- mysql,创建三字段的表,给第二个字段添加唯一约束 create table mytable( column0 int not null, column1 varchar(50) not null, column2 varchar(15), constraint unq_col unique(column1) );
删除表,包括表结构及表数据:
drop table mytable;
删除表中记录,保留表结构:
truncate table mytable;
复制表结构和数据:
create table newtable as select * from oldtable;
仅复制表结构:
create table newtable as select * from oldtable where 1=2;
添加列:
alter table mytable add (newcolumn1 varchar(50),newcolumn2 number);
改变列:
alter table mytable modify newcolumn1 default('default string');
删除列:
alter table mytable drop column newcolumn2;
关系完整性约束
为了保证DB中数据的准确、不自相矛盾,预防不规范的数据进入DB,需要添加一些规则或约束,这些规则或约束就是关系完整性约束,通常包括域、实体、参照及用户定义的完整性四种,前三种为关系模型必须满足的。
域完整性(Domain Integrity)
域完整性保证字段取值的合理性,比如防止int字段录入float型的值,防止某个字段为空值等等,主要包括check、default、not null等。
检查(check):
...sex varchar(5) check(sex='男' or sex = '女')... ...age int check (age > 18 and age < 60)...
默认值(default):
...pwd default '123456'...
非空(not null):
...username not null...
实体完整性(Entity Integrity)
实体完整性保证表中每一个数据对象的可识别性,用主键实现,因为主键既不能为空也不能重复。
唯一索引也具有ID功能,起辅助识别作用,能够由多个字段共同构成一个唯一索引。
主键(primary key):
添加主键:
--oracle alter table mytable add constraint pk_mypk primary key(column0); --mysql alter table mytable add primary key(column0);
唯一索引(unique):
添加唯一索引:
上例中,只有当若干条记录的column1及column2均相同时,才被视为相同;另外其中至多一个字段可以为空。--oracle alter table mytable add constraint unq_index unique(column1, column2); --mysql alter table mytable add unique(column1, column2);
删除约束(主键、唯一、索引):
--oracle alter table mytable drop constraint unq_index; --mysql alter table mytable drop index column1;
自增
刚才提到,主键的两个特性为“非空”和“不重复”,而某一列的字段自增即可保证每一条记录都不重复。在生产中,往往可以使用某一个没有实际意义的、每次新增数据时其值自增的列做主键,来保证记录的可识别性。
自增的弊端则主要是当一条记录被删除时,自增序列将不再连续。
mysql实现
在mysql中,自增(auto_increment)可以直接实现:
--mysql alter table test auto_increment=1; --建表时添加自增 ...column0 int auto_increment not null primary key...
oracle实现
在oracle中,自增较为复杂,通常是序列+触发器的方案来实现。
序列(Sequence)
就是要用到的自增序列。
--oracle,序列名seq_user_id,最大最小值:1/9999999999,起始值为1,每次自增1,缓存20个序列 create sequence seq_user_id minvalue 1 maxvalue 9999999999 start with 1 increment by 1 cache 20;
触发器(Trigger)
每当产生某个动作之前或之后,触发器中的功能被调用,如下例中,每次删除用户表中数据前,都在用户日志表中记录:
--oracle --建用户表 create table users(username varchar2(20)); --建用户日志表 create table user_log(name varchar2(20),deldate date); --建触发器<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">tri_del_user</span>,在users表delete前,对于每一行数据,都将用户名及时间戳插入日志表 --:old变量为delete所涉及的row create or replace trigger tri_del_user before delete on users for each row declare begin insert into user_log(name,deldate) values(:old.username,sysdate); end;
自增实现
--以下是解释 --dual:不存在的虚表,保持语句完整性 --选出自增序列下一个值 select seq_user_id.nextval from dual; --选出自增序列当前值 select seq_user_id.currval from dual; --以下建触发器,每次插入前对于每一行数据都将从虚表获得的序列下一个值赋给新数据对象(:new)的id字段 create or replace trigger tri_user_auto_id before insert on users for each row declare begin select seq_user_id.nextval into :new.id from dual; end;
参照完整性(Referential Integrity)
在生产中,数据表往往不是孤立的,表与表之间建立了许多关联,当要对某表数据进行增、删、改时,往往会牵涉到修改之后其他表中数据的合理性。
譬如表A学生表与表B老师表中,若干表A中的学生数据通过教师的ID与表B中的老师数据形成从属关联R,当删除表B中的某位老师之后,表A的某些学生在关联R中根据教师ID无法在表B中对应到老师,从而产生错误。
参照完整性用外键实现。
外键(Foreign Key):
--oracle ...foreign key (col1) references othertable(col1)... alter table mytable add constraint FK_col1 foreign key (col1) references othertable(col1);
用户自定义完整性(User-defined Integrity)
DML学习请看下篇: 《Java基础:数据库(下)》顾名思义,这类完整性由DB用户自己定义,与使用DB的应用程序的需要紧密结合,不定义上述三类完整性,不做赘述了。