第一章:java对象持久化技术概述
1:持久化:persistence;对象持久化包含两方面的内容:将内存数据存入长期记忆介质并能从这些介质上无差错地复原到内存。
2:通过实现java.io包中的Serializable接口(即对象序列化和饭序列化技术)实现,这种技术很重要,虽然在执行持久化时有极大的限制,如:效率低下、不支持事务等。
3:通过XML技术实现,一门新兴的技术,潜力巨大,比序列化健壮,但仍然无事务功能、搜索能力缺乏。
4:RDBMS:关系型数据库。发展最为成熟、应用最广发的技术。
5:DDBMS:对象数据库,存储对象最理想的数据库。
6:表,RDBMS的核心,RDBMS的所有数据都存储在表中。每个表都由字段(列)和行组成,可以理解为表中的一行就是一个对象。表间关系:一对一、一对多(主从关系,主为一的一边,从即多的一方,这两者通过从表的外键联系起来,这个外键往往是主表的主键)、多对多。其中多对多关系是通过两个一对多关系实现的,这个中间表又叫连接表,有至少两个外键。
7:RDBMS的工作原理:用户不直接操作数据库中的数据,而是通过数据库引擎来操作,所以数据库一般由数据和数据库引擎组成。分为桌面数据库和网络数据库。
8:SQL:结构化查询语言,分为三类。
DDL:数据库定义语言,
创建和删除数据库(create database、drop database语句)
创建、修改、重命名和删除表(create table、alter table、rename table 和drop table 语句)
创建和删除索引(create index 、drop index 语句)
DML:数据操作语言,不能使用本语言删除和改变表的结构
查询(select ……)
增加(insert into…… )
修改(uodate ……)
删除(delete from ……)
DCL:数据控制语言
授权(grant)
取消授权(revoke)
9:常用数据库:
Oracle:监听端口1521
SQLServer:监听端口1433
Mysql(开源):监听端口3306
第二章:创建数据库和表
1:名民规则,数据库在服务器中的名字必须是唯一的。
第一个字符:Unicode标准3.0所定义的字母和“_”、“@”、“#”
后续字符:Unicode标准3.0所定义的字母、十进制数字、“@”、“$”、“_”、数字符号
不能使用RDBMS的保留字、不允许嵌入空格或其他特殊字符
2:数据类型,各个不同的数据库的数据库不尽相同,其SQL语句也有差别,以SQLServer为例
整数数据:tinyint,(0-255),占用一个字节存储空间
samllint.(-215-(215-1)),两个字节存储空间
int,(-231-(231-1)),四个字节存储空间
bigint,(-263-(263-1)),八个字节存储空间
浮点数据(采用上舍入式存储)
Real:可精确到7位小数,占四个字节
Float:可指定精度(0-15之间)精确到15位,占八个字节
Decimal(p,[s]):制定精度,占2-17个字节
Numeric与Decimal完全相同
字符串类型
Char(x):定长型,最多保存8KB,x为指定大小,当超过此大小时会被省去,当不足时用空格填满
Varchar(x):变长型,最多保存8KB,x为指定大小,当超过此大小时会自动添加,不足时不会用空格填满
Text:存储超过8KB的的大型ASCII数据,相当于其他DB中的CLOB类型
Nchar、Nvarchar、Ntext为以上三种类型对应的Unicode编码类型
二进制数据
Binary(n):定长型,取值1-8000,至少为一,占用n+4字节的存储空间,以“0X”作为二进制数据的标识,如输入的数据位数为奇数会自动变成“0X0”
Varbinary(n):变长型,取值1-8000,至少为一,占用n+4字节的存储空间,当binary数据类型被设定为允许null时会自动转变成varbinary类型数据
一般情况下定长型数据比变长型数据要快
逻辑数据
Bit:值为0和1,此二者以外的其他值都将被视作1,不能被定义成null。一般此数据类型完全可以用tinyint代替
图形数据
Image:处理大型二进制数据,理论容量为231-1字节,必须在数据前加“0X”作为二进制数据的标识,对应其他数据库的Blob类型
日期和时间数据
Datetime:精度可达3.33毫秒,占8个字节
Smalldatetime:精确到分,占4个字节
货币类型
Money:实质为一个拥有4位小数的Decimal类型数据,取值为(-263-263-1),占8个字节
Smallmonry:类似Money,但其储存范围相对小,占4个字节
特殊类型
Timestamp:时间戳,提供数据库范围内的唯一值,相当于Binary(8)或Varbianry(8),插入数据时此列会自动更新。
Uniqueidentifier:全球唯一识别号,存储一个16位的二进制数字。
3:复制表
Select * into B from A(where ……),将表A的指定内容复制到B表中,会创建表结构,但不能复制约束。
4:约束(Constriant)
主键约束:Primary key
自增列:Identity(m,n) 此字段往往用来作为主键,m:种子值,n:增量值
外键约束:Foreign key (column X) references B(colunmn X’)
唯一约束:unique
非空约束:not null
检查约束:Check
默认值:dafault (如与not null一起应先写默认值)
5:创建、删除索引,提高查询效率,但也会使得增、删、改的速度变慢,当创建了一个唯一约束时也就意味着创建了一个唯一索引,对于数据库中的储存二进制数据的字段是无法创建索引的,创建了主键约束也意味着创建了一个索引。
如:Create index abc on A(name)
Drop index A.abc
6:更改数据库表
如:Alter table A ADD a varchar(10),b int --------------向表中添加字段
Alter table A DROP COLUMN a--------------------删除表中a字段
Alter table A MODIFY b varchar(20)---------------修改表中b字段
Alter table A DROP CONSTRAIN ……-----------删除约束
Alter table A ADD CONSTRAIN ……-------------添加约束
第三章:基本SQL语句
1:添加数据
Insert into <表名><(列名列表)>values<(值列表)>,标识列是自动创建的
Insert into <表名><(列名列表)>select 语句,可实现一次添加多个列
2:删除数据
Delete from <表名>where<判断条件>,删除满足条件的行,数据可恢复
Drop table <表名>,彻底删除该表,包括表结构
Truncate table <表名>,删除并重构表结构包括约束,这种删除不能删除有外键约束引用的表,数据不可恢复
从表中删除记录时,必须注意维护如引用完整性等关系。如果其他表中有记录连接到了准备删除的记录,为了维护引用完整性,这些记录将不会被删除。
3:更新表
Update <表名> set A=值a,B=值b……where <判断条件>,如不添加判断条件会将表中的所有数据都修改,不需要改变表中所有字段的值,旧值将会保留
4:查询数据
Select [distinct] {*|column [alias],……}
From A,B…
[where ….]
[order by A,C]
可以在列名前叫表名前缀,如:A.b;也可以给列取别名如 a as c、a c,(这种方法在后面将要出现的联结查询里很有用);亦可对该列计算,如: 2*b;Distinct 用于排除重复的行,Top用于返回限定行数的查询(只能指定从顶行开始的行数);
5:选择条件运算符
5.1=、>=、<=、>、<、!=、^=、<>等,一般不等号用<>表示,!=、^=都表示不等关系,字符串也可以使用这些运算符
5.2AND(与)、OR(或)、NOT(非),BETWEEN用于范围测试,IN(集合)表示在集合中,这个运算符不会使用索引,所以查询速度会受到影响
5.3模糊查询符号,LIKE;通配符:%表示0-任意数目的任意字符,_表示一个任意字符,这种查询大小写敏感,当匹配模式中要用到通配符时应用ESCAPE转义(如:’%50p%’ ESCAPE ‘p’)
5.4处理空值数据应当使用’is’或’is not ’
第四章:JDBC
1:JDBC和ODBC都基于X/Open SQL通用语言接口,ODBC不适合在Java中直接使用,因其使用C语言接口。
2:JDBC驱动程序有两层模型和三层模型。包含三个组建:应用程序、驱动程序管理其和驱动程序
3:驱动程序类型
JDBC-ODBC桥加ODBC驱动程序,性能低下
本地API
JDBC网络纯Java驱动程序,大量用于分布式系统的开发
本地协议纯Java驱动程序,性能最好
4:简单说来,JDBC是由一系列规定了应用程序与数据库访问的接口、类和实现了这些接口的类(即JDBC驱动)的API。
5:JDBC常用API
Java.sql.Connection : 用于与特定的数据库建立连接
Java.sql.PreparedStatement :执行静态SQL语句
Java.sql.Result:用于访问结果集
Java.sql.DriverManager:管理JDBC驱动程序(创建连接)
6:JDBC访问数据库
基本模式
String driver = “………………”;
String url = “………………”;
String sql +“…………?,?……”;
Class.forName(driver);
Connection con = DriverManager.getConnection(url,”用户名”,”密码”)
PreparedStatement pstmt = con.PrepareStatement(sql);
pstmt.set…
….
Result rs = pstmt.executequery();//用于查询
Pstmt.executeupdate()//用于查询外的其他语句,不会返回结果集,但有返回值
While(rs.next){
………//对结果集执行某些操作
}
很多时候用Statement替代PreparedStatement也能有同样的效果,但后者更为安全和灵活。
第五章:聚合函数和分组
1:常用聚合函数
Count:返回结果集中行的数目
Sum:……所有值得总和,必须是数值型的子段
Avg:……的平均值,必须是数值型的子段
Max:返回最大值,非数值型亦可
Min:返回最小值,非数值型亦可
2:计数规范关键字
*:所有行,包括NULL值
ALL列:计算指定字段的非空值行
DISTINCT l列:指定字段所有唯一非空值行
3:模式语句
SELECT 子句 执行顺序:4
FROM 子句 1
WHERE 子句 2//执行于分组前
GROUP BY 子句 3
HAVING 子句 5//执行于分组后
ORDER BY 子句 6
4:子查询可以很灵活地嵌入到SQL语句中
第六章:组合查询
1:子查询
相关查询:内部查询用到外部查询的值,这种查询效率低,应尽量避免使用
非相关查询:内部查询无需使用外部查询的值
2:运算符
EXIST:测试子查询是否返回任何结果 EXIST(子查询)
ALL:子查询返回的所有结果都参与 ALL(子查询)
ANY:子查询结果中任意一行满足 ANY(子查询)
3:组合查询,将查询结果纵向拼接
基本模式
Select a,b From A
//运算符
Select a’,b’ From B
运算符:
UNION:取二者的并集
UNION ALL:取二者的并集,并保留重复行
EXCEPT :差集
INTERSECT:交集
第七章:联接
1:所有联接均基于笛卡尔乘积
2:联结的种类
内联结,左(右)外联接和全外联接
内联结为相等联结,会去掉空值,外连接则会保留对应的空值
3:基本模式
Select t1.a,t2.b…from A as t1 inner join(left join,full out join) B t2 on t1.a>t2.b inner join(……
4:联结的查询效率要高于相关子查询,但大量的联结依然时导致数据库效率低下的一个重要因素。
第八章:数据库设计
1:数据库设计的四个步骤:需求分析、概要设计、逻辑设计和物理设计
2:ER模型概念
2.1实体(矩形框表示)、属性(椭圆表示)和联系(棱形表示)
2.2属性:分原子属性和复合属性,单值属性和多值属性,保存属性和派生属性。复合属性和多值属性可以以任意方式嵌套(将复合属性放在括号中间,用逗号分隔,将多值属性放在大括号之间),键属性(可以唯一地识别每个实体,当然这种属性可以不止一个)
2.3:联系度:参与联系的实体类型数目,同一实体在不同的联系中会扮演不同的角色
2.4:递归联系:同一实体类型以不同角色多次参与同一个联系类型
2.5:联系类型约束:基数比约束、参与约束和结构约束
基数比约束:指明一个实体可以参与的联系示例的数目
参与约束:指明一个实体的存在是否依赖于他通过联系类型相关联的另一个实体,分全参与(存在依赖)(双直线表示)和部分参与(单直线)
2.6:联系类型的属性
联系类型也可以时有属性的1:1和1:N联系类型的属性可以迁移到参与的实体类型一边,而后者联系属性只能被迁移到多的一方
3:弱实体类型
本身无键属性。依赖于强实体,弱实体类型和它的识别联系一定是全参与约束,用双矩形或双棱形表示
4:逻辑设计
大体过程
1.映射强实体类型
2.处理弱实体
3.映射二元1:1联系类型
4.映射二元1:N联系类型
5.银蛇二元M:N联系类型
6.映射多值属性(可能时多对多类型的)
7.映射N元联系类型
5:函数依赖
表示实体内部属性之间的联系,一个属性决定另外一个属性
6:规范化
第一范式:每行必须为原子性的,每行的列数目一致,每行不能重复
第二范式:符合第一范式并且不存在部分函数依赖
第三范式:满足前两范式并且无传递依赖
7:逆范式
为寻求数据库的效率,某些情况下故意违背第二、第三范式但绝不能违背第一范式
第九章:编写持久层
DAO:持久层数据访问对象,编写持久层的目的是为了能将业务逻辑层和对数据库的访问分离开来,使程序松散耦合。
第十章:XML技术概述
1:XML:可扩展标记语言,他也是元标记语言。一个XML文件必须符合两个规范,格式良好和内容有效
2:XML由两部分组成:序言(XML文档声明、注释和空白)和文档元素。
声明:由结束,由版本号、独立文档声明和编码声明三个属性,其中版本号必须排在最前面,目前1.0时唯一版本,编码方式是可选属性,XML文档大小写敏感,声明必须写在最前面,之前不能出现任何空白或者注释
注释:结束。注释不能嵌套
PI(处理指令): ,通常用来传递信息给解析器的下游程序。
3:XML元素,同时XML文档信息的载体,是基本的逻辑单元。组成模式通常为
<标签名 属性A=“XX“ 属性B=“YY“ …>元素内容
命名规则:标签可以包含字母、数字及其他字母,名字不能以数字或“????_“开头,不能以XML或xml开头,不能包含空格或冒号
元素内容可以是字符数据、嵌套元素、实体引用、CDATA。内容中不能包含“<”、“&”、“]]>”
实体 和其所对应的 符号
< <
> >
&: &
" “
&apos ‘
在XML中直接使用实体一般语法为:&实体名;
CDADA:预定义文本,如:
显然CDATA中唯一不允许出现的字符是:]]>。
4:元素的属性
属性名命名:以一个字母或下划线开始,名称中不能包含有空格;同一元素不能有两个同名的属性;属性名区分大小写,不能使用任何形式的以‘xml‘为前缀的属性。
属性值命名:属性值由引号界定,可使用单、双引号,但必须成对出现;值总不能包含用于界定他的同种引号,不能包含<、&字符,除非以一个字符或者实体引用开始;
5:XML体系概述
文档描述与校验技术:DTD和Schema
文档转换技术:XSL/XSLT
文档查询技术:XPath/Xquery
文档解析技术:XML DOM/SAX
文档链接和定位技术:XLink/Xpointer
第十一章:使用XML定义文档结构
1:DTD,文档类型定义
语法为:
表达符号 及 含义
() 给元素分组
| 在列出对象中选择一个不能不选
+ 该成员至少出现一次
* 该成员出现0次或以上
? 出现0-1次
, 对象必须按顺序出现
元素内容类型
内容 解释
EMPTY 该元素不包含任何子元素和文本,仅包含属性
ANY 该元素可包含任何在DTD中定义的元素内容
#PCDATA 该元素可包含任何字符数据,但不能包含子元素
2:使用DTD定义元素属性
语法为:
属性名 属性类型 默认值
……
>
属性类型 及 含义
CDATA 只包含字符型数据
ID 该属性取值必须唯一
IDREF、IDREFS 指向文档中其他地方声明的ID值,后一个可以是多个引用
ENTITY、ENTITIES 对应一个在DTD文档中声明的但还没有分析过的实体
NMTOKE、NMTOKES CDATA的一个子集,(字母、数字、句点、破折号、下划线和冒号),后一个可包含多个值,值间用空格分隔
NOTATION 必须引用已在DTD文档其他地方声明过的某注解名称
默认值属性的四种
形式 和 含义
#REQUIRED 该元素所有实例都必须由该属性值
#IMPLIED 该元素的实例中没有指定该元素的值的话则忽略该属性
#FIXED value 包含该属性的元素实例必须在自定列出的值中
#Defaultvalue 为属性提供一个默认值
3:DTD与XML文档的关联
内部DTD:
外部DTD:
公共DTD:
DTD名称与XML不同,可以包含字母、数字、空格、回车等,如果一个DTD是一个ISO标准,那么名字应该以“ISO”开始,如果一个非ISO组织同意该DTD,其名称以“+”开始,如果没有标准化的组织同意该DTD,则以“-”开始。初始化字符串后面是一个“//”,接着是DTD所有者的名称然后是“//”,接着是描述该DTD的文字,最后“//”跟着ISO6039语言标识符
4:使用DTD定义XML实体
内部实体
外部实体
5:命名空间
语法定义:xmlns:[前缀]=”命名空间URI” 前缀是命名空间的别名,它不能是xml
6:Schema
DTD的局限
不遵守XML语法;不可扩展;不支持命名空间;无强大的数据类型支持
Schema元素
简单元素:不能包含子元素也不能包含属性
复杂元素:
使用XML Schema定义XML文档结构
基本模式
简单元素
复杂元素
简单元素或文本内容
定义属性
…………………
自定义简单数据类型
………………
一些预定义元素的属性及含义
max(min)Occurs 最大(小)出现次数
max(min)Incluseive 最大(小)值
attributeGroup 为属性分组
default 设定一个默认值
ref 引用
第十二章XML文档解析
1:XML解析器有两种形式,进行验证的处理器和不进行验证的处理器,次二者都要检查XML文档的格式良好
2:XML解析器使用的两种基本API是:DOM(文档对象模型,基于树结构)和SAX(XML简单API,基于事件驱动)
DOM在解析是会将整个XML文档读入内存而SAX内存占用少,效率高,但它只能按顺序处理数据,不能对文档进行随机访问,而且他是只读的,并且文档只能遍历一遍
3:DOM
树结构是这种模型的核心
使用JAXP将XML文档读入DOM需要的三个步骤
其代码是:
DocumentBuilderFactory dbd = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocdumentBuildr();
Document doc = db.newDocument()或者doc = db.parse(new File(filename));
输出
TransformerFactory tf = TransformFactory.newInstance();
Transformer tr = tf.newTransformer();
tr.transformer(new DOMSource(doc),new StreamResult(System.out));
当把DocumentFactory的setValidating()方法设定为true时,将根据DTD或Schema来
验证文档。
4:SAX
三个组件
应用程序 负责新建SAXparser实例
文档解析处理程序 一般为继承org.xml.helpers.DefaulHandler的类,此类实现了ErrorHander、EntityResolver和DTDHandler三个接口
解析器
使用JAXP获得SAX解析器的代码片段如下
SAXParserFactory f = SAXParseFactory.newInstance();
SAXParser sp = f.newSAXparser();
InputSource in = new InputSource(new FileReader(filename));
sp.parse(in,new DefaultHandler());
5:JOM
不遵循W3C规范,用于快速开发XML应用程序
利用JOM解析一个XML文档基本步骤
实例化一个合适的解析器对象
以包含XML数据的文件为参数,构建一个文档对象
获得根元素
6:DOM4J
不遵循W3C规范,开源,应用最为广泛
编写XML文档模式
Document doc = DocumentHelper.createDocdument();
或SAXReader r = new SAXReader();
doc = r.read(new File(filename));
Element root = doc.addElement(“……”);
Element e1 = root.addElement(“……”).addElement(“…..”)…..
…………
输出
OutputFormat f = OutputFormat.createPrettyPrint();
XMLWriter w = new XMLWriter(new FileOutputStream(),f);
w.write(doc);
w.close();
在解析XML文档时要使用迭代器进行遍历,来获取元素和属性。