第一章:Oracle数据库基础
一:Oracle基础知识
1.Oracle是一个数据库管理系统
2.Oracle数据库的主要特点:
1)支持多用户,大事务量的事务处理
2)在保持数据安全性和完整性方面性能优越
3)支持分布式处理数据,将分布在不同物理位置的数据库用通信网络连接起来,在分布式数据库系统控制下,
组成一个逻辑上统一的数据库,完成数据处理任务
4)具有可移植性,Oracle可以在windows,linux等多个操作系统平台上使用
3.全局数据库名 :
1)用于区分一个数据库的内部标识
2)
全局数据库名=数据库名+域名
3)使数据库的取名在整个网络环境中唯一
4.模式和模式对象:1)
模式为模式对象的集合
2)
每一个用户对应一个模式
3)模式对象是用户拥有的对象
4)
非模式对象与用户无关,如表空间
5.表空间:1)每个Oracle数据库都是由若干个表空间构成的
2)用户在数据库中建立的所有内容都被储存到表空间中
3)一个表空间可以由多个数据文件组成,但一个数据文件只能属于一个表空间
6.安装Oracle注意事项:1)选择安装目录最好是非系统盘
2)安装时可以直接创建数据库,也可以选择不创建
3)服务器的主机名不能有特殊字符
4)如果在创建数据库阶段提示错误,继续安装
5)输入的数据库口令最好记录在记事本中,以免使用时忘记
7.配置数据库:1)在Oracle服务器端配置监听器(listener)
2)客户端需要配置一个本地网络服务台(insname)
3)Oracle客户端与服务器端的连接是通过客户端发出连接请求,由服务器端监听器对客户端的连接请求进行合法检查,
如果连接请求有效,则进行连接,如果无效,则拒绝该连接
8.启动数据库服务:通过选择打开“服务”窗口,可以看到Oracle服务
OracleService:数据库服务
OracleOraDb11g_hom1TNSListener :数据库监听服务
OracleDBConsole:企业管理器服务
注意:1)在安装服务器软件时自动配置一个监听器
2)Oracle中的 Net Manager工具和Net Configuration Assistant都能用来配置监听器和网络服务名
8.连接数据库:Sys和System用户都是Oracle的系统用户,都使用SYSTEM表空间,SYS拥有更大的权限,而Scott用户是Oracle数据库的一个测试账户
########################################################################################################################
SYS用户 SYSTEM用户
地位 Oracle的一个超级用户 Oracle默认的系统管理员,拥有DBA权限
作用 主要用来维护系统信息和管理实例 通常用来管理Oracle数据库的用户、权限和存储等
登录身份 只能以SYSDBA或SYSOPER角色登录 只能以Normal方式登录
########################################################################################################################
SQL*Plus工具:是与Oracle数据库进行交互的客户端工具
步骤:开始-->所有程序-->Oracle-OraDb11g_home1-->应用程序开发-->SQL PLUS-->进入DOS界面输入-->system/orcl@orclDB-->select ename from Scott.emp;
二:Oracle数据类型
1.字符数据类型:1)char数据类型 :当需要固定长度的字符串,使用char数据类型,长度可以是1-2000字节,默认其占用一字节,如果用户输入值小于指定长度,默认用空格填充,
如果大于则报错
2)varchar2数据类型 :支持可变长度的字符串,大小为1-4000字节,与char数据类型相比,varchar2可以节省磁盘空间,如果用户输入值小于指定长度,默认用空
格填充,如果大于则报错
3)nchar数据类型 :国家字符集,使用方法和char相同
2.数值数据类型:number:可以存储正数,负数,零,定点数和精度为38位的浮点数,该格式为:NUMBER(p,s),p为精度,s为范围
3.日期时间数据类型:1)date数据类型:用于存储表中的日期和时间数据
2)timestamp数据类型:用于存储日期的年,月,日,以及时,分,秒
注意:如果在数据库中查询出来的日期格式乱的:方法一:更新会话-- alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'(只对当前窗口有效)
方法二:修改系统/用户环境变量,新增一个变量-- 变量名:nls_date_format 变量值:YYYY-MM-DD HH24:MI:SS
4.lob数据类型:又称大对象数据类型,可存储多达4GB的非结构化信息,如声音剪辑和视频剪辑等
1)clob: 能够存储大量字符数据,主要存储非结构化的XML文档,如新闻,内容介绍等含大量文字内容的文档
2)blob: 可存储较大的二进制对象,如图行,视频剪辑和声音剪辑等
3)bfile: 能够将二进制文件存储在数据库外部的操作系统文件中,bfile列存储一个bfile定位器,指向位于服务器文件系统上的二进制文件,支持文件最大为4GB
4) ncolb: 用于存储大的nchar字符数据,支持固定宽度字符和可变宽度字符,使用方法和clob类似
注意:1)long数据类型和lob数据类型都可以存储大数据,目前多使用lob数据类型
2)不建议使用VARCHAR、 INTEGER、FLOAT、DOUBLE等类型
5.Oracle中的伪列:伪列就像Oracle中的一个表列,实际并不存储在表中,他只能从表中查询,不能插入,更新或删除他们的值
1)rowid:返回该行地址,可唯一标识数据库中的一行
rowid伪列的用途:a.能以最快的方式访问表中的一行
b.能显示表中的行是如何存储的
c.可以作为表中行的唯一标识
2)rownum: 返回一个数值代表行的次序,返回第一行的rownum值为1,返回第二行的rownum值为2,以此类推
ROWNUM 是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数。
三:SQL语言简介
1.1)数据定义语言(DDL):CREATE
ALERT
DROP
TRUNCATE
2)数据操纵语言(DML):INSERT
UPDATE
DELETE
SELECT
3)事务控制语言(TCL):COMMIT
SAVEPOINT
ROLLBACK
4)数据控制语言(DCL):GRANT
REVOKE
2.数据定义语言:
1)创建表的语法:create table 表名称
列名称 列的数据类型及宽度;
注意:表名应该遵循下列命名规则:1)表名首字符应该为字母
2)不能使用Oracle保留字来为表命名
3)表名的最大长度为30字符
4)同一用户模式下的不同表不能具有相同的名称
5)可以使用下划线,数字和字母,但不能使用空格和单引号
2)truncate table命令:删除表记录数据语法; truncate table 表名;
3)数据操纵语言:用于检索,插入和修改数据库语言
a.选择无重复的行:例子:不重复显示所有学员姓名和年龄
SELECT DISTINCT stuName,stuAge
FROM stuInfo;
注意:distinct子句筛除结果集中内容全部相同的行,仅保留一行
b.带条件和排序的select命令:例子:按照姓名升序,如果姓名相同按照年龄降序排序
SELECT stuNo,stuName, stuAge
FROM stuInfo
WHERE stuAge>17 ORDER BY stuName ASC, stuAge DESC;
注意:ASC 升序 DESC 降序 ORDER BY 排序
c.使用列别名:例子:使用别名显示姓 名、年 龄和身份证号列
SELECT stuName as "姓 名", stuAge as "年 龄", stuID as 身份证号
FROM StuInfo;
d.利用现有的表创建新表
:例子:CREATE TABLE newStuInfo1 AS SELECT * FROM StuInfo; 注意:* 选择所有数据
CREATE TABLE newStuInfo2
AS SELECT stuName,stuNo,stuAge FROM StuInfo;
注意:stuName,stuNo,stuAge 选择指定的列所有数据
CREATE TABLE newStuInfo2
AS SELECT stuName,stuNo,stuAge FROM StuInfo
WHERE 1=2; 注意:1=2 只留表结构,不留数据
e.查看表中行数:例子:SELECT COUNT (1) FROM stuInfo; 注意:COUNT (1) 执行效率高
f.取出stuName,stuAge列不存在重复数据的记录
:例子:SELECT stuName,stuAge FROM stuInfo
GROUP BY stuName,stuAge HAVING(COUNT(stuName||stuAge) <2);
注意:COUNT(stuName||stuAge) <2 重复的个数为1
g.删除stuName、stuAge列重复的行(保留一行)
:例子:DELETE FROM stuInfo WHERE ROWID NOT IN(SELECT MAX(ROWID) FROM stuInfo
GROUP BY stuName,stuAge
HAVING(COUNT(stuAge||stuAge)>1)
UNION
SELECT max(ROWID)
FROM Stuinfo
GROUP BY stuName,stuAge
HAVING(COUNT(stuAge||stuAge)=1));
注意:ROWID NOT IN 获得所有重复记录的ROWID
| SELECT MAX(ROWID) 查找重复的记录,只保留一条
HAVING(COUNT(stuAge||stuAge)>1) 合并结果集,获得所有符合条件且不重复的记录
SELECT max(ROWID) 查找不重复的记录
h.查看当前用户所有数据量>100万的表的信息 例子:SELECT table_name FROM user_all_tables a WHERE a.num_rows>1000000;
3.事务控制语言:COMMIT 提交事务
ROLLBACK 回滚事务
SAVEPOINT 在事务中创建存储点
ROLLBACK TO
4.数据控制语言:数据控制语言为用户提供权限控制命令,授予的权限可以由所有者随时撤销
四:SQL操作符
1.算术运算符:基于数值的计算,操作符包括+ - * /
2.比较操作符:= != < > <= >= between…and(是否在两值之间) in(与列表中的值相匹配) like(匹配字符模式) is null(是否为空)
3.逻辑操作符:and or not
4.集合操作符:1)union(联合):返回两个查询选定的所有不重复的行
2)union All(联合所有):合并两个查询选定的所有行
3)intersect(交集):只返回两个查询的所有行
4)minus(减集):只返回由第一个查询选定而未被第二个查询选定的行,即第一个查询结果中排除在第二个查询结果中出现的行
5.连接操作符:||(用于将两个或多个字符串合并成一个字符串,或者将一个字符串与一个数值合并在一起)
五:SQL函数
1.单行函数:可分为:日期函数,数字函数,字符函数,转换函数,其他函数
1)每一行只返回一个值
2)可以出现在 SELECT 子句中和 WHERE 子句中
2.聚合函数:也称分组函数,1)根据分组的情况,返回每组里的一个结果值
2)可以在使用ORDER BY 和 HAVING子句中使用
3.分析函数:1)分析函数根据一组行来计算聚合值
2)分析函数为每组记录返回多个行
4.转换函数:将值从一种数据类型转换为另一种数据类型
1)常用的转换函数:TO_CHAR():转换成字符串类型 例子:TO_CHAR(1234.5'$9999.9') 结果:$1234.5
TO_DATE():转换成日起类型 例子:TO_DATE('1980-01-01','yyyy-mm-dd') 结果:01-1 月-80
TO_NUMBER():转换成数值类型 例子:TO_NUMBER('1324.5') 结果:1234.5
5.其他函数:NVL(exp1,exp2) 如果exp1的值为空,则返回exp2的值,否则返回exp1的值
NVL2(exp1,exp2,exp3) 如果exp1的值为空,则返回exp3的值,否则返回exp2的值
DECODE(value,if1,then1,if2,then2,...,else) 如果value的值为if1,则返回then1的值;如果value的值为if2,则返回then2的值;...否则返回else的值
6.分析函数:1)分析函数根据一组行来计算聚合值
2)分析函数为每组记录返回多个行
3)以下三个分析函数用于计算一个行在一组有序行中的排位,序号从1开始
语法;函数名([ 参数]) OVER( [ 分区子句 ] [ 排序子句])
函数名:分析函数名字
参数:函数需要传入的参数
分区子句(PARTITION BY):将查询结果分为不同的组,功能类似于GROUP BY语句
排序子句(ORDER?BY):将每个分区进行排序
例子:RANK( ) OVER (PARTITION BY deptno ORDER BY sal DESC)
RANK:返回唯一的值,当遇到相同数据,所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名(返回连续的排位,不论值是否相等)
DENSE_RANK:返回唯一的值,当遇到相同数据,所有相同数据的排名是一样的(具有相等值的行排位相同,序数随后跳跃)
ROW_NUMBER:返回唯一的值,当遇到相同数据,排名按照记录集中记录的顺序依次递增(具有相等值的行排位相同,序号是连续的)
整理OracleDOS命令:
1)启动监听器:lsnrctl start
2)重启动监听器:lsnrctl restart
3)启动oracle服务:net start oracleserviceorcl
4)进入sqlplus:sqlplus/nolog
5)使用sysdba角色登录sqlplus:conn /as sysdba
第二章:Oracle数据库应用
一.表空间和用户权限管理
1.表空间:是数据库逻辑结构的一个重要组件
1)表空间的分类
类别 说明
永久性表空间 一般保存表,视图,过程和索引等的数据。system,sysaux,useers,example表空间是默认安装的
临时性表空间 只用于保存系统中短期活动的数据,如排序数据等
撤销表空间 用来帮助回退未提交的事务数据,已提交的数据在这里不能回复
经验:一般不需要建临时和撤销表空间,除非把它们转移到其他磁盘中以提高性能
2)表空间的目的:a.对不同用户分配不同表空间,对不同模式对象分配不同表空间,方便对用户数据的操作,对模式对象的管理
b.可以将不同数据文件创建到不同的磁盘中,有利于管理磁盘空间,有利于提高I/O性能,有利于备份和恢复数据等
3)创建表空间
a.语法:create tablespace datafile 'filename' [size integer[K | M]] [autoextend [off | on]];
tablespacename : 表空间名
filename : 数据文件的路径和名称
size : 文件大小,K千字节大小,M兆字节大小
autoextend :用来开启或禁用数据文件的自动扩展
例子:create tablespace tp_hr
datafile
'd:\data\tp_hr01.dbf' SIZE 60M autoextend on;
b.查询所有表空间:select * from dba_data_files;
指定表空间名查询:例子:select * from dba_data_files WHERE file_name = 'D:\DATA\ASD.DBF';
4)修改表空间
a.调整表空间大小
例子:--方法一:更改数据文件的大小
ALTER DATABASE DATAFILE
'D:\DATA\tp_hr01.dbf'
RESIZE 80M;
--方法二:向表空间内添加数据文件
ALTER TABLESPACE tp_hr
ADD DATAFILE
'E:\DATA\tp_hr02.DBF' SIZE 20M
AUTOEXTEND ON;
b.更改表空间状态只读
例子:ALTER TABLESPACE tp_hr READONLY;
5)删除表空间
语法:drop tablespace 表空间名 [INCLUDING CONTENTS];
例子:DROP TABLESPACE tp_hr INCLUDING CONTENTS;
注意:a.删除表空间前先备份再删除
b.通过DROP TABLESPACE命令创建表空间
2.自定义用户管理
sys和system用户都是Oracle的系统用户,而Scott用户是Oracle数据库的一个示范用户
1)sys用户:是Oracle的一个超级用户,主要用来维护系统信息和管理实例,只能以sysoper或sysdba角色登录系统
2)system用户:是Oracle中默认的系统管理员,拥有dba权限。通常通过该用户管理Oracle数据库的用户,权限和储存等,
该用户不能以sysoper或sysdba角色登录系统,只能以Normal方式登录
3)scott用户:是Oracle的一个示范用户,一般在数据库安装时创建,
创建用户语法:CREATE USER 用户名
IDENTIFIED BY 用户密码
DEFAULT TABLESPACE 默认表空间名称
TEMPORARY TABLESPACE 临时表空间
QUOTA UNLIMITED ON 表空间名称
QUOTA 10M ON tp_bak 分配额度上线
PASSWORD EXPIRE; 首次登录时需要重新修改密码
查询当前所有用户:例子:SELECT * FROM dba_users;
查询当前创建用户:例子:SELECT * FROM dba_users where username='ASD';
删除当前用户:DROP USER ASD;
3.数据库权限管理
1)系统权限:指被授权用户是否可以连接到数据库上及在数据库中进行哪些系统操作(系统权限允许用户执行某些数据库操作)
常见的系统权限如下:create session:连接到数据库
create table:创建表
create view:创建视图
create sequence:创建序列
2)对象权限:指用户对数据库中具体对象所拥有的权限
Oracle数据库用户有两种途径获得权限:a.管理员直接向用户授予权限
b.管理员将权限授予角色,再将角色授予一个或多个用户
Oracle常用系统预定义角色如下:connect:需要连接上数据库的用户,特别是那些不需要创建表的用户,通常授予该角色
resource:更为可靠和正式的数据库用户可以授予该角色,可以创建表,触发器,过程等
dba:数据库管理员角色,拥有管理数据库的最高权限
给角色授予权限与法:grant 权限|角色 to 用户名;
撤销权限语法:revoke 权限|角色 from 用户名;
例子:GRANT connect, resource TO A_hr; --授予CONNECT和RESOURCE两个角色
REVOKE connect, resource FROM A_hr; --撤销CONNECT和RESOURCE两个角色
GRANT SELECT ON emp TO A_hr_new1; --允许用户查看 EMP 表中的记录
GRANT UPDATE ON emp TO A_hr; --允许用户更新 EMP 表中的记录
3)数据库用户安全设计原则:1)数据库用户权限授权按照最小分配原则
2)数据库用户分为管理,应用,维护,备份四类用户
3)不允许使用Sys和System用户建立数据库应用对象
4)禁止grant dba to user
二:序列
1.创建序列:1)序列是用来生成唯一,连续的整数的数据库对象
2)序列可以是升序的,也可以是降序的
3)使用CREATE SEQUENCE语句创建序列
语法:create sequence sequence_name
[start with integer]
[increment by integer]
[maxvalue integer|nomaxvalue]
[minvalue integer|nominvalue]
[cycle|nocycle]
[crche integer|nocache]
例子: CREATE SEQUENCE toys_seq
START WITH 10 指定第一个序号从 10 开始
INCREMENT BY 10 指定序号之间的间隔为 10
MAXVALUE 2000 表示序列的最大值为 2000
MINVALUE 10 表示序列的最小值为 10
NOCYCLE 在达到最大值后停止生成下一个值
CACHE 10; 指定内存中预先分配的序号数
2.访问序列:通过序列的伪列来访问序列的值
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值
SYS_GUID函数:生成32位的唯一编码作为主键
与SYS_GUID函数区别:1)在不需要并行的环境中使用序列作为主键
2)在并行的环境里或者希望避免使用序列的情况下使用函数
3.更改序列:1)设置或删除minvalue或maxvalue
2)修改增量值
3)修改缓存中序列号的数目
注意:不能修改序列的start with参数,在修改序列时,应注意升序序列的最小值应小于最大值
例子:ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE;
4.删除序列:drop sequence [schea.]sequence name;
例子:drop sequence seq1; 删除seq1序列
三:同义词
1.同义词用途:1)简化sql语句
2)隐藏对象的名称和所有者
3)为分布式数据库的远程对象提供了位置透明性
4)提供对对象的公共访问
2.同义词分类:1)私有同义词:只能在其模式内访问,且不能与当前模式的对象同名
语法:CREATE OR REPLACE SYNONYM SCOTT.emp的别名 FOR 模式名.表名;
例子:CREATE OR REPLACE SYNONYM emp FOR SCOTT.emp;
2)共有同义词:可被所有数据库的用户访问
语法:CREATE PUBLIC SYNONYM 同义词名称 FOR SCOTT.dept;
例子:CREATE PUBLIC SYNONYM public_sy_dept FOR SCOTT.dept;
3.删除同义词语法:DROP SYNONYM 同义词名称;
例子:DROP SYNONYM emp; 删除私有
DROP PUBLIC SYNONYM emp_syn; 删除公有
注意:此命令只删除同义词,不删除对应的对象
四:索引
1.索引是与表关联的可选结构,是一种快速访问数据的途径,可提高数据库性能
2.索引的分类
物理分类 逻辑分类
****************************************************
分区或非分区索引 单列或组合索引
B树索引 唯一或非唯一索引
正常或反向键索引 基于函数索引
位图索引
****************************************************
1)B 树索引:也称标准索引
语法:create unique index_索引名称 on 表名(创建索引的列名);
2)唯一索引:定义索引的列中任何两行都没有重复值。唯一索引中索引关键字只能指向表中的一行,在创建主键约束和创建唯一约束时都会创建一个与之对应的唯一索引
非唯一索引:单个关键字可以有多个与其关联的行
3.反向键索引:与常规B树索引相反,反向键索引在保持列顺序的同时反转索引列的字节,通过反转索引建的数据值来实现
例子:在员工表中,为员工编号列创建反向键索引
CREATE INDEX index_reverse_empno ON emp(empno) REVERSE;
4.位图索引:最适于低基数列(只能应用于查询操作)
优点:1)对于大批即时查询,可以减少响应时间
2)相比其他索引技术,占用空间明显减少
3)即使在配置很低的终端硬件上,也能获得显著性能
B树索引和位图索引的比较:
***************************|**********************************
|
B树索引 | 位图索引
|
*************************************************************
|
适用于高基数列 | 适用于低基数列
|
在键上更新相对廉价 | 更新键行非常昂贵
|
使用OR谓词的查询效率很低 | 使用OR谓词的查询效率很低
|
行级锁定 | 位图段级锁定
|
存储较多 | 存储较少
*************************************************************
5.其他索引:1)组合索引:在表内多列上创建,最多包含32列
2)基于函数的索引:若使用的函数或表达式涉及正在建立索引的表中的一列或多列,则创建
6.创建索引原则:1)表中导入数据后再创建索引,否则每次表中插入数据时都必须更新索引
2)在适当的表和字段上创建索引:如果经常检索的数据少于表中的15%,需要创建索引
3)限制表中索引的数目:索引越多,在修改表时对索引做出修改的工作量越大
7.删除索引:drop index 索引名;
8.何时删除索引:1)应用程序不再需要索引
2)执行批量加载前,
3)索引已损坏
五:分区表
1.1)允许用户将一个表分成多个分区
2)用户可以执行查询,只访问表中的特定分区
3)将不同的分区存储在不同的磁盘,提高访问性能和安全性
4)可以独立地备份和恢复每个分区
符合以下条件的表可以建成分区表:1)数据量大于2GB
2)已有的数据和新添加的数据有明显的界限划分
2.范围分区:以表中的一个列或一组列的值的范围分区
语法:PARTITION BY RANGE (column_name)
(
PARTITION part1 VALUE LESS THAN (range1),
PARTITION part2 VALUE LESS THAN (range2),
...
[PARTITION partN VALUE LESS THAN (MAXVALUE)]
);
注意:以列的值的范围来作为分区依据
3.间隔分区:是范围分区的一种增强功能,可以实现范围分区的自动化,优点在于不需要创建表就将所有分区划分清楚
语法:PARTITION BY RANGE(column_name)
INTERVAL(NUMTOYMINTERVAL(n, 'interval_unit'))
(PARTITION P1 VALUES LESS THAN (range1));
INTERVAL:代表“间隔”,按照后面括号中的定义间隔添加分区
NUMTOYMINTERVAL(n, 'interval_unit') 函数:1)将n转换成interval_unit所指定的值
2)interval_unit可以为: YEAR, MONTH
第三章:PL/SQL编程
一:PL/SQL基础知识
1.pl/SQL是结合了Oracle过程语言和结构化查询语言的一种扩展语言
PL/SQL的工作原理:1)PL/SQL引擎接受 PL/SQL 块并对其进行编译执行
2)该引擎执行所有过程语句
3)将SQL语句发送给Oracle的SQL语句执行器
2.PL/SQL优点:1)具有编程语言特点,能把一组sql语句放到一个模块中。使其更具模块化程序的特点
2)可以采用过程性语言控制程序的控制,也就是我们可以在pl/Sql中增加逻辑结构,如判断,循环等程序结构
3)可以对程序中的错误进行自动处理,即异常处理机制
4)具有更好的可移植性
5)减少了网络的交互,有助于提高程序性能
6)支持面向对象编程(OOP)
3.pl/sql体系结构:pl/sql引擎用来编译和执行pl/sql块和子程序,该引擎驻留在oracle服务器中,pl/sql引擎仅执行过程语句,
而将SQL语句Oracle服务器上的SQL语句执行器,由SQL语句执行器执行这些SQL语句
4.pl/sql块简介:pl/sql是一种块结构语言,它将一组语句放在一个块中,pl/sql块将逻辑上的相关声明和语句组合在一起,匿名块是一个
未在数据库中命名的pl/sql块,在运行时被传递到PL/SQL引擎以便执行,其中可以使用select,insert,update,delete等dml语句,事务控制语句及SQL函数
等,不允许直接使用create,drop,或alter等ddl语句,但可通过动态SQL执行他们
5.pl/sql块语法:由三部分组成,声明部分,执行部分及异常处理部分
语法:DECLARE
变量名 类型;
BEGIN
SELECT 列名 INTO 变量名 -- 为变量赋值
FROM 表名
WHERE 条件;
IF 条件 THEN
执行过程
END IF;
COMMIT;--提交
EXCEPTION /* 异常处理语句 */
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM);
END;
--语法 DECLARE 变量名 是否为常量(CONSTANT) 变量类型 是否为空[NOT NULL] 初始化变量值[:=value];
--支持 %TYPE 和 %ROWTYPE 属性类型
--为变量赋值方式一: (变量名 := 值) (列名 INTO 变量名)
例子:DECLARE
new_empno employee.empno%TYPE;
BEGIN
select empno INTO new_empno
from employee
WHERE ENAME = 'ALLEN';
IF new_empno > 0 THEN
DBMS_OUTPUT.PUT_LINE('员工存在,编号为:'|| new_empno);
END IF;
--COMMIT;提交
EXCEPTION /* 异常处理语句 */
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM);
END;
6.运算符:关系运算符,一般运算符和逻辑运算符
注意:常用一般运算符:+ - * / :=(赋值号) =>(关系号) ··(范围运算符) ||(字符连接符)
7.常量和变量的声明:a.使用declare关键字 b.用于定义变量或者常量
1)声明变量语法:变量名称 变量的数据类型(大小范围) 变量的初始值;
2)声明常量语法:常量名称 constant 变量的数据类型:=变量的初始值;
PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同,要求限制如下:
1)标识符名不能超过30个字符
2)第一个字符必须为字母
3)不区分大小写
4)不能用"-"(减号)
5)不能是SQL保留字
变量命名规则:
********************************************************
标 识 符 命名规则 例 子
********************************************************
程序变量 v_name v_student_name
程序常量 c_name c_company_name
游标变量 cursor_name cursor_emp
异常标志 e_name e_too_many
表类型 name_table_type emp_record_type
表 name_table emp_table
记录类型 name_record emp_record
绑定变量 g_name g_year_sal
*********************************************************
8.编码规则:1)利用缩进排列展现逻辑结构
2)利用大小写增强可读性
3)格式化单独语句
4)格式化SQL语句
9.注释:1)使用双"-"加注释 只是单行注释
2)使用"/* */"来加一行或多行注释
例子:/*
|| 在注释开始的首行只放斜线星号,标志注释开始,
|| 然后注释块的每一行以双垂直线开头,突出注释后面
|| 的内容是注释部分,最后,将星号斜线单置于一行
*/
DECLARE
v_ename VARCHAR2(20);
v_rate NUMBER(7,2);
c_rate_incr CONSTANT NUMBER(7,2):=1.10;
BEGIN
--方法一:通过SELECT INTO给变量赋值
SELECT ename, sal* c_rate_incr
INTO v_ename, v_rate
FROM employee
WHERE empno='7788';
--方法二:通过赋值操作符“:=”给变量赋值
v_ename:='SCOTT';
END;
10.PL/SQL数据类型
1)标量数据类型:包括数字,字符,布尔值和日期时间四类
oracle使用的变量类型:
***********************************************************************************
类型 子类 说明 范围
***********************************************************************************
char character 定长字符串 0~32767
nchar 民族语言字符集 可选,默认为1
varchar2 varchar String 可变字符串 0~32767
nvarchar2 民族语言字符集
binary_integer 带符号整数,为整数计算优化性能
dec 小数,number的子类型,高精度实数
double precision 整数,number的子类型
integer 整数,number的子类型
number(p,s) int 与number等价
numeric 与number等价
real 整数,比integer小
small int
long 变长字符串 0~2147483647
date 日期型 公元前4712年1月1日至公元前4712年12月31日
boolean 布尔型 true,false,nullsss
*************************************************************************************
2)lob数据类型:用于存储大的数据对象的类型,Oracle目前主要支持bfile,blob,clob及nclob类型
3)属性类型:用于引用变量或数据库列的数据类型,以及表示表中一行的记录类型
4)%type:定义一个变量,其数据类型与已经定义的某个数据变量的数据类型相一致,可以使用%type
使用%type的好处:1)可以不必知道所应用的数据库列的数据类型
2)所引用的数据库列的数据类型可以实时改变,容易保持一致,不用修改pl/sql程序
%rowtype:返回一个记录类型,其数据类型和数据库表的数据结构相一致,可以使用%rowtype
使用%rowtype的好处:1)可以不必知道所引用的数据库中列的个数和数据类型
2)所引用的数据库列的个数和数据类型可以实时改变,容易保持一致,不用修改pl/sql程序
11.pl/sql控制语句:控制结构共有三种类型,条件控制,循环控制和顺序控制
1)条件控制:用于根据条件执行一系列语句
a.if语句语法如下:
if<布尔表达式> then
pl/sql和sql语句
end if;
**************************
if<布尔表达式> then
pl/sql和sql语句
else
其他语句
end if;
**************************
if<布尔表达式> then
pl/sql和sql语句
elif<其他布尔表达式> then
其他语句
elif<其他布尔表达式> then
其他语句
else
其他语句
end if;
注意:elsif经常错误的写成elseif
b.case语句语法如下:
格式一:
case 条件表达式
when 条件表达式结果1 then
语句段1
when 条件表达式结果2 then
语句段2
....
when 条件表达式结果n then
语句段n
[else 语句段]
end case;
**************************************
格式二:
case
when 条件表达式1 then
语句段1
when 条件表达式2 then
语句段2
....
when 条件表达式n then
语句段n
[else 语句段]
end case;
例子:DECLARE
grade NUMBER:=70;
remark varchar2(20);
BEGIN
CASE
WHEN grade=100 THEN remark:='is Excellent';
WHEN grade>=80 THEN remark:='is Good';
WHEN grade>=60 THEN remark:='is Normal';
WHEN grade>=50 THEN remark:='is Bad';
ELSE remark:='big Problem';
END CASE;
END;
2)循环控制:用于重复执行一系列语句,循环控制包括loop和exit语句,使用exit可以立即推出循环;使用exit where可以根据条件结束循环
循环共有三种类型:loop循环,while循环和for循环
a.loop循环语法:
loop
要执行的语句;
exit when<条件语句> --条件满足,退出循环语句
end loop;
b.while循环语法:
while<布尔表达式> loop
要执行的语句;
end loop;
c.for循环语法:
for 循环计数器 in [reverse] 下限···上限 loop
要执行的语句
end loop;
3)顺序控制:用于按顺序执行语句,包括null语句和goto语句,goto语句不推荐使用
null语句:是一个可执行语句,相当于一个占位符或不执行任何操作的空语句,它可以使某些语句变得有意义,提高程序可读性,
保证其他语句结构的完整性和正确性
二:异常处理
1.在运行程序时出现的错误叫做异常,用来处理正常执行过程中未预料的事件,发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分
2.异常有两种类型
1)预定义异常:当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
2)用户定义异常:用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发
预定义异常:
预定义异常 说 明
ACCESS_INTO_NULL 视图给一个没有初始化的对象赋值
case_not_found case语句中的选项与用户输入的数据不匹配时出现
collection_is_null 给尚未初始化的表或数组赋值时出现
cursor_already_open 在用户试图重新打开已经打开的游标时出现
DUP_VAL_ON_INDEX 重复的值存储在使用唯一索引的数据库列中
INVALID_NUMBER 视图将一个非有效的字符串转换成数字
LOGIN_DENIED 使用无效的用户名和口令登录Oracle
NO_DATA_FOUND 语句无返回数据
storage_error 在内存损坏或pl/sql耗尽内存时出现
TOO_MANY_ROWS 在执行SELECT INTO语句后返回多行时出现
value_error 在产生大小限制错误时出现
zer_divide 以零作为除数时出现
异常处理程序语法:
BEGIN
过程及SQL语句;
EXCEPTION
WHEN 异常名称THEN
过程及SQL语句;
WHEN OTHERS THEN
过程及SQL语句;
END;
例子:begin
sequence_of_statements;
exception
when then
sequence_of_statements;
when others then
sequence_of_statements;
end;
3.处理用户自定义异常
1)使用RAISE关键字引发异常
2)使用EXCEPTION关键字处理异常
使用步骤如下:1)在pl/sql块的定义部分定义异常处理 <异常情况> exception;
2)抛出异常情况 raise <异常情况>;
3)在pl/sql块的异常情况处理部分对异常情况作出相应的处理
raise_application_error(error_number,error_message);
error_number:用户为异常指定的编号
error_message:用户为异常指定的消息文本
三:游标
1.游标基本原理:用来处理使用select语句从数据库中检索到的多行记录的工具
2.游标分类:显示游标:返回多条记录时,使用显示游标逐行读取
隐式游标:PL/SQL自动为DML语句创建隐式游标,包含一条返回记录
3.显示游标:四个步骤:声明游标–>打开游标–>提取游标–>判断是否为空–>关闭游标
1)声明游标语法:CURSOR cursor_name [ ( parameter [ , parameter]……)]
[ RETURN return_type ] IS selectsql
CURSOR:用于声明一个游标
parameter:可选参数,用于指定参数类型、模式等
return:可选,指定游标的返回类型
Selectsql:需要处理的select语句,不能含INTO子句
2)打开游标语法:open cursor_name 使用OPEN语句开启一个游标
3)提取游标语法:FETCH cursor_name INTO variable_list
a.使用FETCH语句实现对游标内容的读取
b.variable_list必须与从游标提取的结果集类型相同
4)关闭游标语法:close 游标名;
使用CLOSE语句关闭一个游标
关闭游标后,所有资源都将被释放
I.游标的属性:
属性名称 说 明
%found 用于检验游标是否成功,通常在FETCH语句前使用,当游标按照条件查询出一条记录时,返回true
%isopen 判断游标是否处于打开状态,视图打开一个已经打开或者已经关闭的游标,将会出现错误
%notfound 与%found的作用相反,当按照条件无法查询到记录时,返回true
%rowcount 循环执行游标读取数据时,返回检索出的记录数据的行数
II.使用显示游标删除或更新
1)允许使用游标删除或更新活动集中的行
2)声明游标时必须使用 SELECT … FOR UPDATE语句
例子:CURSOR IS
SELECT statement FOR UPDATE;
3)可以使用以下语法更新行
例子:UPDATE
SET
WHERE CURRENT OF
4)也可以使用以下语句删除行
例子:DELETE FROM
WHERE CURRENT OF
4.使用循环游标简化游标的读取
语法:for 声明的记录变量 in cursor_name
loop
executable_statements
end loop;
旬环游标的特性如下:
1)再从游标中提取了所有记录之后自动终止
2)提取和处理游标中的每一条记录
3)如果在提取之后的%notfound属性返回 true,则终止循环
4)如果未返回行,则不进入循环
5.no_date_found和%notfound的区别
1)select...into语句返回0条和多条记录时触发no_date_found
2)当update或delete语句的where子句未找到时,触发%notfound
3)当提取循环中用%notfound或%found来确定循环的退出条件,而不用no_date_found
四:存储过程
1.子程序的组成:命名的 PL/SQL 块,编译并存储在数据库中
子程序的各个部分:声明部分 可执行部分 异常处理部分(可选)
子程序的分类:过程 - 执行某些操作 函数 - 执行操作并返回值
1)声明部分:包括类型,游标,常量,变量,异常和嵌套子程序的声明,这些项是局部的,退出子程序后将不复存在
2)可执行部分:包括赋值,控制执行过程及操纵oracle数据的语句
3)异常处理部分:包括异常处理程序,负责处理执行存储过程中出现的异常
a.模块化:通过子程序,可以将程序分解为可管理的,明确的逻辑模块
b.可重用性:子程序在创建并执行后,就可以在任意数目的应用程序中使用
c.可维护性:子程序可以简化维护操作,如果一个子程序受到影响,则只需修改该子程序的定义
d.安全性:用户可以设置权限,使得访问数据的唯一方式就是通过用户提供的存储过程和函数,这不仅可以让数据更加安全,还可以保证他们的正确性
2.存储过程的用法:是执行某些操作的子程序,是执行特定任务的模块
基本用法:1)创建存储过程
2)调用存储过程:用命令在sql提示符下调用 在pl/sql中调用
3)存储过程的参数模式
4)存储过程的访问权限
5)删除存储过程
I:创建存储过程语法:
CREATE [OR REPLACE] PROCEDURE
[()]
IS|AS
BEGIN
[EXCEPTION
]
END;
OR REPLACE:可选
procedure name:存储过程的名称
parameter list:参数列表,可选
local variable declaration:局部声明,可选
executable statements:可执行语句
exception handlers:异常处理程序,可选
例子:CREATE OR REPLACE PROCEDURE add_employee(
eno NUMBER, --输入参数,雇员编号
name VARCHAR2, --输入参数,雇员名称
salary NUMBER, --输入参数,雇员薪水
job VARCHAR2 DEFAULT 'CLERK', --输入参数,雇员工种默认'CLERK'
dno NUMBER --输入参数,雇员部门编号
)
IS
BEGIN
INSERT INTO employee (empno,ename,sal,job,deptno)VALUES (eno,name,salary,job, dno);
END;
--SQL*Plus-下的语法
--EXEC add_employee(1111,'MARY',2000,'MANAGER',10);
--EXEC add_employee(dno=>10,name=>'MARY',salary=>2000,eno=>1112, job=>'MANAGER');
--EXEC add_employee(1113,dno=>10,name=>'MARY',salary=>2000,job=>'MANAGER');
--EXEC add_employee(1114,dno=>10,name=>'MARY',salary=>2000);
II: 调用存储过程
1)用命令执行:用命令在sql提示符下调用,通过execute语句来执行过程
2)执行存储过程语法:EXEC[UTE] procedure_name(parameters_list);
EXEC:执行命令,缩写exec
procedure_name:存储过程名称
parameters_list:参数列表
例子:
BEGIN
--按位置传递参数
add_employee(2111,'MARY',2000,'MANAGER',10);
--按名字传递参数
add_employee(dno => 10,name=>'MARY',salary=>2000,eno=>2112, job=>'MANAGER');
--混合方法传递参数
add_employee(3111,dno=>10,name=>'MARY',salary=>2000,job=>'MANAGER');
--默认值法
add_employee(4111,dno=>10,name=>'MARY',salary=>2000);
END;
III:存储过程参数模式
1)IN:用于接受调用程序的值 默认的参数模式
2)OUT:用于向调用程序返回值
3)IN OUT:用于接受调用程序的值,并向调用程序返回更新的值
IV:删除存储过程的语法: DROP PROCEDURE procedure_name;
V:存储过程编写规范:1)存储过程中不可以直接使用DDL语句,可以通过动态SQL实现。但不建议频繁的使用DDL语句
2)存储过程必须有相应的出错处理功能
3)存储过程变量使用%type和%rowtype类型
4)必须在存储过程体中作异常捕获,并将异常信息通过os_Msg变量输出
5)–1 ~ -19999的异常为Oracle定义的异常代码
6)存储过程必须包含两个输出参数分别用于标识过程的执行状态及过程提示信息
7)"WHEN OTHERS"必须放置在异常处理代码的最后面作为缺省处理器处理没有显式处理的异常
第四章:Hibernate入门
一:Hibernate介绍及环境搭建
1.Hibernate框架简介:1)优秀的Java持久化层解决方案
2)主流的对象-关系映射工具
2.Hibernate优点:1)简化了JDBC 繁琐的编码,提高持久化代码的开发速度,降低维护成本
2)对面向对象特性支持良好
3)可移植性好
4)框架开源免费,具有可扩展性
Hibernate的缺点:1)不适合需要使用数据库的特定优化机制的情况
2)不适合大规模的批量数据处理
3.Hibernate与mybatis比较:
1)相对于MyBatis的“SQL-Mapping”的ORM实现,Hibernate的ORM实现更加完善,提供了对象状态管理、级联操作等功能
2)完全面向对象,语句与数据库无关,开发者无需关注SQL的生成,开发简单,便于修改,数据库移植性好
3)由于直接使用SQL,MyBatis使用自由度较高
4.Hibernate环境搭建
1)下载需要的jar文件:1)Hibernate的官方网站http://hibernate.org
2)托管网站https://sourceforge.net/projects/hibernate/files/
3)推荐下载:hibernate-distribution-3.6.10.Final-dist.zip
2)部署jar文件:1)hibernate3.jar
2)lib\required目录下的jar文件
3)lib\jpa\hibernate-jpa-2.0-api-1.0.1.Final.jar
4)Oracle数据库驱动jar文件
3)创建Hibernate配置文件的hibernate.cfg.xml
例子:jdbc:oracle:thin:@127.0.0.1:1521:orcl
scott
tiger
oracle.jdbc.OracleDriver
org.hibernate.dialect.Oracle10gDialect
true
true
thread
4)创建持久化类和映射文件:1)定义持久化类(也称实体类),实现java.io.Serializable 接口,添加默认构造方法
2)配置映射文件(*.hbm.xml)
3)向hibernate.cfg.xml文件中配置映射文件
二:使用Hibernate完成持久化操作
1.使用Hibernate操作数据库七个步骤:
1)读取并解析配置文件及映射文件
Configuration conf = new Configuration().configure();
2)依据配置文件和映射文件中的信息,创建SessionFactory对象
SessionFactory sf = conf.buildSessionFactory();
3)打开session
Session session = sf.getCurrentSession();
4)开始一个事务
Transaction tx = session.beginTransaction();
5)持久化操作
Dept dept = new Dept();
session.save(dept);
6)提交或回滚事务
tx.commit(); 或 tx.rollback();
7)若使用openSession()开启会话,则需关闭
session.close();
2.使用Hibernate实现查询操作
1)通过主键值加载指定类型的实例
方 法 区别一
Object get(Class clazz, 若数据不存在,返回null
Serializable id )
Object load(Class clazz, 若数据不存在,使用时抛出
Serializable id ) ObjectNotFoundException
2)使用Hibernate实现数据库的增,删,改,查操作
I:增加:方法:save()
II:修改:方法:merge()
III:删除:delete()
IV:查询:get()或load()
三:hibernate中Java对象的三种状态
1.Java对象的三种状态
1)瞬时状态:又称临时状态,就是Java对象在数据库中没有相关联的记录,此时Java对象状态为瞬时状态(new出来的Java对象就是瞬时状态)
2)持久状态:当对象与session关联,被session管理时,就处于持久状态(new的Java对象通过执行增加或修改方法后就变为持久状态)
3)游离状态:又称脱管状态,处于持久状态的对象脱离与其关联的session的管理后,对象就处于游离状态(与数据库断开连接或清除数据后对象就变为游离状态)
2.三种状态之间的转换
1)瞬时状态转持久状态:使用session的save(),saveOrUpdate()等方法保存对象后,该对象由瞬时状态转持久状态
使用session的get()或load()方法获取对象,该对象状态是持久状态
2)持久状态转瞬时状态:执行session的delete()方法后,该对象由持久状态转瞬时状态,此时该对象没与任何数据库数据关联
3)持久状态转游离状态:执行session的evict(),clear().close()方法,对象由持久状态转游离状态
4)游离状态转持久状态:执行session的update()或saveOrUpdate()方法,对象由游离状态转持久状态,该对象再次与当前session相关联
5)游离状态转瞬时状态:执行session的delete方法,对象由游离状态转瞬时状态
注意:瞬时状态或游离状态的对象不会被其他对象引用,会被Java虚拟机按垃圾回收机制处理
四:脏检查及刷新缓存机制
1.脏检查:数据前后发生变化的对象称为脏对象,判断数据前后是否发生变化,称为脏检查
2,刷新缓存机制:刷新缓存就是将数据库同步为与Session缓存一致,刷新缓存时会执行脏检查
1)当刷新缓存(调用Session的flush()方法)时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变
2)commit()方法会首先刷新缓存
Session会在以下时间点刷新缓存:1)调用Session的flush()方法:(执行脏检查)
2)调用Transaction的commit()方法:(刷新缓存)
第五章:HQL实用技术
一:使用HQL语句
1.简介:1)HQL是Hibernate查询语言,其中没有表和字段的概念
2)Criteria查询采用面向对象的方式构造查询
3)原生SQL查询就是直接执行SQL语句的查询
2.编写HQL语句
1)from子句:跟类名
例子:from cn.hibernatdemo.entity.Dept
from Dept
2)select子句:用于选取对象和属性
例子:select deptNo, deptName from Dept
3)where子句:用于表达查询的限制条件
例子:from Dept where deptName = 'SALES'
from Dept dept where dept.location is not null
4)使用表达式:一般用在where子句中
例子:from Dept where lower(dept.deptName) = 'sales'
from Emp where year(hireDate) = 1980
5)order by 子句:用于按指定属性排序
例子:from Emp order by hireDate, salary desc
3.执行SQL语句:
执行HQL语句的步骤:1)获取Session对象
2)编写HQL语句
3)创建Query对象
4)执行查询,得到查询结果
例子:list()方法: session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery( hql );
List empList = query.list();
iterate()方法:session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery( hql );
Iterator empIterator = query.iterate();
二:在HQL语句中绑定参数
1.参数绑定形式:1)按参数位置绑定:from User where name = ? 下标从0开始
2)按参数名称绑定:from User where name = :name 可读性好,易维护,推荐使用
2.绑定各种类型的参数:1)Query接口提供的绑定不同数据类型参数的方法
setBoolean():绑定类型为Java.lang.Boolean的参数
setByte():绑定类型为Java.lang.Byte的参数
setDouble():绑定类型为Java.lang.Double的参数
setDate():绑定类型为Java.lang.Date的参数
setString():绑定类型为Java.lang.String的参数
setParameter():任意类型参数
注意:以上每个方法都有两种重载形式,
例子:1)setString(int position,String val):按位置绑定参数
2)setString(String name,String val):按名称绑定参数
2)setProperties()方法:绑定命名参数与一个对象的属性值
3.实现动态查询:命名参数名一定要和参数封装对象的属性名一致
4.使用uniqueResult()方法获取唯一结果
三:分页和投影
1.实现数据分页查询:setFirstResult() :设置从第几条开始
setMaxResults():设置读取最大记录数
注意:当前页:(当前页-1)*每页显示的条数
2.使用投影查询:1)HQL投影查询是查询一个持久化类的一个或多个属性值,或者是通过表达式或聚合函数得到的值
2)投影查询需要使用HQL的select子句
3)查询结果的封装主要分三种情况:a.封装成Object对象
b.封装成Object数组
c.通过构造方法封装成对象:对象不是持久化状态,仅用于封装结果
注意:若查询结果仅用于展示,不需要保持持久化状态,应尽量使用投影查询以减少开销,提高效率
第六章:Hibernate关联映射
一:关联关系
1.类与类之间最普遍的关系就是关联关系,而且关联是有方向的
例子:1)一个部门下有多个员工:一对多关系
例子:
......
2)多个员工在一个部门下:多对一关系
例子:
......
3)学生表有成绩,成绩表中有学生:多对多关系
例子:暂无
2.cascade属性:
第七章 HQL连接查询和注解
一:各种连接查询
1.和SQL查询一样,HQL也支持各种各样的连接查询,如内连接、外连接
hql常用的连接类型
************************************************************
连接类型 HQL语法
内连接 inner join 或 join
迫切内连接 inner join fetch 或 join fetch
左外连接 left outer join 或 left join
迫切左外连接 left outer join fetch 或 left join fetch
右外连接 right outer join 或 right join
*************************************************************
2.内连接
语法:form 实体类名 [inner] join [fetch] 实体类名.实体类属性
3.外连接
左外连接语法:form 实体类名 left [outer] join [fetch] 实体类名.实体类属性
右外连接语法:form 实体类名 right [outer] join 实体类名.实体类属性
4.等值连接
a.适用于两个类之间没有定义任何关联时
b.在where子句中通过属性作为筛选条件
例子:from Dept d , Emp e where d = e.dept
注意:1. 没有where条件,直接执行“from Dept d , Emp e”会返回笛卡尔积,结果没有实际意义
2. 语句 from Dept d , Emp e where d.emps = e 是错误的,Set类型不能与Emp类型划等号
5.隐式内连接
例子:from Emp e where e.dept.dname = 'SALES' -- 用于where子句
select empno, ename, dept.dname from Emp -- 用于select子句
a.Hibernate会根据关联关系自动使用等值连接(等效于内连接)查询
b.允许以更加面向对象的方式编写HQL语句,更多地依据对象间的关系,而不必考虑数据库结构
二:分组统计数据
1.基本语法:
select ... from ... where ... group by ... having ... order by ...
2.聚合函数
1)count() :统计记录条数
2)sum() :求和
3)max() :求最大值
4)min() :求最小值
5)avg() :求平均值
三:子查询
1.子查询语句应用在HQL查询语句的where子句中
*****************************
关键字 说明
all 返回的所有记录
any 返回的任意一条记录
some 和“any”意思相同
in 与“=any”意思相同
exists 至少返回一条记录
*****************************
2.操作集合的函数或属性
函数或属性 说 明
size() 或size 获取集合中元素的数目
minIndex()或minIndex 对于建立了索引的集合,获得最小的索引
maxIndex()或maxIndex 对于建立了索引的集合,获得最大的索引
minElement()或minElement 对于包含基本类型元素的集合,获取最小值元素
maxElement()或maxElement 对于包含基本类型元素的集合,获取最大值元素
elements() 获取集合中的所有元素
四:查询性能优化
1.Hibernate查询优化策略
1)使用延迟加载等方式避免加载多余数据
2)通过使用连接查询,配置二级缓存、查询缓存等方式减少select语句数目
3)结合缓存机制,使用iterate()方法减少查询字段数及数据库访问次数
4)对比list()方法和iterate()方法
2.HQL优化
1)注意避免or、not、like使用不当导致的索引失效
2)注意避免having子句、distinct导致的开销
3)注意避免对索引字段使用函数或进行计算导致的索引失效
五:注解
1.代替hbm.xml文件完成对象-关系映射
2.使用步骤如下:1)使用注解配置持久化类以及对象关联关系
2)在Hibernate配置文件(hibernate.cfg.xml)中声明持久化类
3.注解配置持久化类
注 解 含义和作用
@Entity 将一个类声明为一个持久化类
@Table 为持久化类映射指定表
@Id 声明了持久化类的标识属性
@GeneratedValue 定义标识属性值的生成策略
@SequenceGenerator 定义序列生产器
@Column 将属性映射到列(字段)
@Transient 将忽略这些属性
4.注解配置关联关系
注 解 含义和作用
@OneToOne 建立持久化类之间的一对一关联关系
@OneToMany 建立持久化类之间的一对多关联关系
@ManyToOne 建立持久化类之间的多对一关联关系
@JoinColumn 和@ManyToOne配合,指定外键列
@ManyToMany 建立持久化类之间的多对多关联关系
第八章:Struts 2 入门
一:Struts 2概述
1.优势:1)Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点
2)Struts 2拥有更加广阔的前景,自身功能强大
2.Struts 1 缺点:1)表现层支持单一:无法与视图技术进行整合
2)对Servlet API的依赖:一旦脱离web容器,整个程序将很难完成测试
3)不利于代码重用:与Struts 1的类耦合在一起的代码很难在其他系统中重用
3.Struts 2 的获取
1)Struts 2官方地址:http://struts.apache.org
2)Struts 2 目录结构:1)app:包含官方提供的Struts 2应用案例
2)docs:官方提供的Struts 2 文档
3)lib:Struts 2的发行包及依赖包
4)src:Struts 2对应的源代码
5)其余部分是Struts 2 及其依赖包的使用许可协议和声明
二:Struts 2应用
1.使用Struts 2 开发程序的基本步骤
1)加载Struts 2 类库
2)配置web.xml文件
3)开发视图层页面
4)开发控制层Action
5)配置struts.xml文件
6)部署、运行项目
2.加载Struts2 类库
**************************************************************
文件名 说 明
**************************************************************
struts2-core-xxx.jar Struts 2框架的核心类库
xwork-core-xxx.jar XWork类库,Struts 2的构建基础
ognl-xxx.jar Struts 2使用的一种表达式语言类库
freemarker-xxx.jar Struts 2的标签模板使用类库
javassist-xxx.GA.jar 对字节码进行处理
commons-fileupload-xxx.jar 文件上传时需要使用
commons-io-xxx.jar Java IO扩展
commons-lang-xxx.jar 包含了一些数据类型的工具类
**************************************************************
3.配置web.xml
例子:
struts2
org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
struts2
/* //将全部请求定位到指定的Struts 2过滤器中
4.编写输出页面helloWorld.jsp
例子:
5.编写HelloWorldAction
例子:public class HelloWorldAction implements Action {
// 用户输入的姓名
private String name = "";
// 向用户显示的信息
private String message = "";
public String execute() {
// 根据用户输入的姓名,进行"Hello,XXXX!"的封装
this.setMessage("Hello,"+this.getName()+"!");
// 处理完毕,返回导航结果的逻辑名
return "success";
}
… //省略setter、getter方法
}
6.配置Struts 2配置文件(struts.xml)
例子:
helloWorld.jsp
7.部署、运行项目
8.Struts 2开发小结
1)确认环境:1)是否添加了Struts 2框架支持文件
2)是否配置了Filter
2)编写视图
3)功能实现:编写Action类
4)配置struts.xml文件
5)部署、运行
9.如何使用Struts 2实现用户登录验证?
分析:实现步骤和Struts 2初体验相同,但在控制功能中需要调整具体实现逻辑
1)开发控制层Action-LoginAction
例子:public class LoginAction implements Action {
private String username = "";
private String password = "";
public String execute() {
if("jason".equals(username) &&"2010".equals(password)) {
return "success";
} else {
return "error";
}
}
……//省略getter/setter方法
}
2)配置Struts 2配置文件(struts.xml)
例子:
success.jsp
fail.jsp
三:Struts 2访问Servlet API对象
1.与Servlet API解耦的访问方式
例子: public class LoginAction implements Action {
private static final String CURRENT_USER = "CURRENT_USER";
… //省略username、password属性及其setter和getter方法
public String execute() {
if("jason".equals(username) && "2010".equals(password)) {
Map session = null;
session = ActionContext.getContext().getSession();
if(session.containsKey(CURRENT_USER)) {
session.remove(CURRENT_USER);
}
session.put(CURRENT_USER, username);
return "success";
} else {
return "error";
}
}
}
页面显示:
读取Session中保存的用户名
欢迎您,${sessionScope.CURRENT_USER}!
注意:解耦的方式意味着Action可以摆脱Servlet容器的束缚,可以直接访问所需要的对象。而这些对象被定义成了Map类型,以key-value的形式进行读取。
可以分别如何获取request、session以及application的方法,并强调这些Map对象都保存在ActionContext中。
2.与Servlet API耦合的访问方式
例子:public class LoginAction implements Action {
private static final String CURRENT_USER = "CURRENT_USER";
… //省略username、password属性及其setter和getter方法
public String execute() {
if("jason".equals(username) && "2010".equals(password)) {
HttpSession session = null;
session = ServletActionContext.getRequest().getSession();
if(session.getAttribute(CURRENT_USER) != null) {
session.removeAttribute(CURRENT_USER);
}
session.setAttribute(CURRENT_USER, username);
return "success";
} else {
return "error";
}
}
}
注意:采用耦合的方式访问Servlet API的方式,就是依靠ServletActionContext来进行获取,对象的使用也与之前学习的方式类似。
在实际的应用开发建议采用解耦的方式,这样更加灵活。
四:Struts 2的数据校验
1.Struts 2提供了数据验证机制:
1)继承ActionSupport类来完成Action开发
2)ActionSupport类不仅对Action接口进行简单实现,同时增加了验证、本地化等支持
2.修改LoginAction
例子:public class LoginAction extends ActionSupport{
//......省略代码
public void validate() {
if(this.getUsername().length()==0){
addFieldError("name","用户名不能为空");
}
if(this.getPassword().length()==0){
addFieldError("pwd", "用户密码不能为空");
}
}
//......省略代码
}
五:Struts 2标签
1.在JSP页面导入Struts 2标签库语法
<%@ taglib prefix="s" uri="/struts-tags"%>
2.Struts 2标签主要分为两大类:Struts 2标签分为UI标签和通用标签
3.UI标签:
常用表单标签
**************************************************
标 签 说 明
**************************************************
… 表单标签
… 文本输入框
… 密码输入框
… 文本域输入框
… 单选按钮
… 多选框
提交标签
重置标签
隐藏域标签
常用非表单标签
**************************************************
标 签 说 明
**************************************************
显示Action错误
显示Action消息
显示字段错误
**************************************************
4.修改JSP页面
例子:<%@ taglib prefix="s" uri="/struts-tags"%>
…
用户名:
密码:
注意:关于标签,该标签与Action中的addFieldError()方法对应,能够将addFieldError()中保存的数据在页面输出显示。
此外,在页面展示时,还可以通过查看页面源代码的方式展示使用表单标签最终会被解释成标签,只不过会多了
一些的标签,这些标签是Struts 2自动生成。可以通过设置模板风格来进行修改,在struts.xml文件中添加
。
5.常用通用标签
名称 标 签 说 明
…… 根据表达式的值,
条件标签 …… 判断将要执行的内容
……
迭代 …… 用于遍历集合
1)条件判断标签
语法:
需要执行的代码
需要执行的代码
需要执行的代码
注意:表达式条件为true时,执行相应的代码
2)迭代标签
语法:
读取集合对象并输出显示
a.value属性:需要进行遍历的集合对象
b.status属性:当前迭代元素的IteratorStatus实例
c.id属性:当前迭代元素的id,可直接访问元素,该参数可选
注意;标签只是实现了集合的遍历,如果希望将集合数据输出,还是要使用标签来完成输出显示。
第九章:Struts 2配置详解
一:Struts 2执行过程解析
1.分析登录程序:需经以下几个步骤
1)获取Struts 2资源
2)在应用程序中导入Struts 2的类库
3)在web.xml文件中配置StrutsPrepareAndExecuteFilter
4)编写Action类并进行配置
5)配置返回结果与屋里视图的关系
6)编写结果视图
2.web.xml:是所有JavaWeb应用程序都需要的核心文件
例子:
index.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
注意:StrutsPrepareAndExecuteFilter作为一个filter在Web应用中运行,他负责拦截所有的用户请求,当用户请求到达时,
该filter会过滤用户请求,如果用户请求以.action结尾,该请求将被输入Struts 2框架进行处理
3.Action
由两部分组成:1)核心控制器(Filter):用于拦截用户请求,对请求进行处理
2)业务控制器(Action):调用相应的业务处理,返回结果
例子:
<-- 处理错误路径配置--!>
MyJsp.jsp
<-- 处理业务逻辑配置--!>
<-- 结果为success,跳转login.jsp页面--!>
login.jsp
<-- 结果为error,跳转index.jsp页面--!>
index.jsp
4.Result:实现结果视图的调用,并决定试图以哪种形式展现给客户端
Struts 2的执行过程
1)当Web容器接收到请求后,将请求交由在web.xml中配置的Struts 2 框架的控制器StrutsPrepareAndExecuteFilter(核心控制器)
2)由StrutsPrepareAndExecuteFilter确定请求对应的Action(业务控制器)
3)框架根据Action返回的结果字符串,由StrutsPrepareAndExecuteFilter(核心控制器)选择对应的result,将结果呈现给用户
5.Struts 2 的配置文件
1)struts.xml:核心文件就是struts.xml配置文件
例子:
//用于配置常量
注意:处理中文乱码问题,在struts.xml中设置常量的方式解决
例子:
2)拆分配置文件
一旦拆分后,还要能够将拆分过的文件整合在一起,可以在struts.xml文件中通过include元素将其他配置文件包含起来,include元素提供了
file属性,该属性指定了被包含配置文件的文件名
例子:
//省略其他配置项
3)Struts-default.xml
是Struts 2框架的默认配置文件,会自动加载
4)Struts-plugin.xml
是Struts 插件使用的配置文件
二:Action的配置
1.1)封装工作单元
可以把Action看作控制器的一部分,主要职责就是控制业务逻辑,通常Action使用execute()方法实现这一功能
例子: public class loginAction implements Action {
//省略属性的getter和setter方法
private String userName;
private String userPwd;
private String message;
private List
2.method属性:默认执行该方法
在Struts.xml中配置
例子:
MyJsp.jsp
3.Action中动态方法调用
通过在Action的名称中使用感叹号(!)来标识要调用的方法和名称,格式为actionName!methodName.action
4,Action中通配符的使用
通配符用星号(*)表示,用于配置0个或多个字符串,可以在action元素的name属性中使用*号来匹配任意的字符串
5.配置默认的Action
例子:
<-- 处理错误路径配置--!>
MyJsp.jsp
三:Result的配置
1.dispatcher类型:默认的结果类型,用来转发请求,原请求数据不会丢失
2.redirect类型:在内部使用HttpServletResponse对象的sendRedirect()方法将请求重定向指定的URL,
请求中包含着参数,属性,Action实例及封装的属性将全部消失
3.rediectAction类型:用于重定向到另一个Action,原请求数据会丢失
4.动态结果:在配置时使用表达式,在运行时,由框架根据表达式的值来确定要使用那个结果
5.全局结果:这个包中的所有Action都可以共享这个结果
例子:
/page/error.jsp
/page/login.jsp
//省略代码
你可能感兴趣的:(ssh详细总结)