第一章: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…… )
修改(update ……)
刪除(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文檔時要使用迭代器進行遍歷,來獲取元素和屬性。