SSH

一、Oracle数据库基础

Oracle数据库的主要特点如下:

(1)支持多用户、大事务量的事务处理。

(2)在保持数据安全性和完整性方面性能优越。

(3)支持分布式数据处理。将分布在不同物理位置的数据库用通信网络连接起来,在分布式数据库管理系统的控制下,组成一个逻辑上统一的数据库,完成数据处理任务。

(4)具有可移植性。Oracle可以在Windows、Linux等多个操作系统平台上使用,而SQL Server只能在Windows平台上运行。

 

Oracle数据库的结构

1>逻辑结构

数据库-->表空间-->数据段-->数据区间-->数据块

2>物理结构

数据文件(dbf):存储数据的

日志文件(log):记录数据库操作的日志信息

控制文件(ctl):记录物理文件的信息(位置,大小,创建时间)

 

Oracle数据类型

  字符数据类型

    1.CHAR数据类型

    当需要固定长度的字符串时,使用CHAR数据类型。

    2.VARCHAR2数据类型

    VARCHAR2数据类型支持可变长度的字符串。

    3.NCHAR数据类型

    NCHAR,即国家字符集,使用方法和CHAR相同。如果开发的项目需要国际化,那么数据类型选择NCHAR数据类型。

  数值数据类型

    NUMBER数据类型可以存储正数、负数、零、定点数和精度为38位的浮点数。

  日期时间数据类型

    1.DATA数据类型

    DATA数据类型用于存储表中的日期和时间数据。

    2.TIMESTAMP数据类型

    TIMESTAMP数据类型用于存储日期的年、月、日,以及时间的小时、分和秒,其中秒值精确到小数点后6位,该数据类型同时包含时区信息。

  LOB数据类型

    1.CLOB

    能够存储大量字符数据

    2.BLOB

    可以存储较大的二进制对象

    3.BFILE

    能够将二进制文件存储在数据库外部的操作系统文件中

    4.NCLOB

    用于存储大的NCHAR字符数据

Oracle中的表可以有多个LOB列,每个LOB列可以是不同的LOB类型。

Oracle中的伪列

伪列就像Oracle中的一个表列,但实际上它并未存储在表中。伪列可以从表中查询,但是 不能插入、更新或删除他们的值。

1.ROWID

数据库中的每行都有一个行地址,ROWID伪列返回该行地址。可以使用ROWID值来定位表中的一行。通常情况下,ROWID值可以唯一的标识数据库中的一行。

ROWID伪列有以下重要的用途:

  能以最快的方式访问表中的一行。

  能显示表的行是如何存储的。

  可以作为表中行的唯一标识。

2.ROWNUM

对于一个查询返回的每行,ROWNUM伪列返回一个数值代表行的次序。

 

SQL语言简介

  数据库定义语言(DDL):CREATE(创建)、ALTER(更改)、TRUNCATE(截断)、DROP(删除)

  数据操纵语言(DML):INSERT(插入)、SELECT(选择)、DELETE(删除)、UPDATE(更新)

  事务控制语言(TCL):COMMIT(提交)、SAVEPOINT(保存点)、ROLLBACK(回滚)

  数据控制语言(DCL):GRANT(授予)、REVOKE(回收)

 

SQL操作符

  1.算术操作符

    查询语句中要执行基于数值的计算。算数操作符包括:+(加)、-(减)、*(乘)、/(除)。

  2.比较操作符

    用于比较两个表达式的值。比较操作符包括:=、!=、<、>、<=、>=、BETWEEN、AND(检查是否在两个值之间)、IN(与列表中的值相匹配)、LIKE(匹配字符模式)、IS NULL(检查是否为空)。

  3.逻辑操作符

    用于组合多个比较运算的结果以生成一个或真或假的结果。逻辑运算符包括AND(与)、OR(或)、NOT(非)。

  4.集合操作符

    将两个查询的结果组合成一个结果集。

    UNION操作符返回两个查询选定的所有不重复的行。

    UNION ALL操作符合并两个查询选定的所有行,包括重复的行。

    INTERSECT操作符只返回两个查询所有的行。

    MINUS操作符只返回由第一个查询选定而未被第二个查询选定的行。

  5.连接操作符

    连接操作符(||)用于将两个或多个字符串合并成一个字符串,或者将一个字符串与一个数值合并在一起 。

 

SQL函数分为单行函数、聚合函数和分析函数。

 

二、Oracle数据库应用

 

1>创建用户

 

create user 用户名 identified by 密码

 

[default tablespace 表空间的名称]

 

分析:1>创建用户时,用户使用的表空间应存在,如果不存在则要先创建

 

表空间;

 

2>表空间也有内置的,也可以创建表空间

 

3>如果创建用户时没有指定表空间,那么该用户默认使用user表空间

 

eg:

 

javasmart/manager--->newtablespace(c:/.../javasmart.dbf)

 

如果用javasmart进入orcl数据库后所存储的数据在javasmart.dbf中

 

当新建一个新用户后,当前这个新用户还不能连接数据库;还需要管理员授权后方可连接数据库

 

grant connect to 新用户;

 

当然授权后也可以撤消权限

 

revoke connect from 用户

 

sqlplus / as sysdba

 

2>更改用户的表空间及密码

 

alter user 用户名 identified by 密码

 

[default tablespace 表空间的名称]

 

3>删除用户

 

drop user 用户名 [cascade]

 

分析:如果加上cascade表示级联删除;

 

4>用户锁定与解锁

 

锁定:alter user 用户名 account lock;

 

解锁:alter user 用户名 account unlock;

 

5>创建表空间

 

create tablespace 表空间的名称 datafile 数据文件 size 大小(M)

 

6>删除表空间

 

drop tablespace 表空间名称 [including datfiles and contents]

 

7>修改表空间

 

alter tablespace 表空间名称 datafile 数据文件 size 大小(m)

 

8.>数据库的删除

 

universal installer

 

9.>新建数据库

 

dbca | DataBase Configuration Assiant

 

表空间的可分为三类:永久性表空间、临时性表空间、撤销表空间。

表空间的目的:

(1)对不同用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户数据的操作,对模式对象的管理。

(2)可以将不同数据文件创建到不同磁盘中,有利于管理磁盘空间,有利于提高I/O性能,有利于备份和恢复数据等。

 

 


系统权限

 

    系统权限是指被授权用户是否可以连接到数据库上及在数据库中可以进行哪些系统操作。

 

    系统权限是在数据库中执行某种系统级别的操作,或者针对某一类的对象执行的某种操作的权利。

 

    下面列举4个常见的系统权限:

 

        1) create session:连接到数据库。

 

        2) create table:创建表。

 

        3) create view:创建视图。

 

        4) create sequence:创建序列。


对象权限

 

    对象权限是指用户对数据库中具体对象所具有的权限。

 

    对象权限是针对某个特定的模式对象执行操作的权利,只能针对模式对象来设置和管理对象权限。

 

    Oracle数据库用户有两种途径获得权限。

 

        1.管理员直接向用户授予权限。

 

        2.管理员将权限授予角色,然后再将角色授予一个或多个用户。(角色可以理解为一组权限的“集合”)

 

    授予权限语法:

 

        grant 权限|角色 to 角色名;

 

    撤销权限语法:

 

        revoke 权限|角色 from 用户名;

 

    数据库用户安全设计原则:

 

        1.数据库用户权限按照最小分配原则。

 

        2.数据库用户分为管理、应用、维护、备份四类用户。

 

        3.不允许使用sys和system用户创建数据库应用对象。

 

        4.禁止将dba权限赋予用户。


Oracle系统预定义角色

 

    1.connect:适用于需要连接上数据库的用户,特别是不需要创建表的用户。

 

    2.resource:适用于更为可靠和正式的数据库用户。可以创建表、触发器、过程等。

 

    3.dba:数据库管理员角色,拥有管理数据库的最高全向。一个具有dba角色的用户可以撤销任何其他用户甚至其他dba权限,一般情况下,最好不要对用户授予这个角色。

 

序列

 

序列是一种数据库对象,用来自动产生一组唯一的序号。

 

序列是一种共享式的对象,多个用户可以共同使用序列中的序号。

一般将序列应用于表的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键列的值不会重复。

用这种方式可以代替在应用程序中产生主键值的方法,可以获得更可靠的主键值。

注:在序列指定最大值和可循环属性后,序列中的序号是可以循环使用的。

默认情况下,用户可以在自己的模式中创建序列。如果希望在其他用户的模式中创建序列,
则必须具有CREATE ANY SEQUENCE这个系统权限。

创建序列的命令为CREATE SEQUENCE

修改序列的命令是ALTER SEQUENCE。

用户可以修改自己的序列,如果希望修改其他用户的序列,则需要具有ALTER ANY SEQUENCE这个系统权限。
ALTER SEQUENCE命令的用法与CREATE SEQUENCE命令的用法基本相同,只要将关键字CREATE替换为ALTER即可。

删除序列的命令是DROP SEQUENCE。

用户可以删除自己创建的序列,如果要删除其他用户的序列,则要具有DROP ANY SEQUENCE 系统权限。
序列被删除后,它的相关信息就被从数据字典中删除。

 

同义词

同义词是一种数据库对象,它是为一个数据库对象定义的别名,使用同义词的主要目的是为了简化SQL语句的书写。

同义词用途:

 

 

 

(1)简化SQL语句。

(2)隐藏对象的名称和所有者。

(3)为分布式数据库的远程对象提供了位置透明性。

(4)提供对对象的公共访问。

同义词可分为两类:私有同义词和公有同义词

1.私有同义词

  私有同义词只能被当前模式的用户访问,且私有同义词名称不可与当前模式的对象名称相同。

2.公有同义词

  公有同义词可被所有的数据库用户访问。公有同义词可以隐藏数据库对象的所有者和名称,并降低SQL语句的复杂性。

私有同义词和公有同义词的区别:

私有同义词只能在当前模式下访问,且不能与当前模式的对象同名。

公有同义词可被所有的数据库用户访问。

 

 

同义词的创建和删除

 

用户可以在自己的模式中创建同义词,这时需要具有CREATE SYNONYM这个系统权限。
如果希望在其他用户的模式中创建同义词,则需要具有CREATE ANY SYNONYM这个系统权限。

 

普通用户如果希望创建公有同义词,需要具有CREATE PUBLIC SYNONYM系统权限。

 

创建私有同义词的命令是CREATE SYNONYM ,它的语法规则为:

 

CREATE SYNONYM 同义词 FOR 用户名.对象名;

 

创建公有同义词的语法格式为:

 

CREATE SYNONYM 同义词 FOR 用户名.对象名;

 

删除同义词的命令是DROP SYNONYM,这条命令的语法格式为:
DROP SYNONYM 同义词名;

注:如果要删除公有同义词的话,要在关键字SYNONYM之前加上关键字PUBLIC。

一个用户可以删除自己创建的同义词,如果要删除其他用户创建的同义词,则要具有DROP ANY SYNONYM 系统权限。
DBA 可以删除所有的公共同义词,普通用户需要具有DROP PUBLIC SYNONYM系统权限,才能删除公共同义词。
同义词被删除以后,它的相关信息也将从数据字典中删除。

 

 

索引分类
  按存储方法分类
B*树索引:B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。

位图索引:位置索引储存在主要用来节省空间,减少Oracle对数据块的访问,它采用位图偏移方式来与表的行ID对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,Oracle每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。

按功能分类
唯一索引:唯一索引有两个作用,一个是数据约束,一个是数据索引。其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。
主关键字索引:主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。
一般索引:一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。

按索引对象分类
单列索引(表单个字段的索引)
多列索引(表多个字段的索引)
函数索引(对字段进行函数运算的索引)

数据库的索引分为:聚集索引,非聚集索引,唯一索引。

2. 索引优点

优点:方便了查询,在数据量大时排序更易查询

3. 索引缺点

缺点:查询时需要进行重新排序,减少了效率。
物理索引缺点:建立索引效率低,只能建一个

4. 索引作用

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

 

表分区的优缺点

Oracle允许用户把一个表中的所有行为分为几个部分,并将这些部分存储在不同的位置。被分区的表成为分区表,分成的每个部分称为一个分区。

表分区有以下优点:

 

   1) 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

 

     2) 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

 

     3) 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;

 

    4) 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

  缺点:
分区表相关:已经存在的表没有方法可以直接转化为分区表。

  什么时候使用分区表:
1、表的大小超过2GB。
2、表中包含历史数据,新的数据被增加都新的分区中。

分区方法包括范围分区、散列分区、列表分区、复合分区、间隔分区、虚拟列分区。

 

三、PL/SQL编程

PL/SQL是结合了Oracle过程语言和结构化查询语言的一种扩展语言。

PL/SQL的优点:

(1)PL/SQL具有编程语言的特点,他能把一组SQL语句放到一个模块中,使其更具模块化程序的特点。

(2)PL/SQL可以采用过程性语言控制程序的结构。

(3)同其他的编程语言一样,PL/SQL可以对程序中的错误进行自动处理,使程序能够在遇到错误时不会中断,即他的异常处理机制。

(4)PL/SQL程序块具有更好的可移植性,可以移植到另一个Oracle数据库中。

(5)PL/SQL程序减少了网络的交互,,有助于提高程序性能。

一个PL/SQL块由三部分组成,即声明部分、执行部分、异常处理部分。

PL/SQL语言支持的操作符包含关系运算符、一般运算符、逻辑运算符。

PL/SQL数据类型

1.标量数据类型

  标量数据类型包含单个值,没有内部组件。标量数据类型包含数字、字符、布尔值和日期时间值四类。

2.LOB数据类型

  Oracle提供了LOB数据类型,用于存储大的数据对象的类型。

3.属性类型

  属性用于引用变量或数据库列的数据类型,以及表示表中一行的记录类型。

  1)%TYPE

  定义一个变量,其数据类型与已经定义的某个数据变量的数据类型相一致,这是可以使用%TYPE。

  优点:

  (1)可以不必知道所引用的数据库列的数据类型。

  (2)所引用的数据库列的数据类型可以实时改变,容易保持一致,不用修改PL/SQL程序。

  2)%ROWTYPE

  返回一个记录类型,其数据类型和数据库表的数据结构相一致,这时可以使用%ROWTYPE。

  优点:

  (1)可以不必知道所引用的数据库中列的个数和数据类型。

  (2)所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,不用修改PL/SQL。

PL/SQL控制语句

PL/SQL程序可通过控制结构来控制命令执行的流程。

控制结构共有三种类型:条件控制、循环控制、顺序控制。

 

异常处理

在运行程序时出现的错误叫异常。

异常情况处理用来处理正常执行过程中未预料的事件。

用户自定义异常步骤:

(1)在PL/SQL块的定义部分定义异常情况。

(2)抛出异常情况。

(3)在PL/SQL块的异常情况处理部分对 异常情况做出相应的处理。

 

游标

 

1.什么是游标

 

为了处理SQL语句,ORACLE必须分配一片内存区域,这就是上下文区域(context area)。上下文区域包含了完成该处理所必需的信息,其中包括语句要处理的行的数目、一个指向语句被分析后产生的表示形式的指针,以及查询的活动集(active set,这是查询返回的行的集合)。

 

游标(cursor)就是一个指向上下文区域的句柄(handle)或指针。通过游标,PL/SQL程序可以控制上下文区域和在处理语句时上下文区域会发生些什么事情。

 

2.显式游标

 

处理显式游标包括四个PL/SQL步骤

 

1)声明游标

 

2)为查询打开游标

 

3)将结果提取(fetch)到PL/SQL变量中

 

4)关闭游标

 

fetch语句有两种形式

 

1) fetch cursor_name into list_of_variables;

 

2) fetch cursor_name into PL/SQL_record;

 

这里cursor_name标识了已经被声明并且被打开的游标,list_of_variables是已经被声明的PL/SQL变量的列表(变量之间用逗号隔开),而PL/SQL_record是已经被声明的PL/SQL记录。

 

游标的四个属性

 

1)%FOUND 一个布尔属性。如果前一个FETCH语句返回一个行,那么它就会返回TRUE,否则的话,它会返回FALSE。如果在未打开游标以前就设置了%FOUND,那么会返回ORA-1001(无效的游标)。

 

2)%NOTFOUND 行为方式和上面的%FOUND正好相反。如果前一个FETCH语句返回一个行,那么%NOTFOUND就会返回FALSE。仅当前一个FETCH语句没有返回任何行,%NOTFOUND才会返回TRUE。

 

3)%ISOPEN 此布尔属性用来决定相关的游标是否被打开了。如果被打开了则返回TRUE,否则返回FALSE。

 

4)%ROWCOUNT 此数字属性返回到目前为止由游标返回的行的数目。如果在相关的游标还未打开的时候进行引用,那么会返回ORA-1001错误。

 

四、Hibernate入门

Hibernate框架的优点:
1) 对象/关系数据库映射(ORM), 使用时只需操纵对象,使开发更加面向对象化;
 2) 无入侵性;
3) 简洁的HQL语句,减少了JDBC与SQL操作数据库的代码量;
4) 移植性好;

Hibernate框架的缺点:

1)不适合以数据为中心大量使用存储过程的应用。

2)大规模的批量插入、修改和删除不适合用Hibernate。

 

1、什么是hibernate

 

hibernate是免费开源的框架,是一个OR-Mapping映射工具, 将实体类和数据库表形成映射关系,是一个优秀的持久层解决方案,hibernate对jdbc进行了封装,我们不需要再关心底层实现,只需要关系具体的业务实现即可。

 

hibernate核心类和接口

 

Configuration类: 加载hibernate.cfg.xml配置文件

 

SessionFactory接口:会话工厂,可以得到会话

 

Session接口: 会话,操作CRUD增删改查

 

Transaction接口: 事务,开启事务,提交事务,关闭事务

 

2、hibernate工作原理

 

通过Configuration对象加载hibernate.cfg.xml配置文件,

 

hibernate.cfg.xml配置文件主要管理数据库连接相关信息与实体类和数据库表的映射关系,所以当加载hibernate.cfg.xml配置文件的时候把实体类和数据库表之间建立了映射关系,然后调用buildSessionFactory()方法得到数据库连接的会话工厂sessionFactory,再通过会话工厂得到session会话,通过session会话开启事务,然后执行CRUD操作,再进行事务提交,最后关闭session会话。

 

3、为什么要用hibernate

 

hibernate是一个优秀的持久层解决方案,提供了标准化模版,能够为开发人员提高开发效率。

 

4、hibernate和jdbc的区别

 

查询效率:jdbc因为直接操作数据库,所以查询效率相比hibernate要高,

 

hibernate要对实体类和数据库表字段之间做映射关系的维护,所以查询效率相对来说要低。

 

开发效率:jdbc相当于手动式,SQL代码和封装都需要手动完成,而hibernate相当于自动化,由于对jdbc进行封装,所以底层代码不需要开发人员编写,所以开发效率hibernate要高。

 

5、Hibernate和MyBatis的区别?

 

1.Hibernate是全自动的ORM框架 而MyBatis是半自动的ORM框架

 

2.MyBatis 是一个基于DAO层处理的ORM框架 SQL语句和实体映射

 

Hibernate 是一个基于DAO层处理的ORM框架 表和实体的映射

 

3.Hibernate是一个重量级框架 适用于大中型项目

 

MyBatis是一个轻量级框架 适用于中小型项目 尤其是当下的互联网项目

 

4.Hibernate封装的比较好,而MyBatis比较灵活

 

 

 

 

主键生成策略

 

常用主键的生成策略如下:

 

4.1.increment:对类型为long short 或 int的主键,以自动增长的方式生成主键的值。主键按数值顺序递增,增量为1.

 

4.2.identity:对如SQLServer、DB2、MySQL等支持标识列的数据库,课使用该主键生成策略生成自动增长主键,但要在数据库中将该主键设置为标识列。

 

4.3.sequence:对如Oracle、DB2等支持序列的数据库,可使用该主键生成策略生成自动增长主键,通过子元素param传入数据库中序列的名称。

 

4.4.native:由Hibernate根据底层数据库自行判断采用何种主键生成策略,即由使用的数据库生成主键的值。

 

4.5.assigned:主键由应用程序负责生成,无需Hibernate参与

 

Hibernate中java对象的三种状态

Hibernate框架通过Session来管理Java对象的状态

瞬时状态 new对象/delete

通过new创建对象后,没有存储到数据库,此时java对象的状态为瞬时状态。

持久状态 get、load/save/update

当对象与Session关联,被Session管理时,他就处于持久状态。

对象与Session关联:

1.通过Session查询接口,或者get()|load()

2.通过调用Session的save()|SaveOrUpdate()

游离状态 evict、clear、close

处于持久状态的对象,脱离与其关联的Session管理后,对象就处于游离状态。

Session提供两个方法(update() merge())将处于游离状态的对象与一个新的Session发生关联

三种状态之间的转换

1.瞬时状态转换为持久状态

使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态

使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态

2.持久状态转换为瞬时状态

执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联

3.持久状态转为游离状态

执行了Session对象的evict()、clear()或close()方法,对象由原来的持久状态转为游离状态

4.游离状态转为持久状态

重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session对象关联

5.游离状态转为瞬时状态

执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

处于瞬时状态或游离状态的对象不再被其他对象引用时,会被Java虚拟机安装垃圾回收机制处理。

 

脏检查和刷新缓存

脏检查:session中的对象信息与数据库不一致

刷新缓存:解决session中的对象信息与数据库不一致的情况

实现:flush()、commit()

Session是Hibernate向应用程序提供的操纵数据库的主要接口,它提供了基本的保存、更新、删除和加载Java对象的方法。Session具有一个缓存,可以管理和跟踪所有持久化对象,对象和数据库中的相关记录对应。在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对象包含的编号数据更新到数据库中,这一过程称为刷新缓存,换句话说就是将Session缓存同步刷新为与数据库一致。

1.脏检查

在Hibernate中,状态前后发生变化的对象,称为脏对象。

当事务提交时,Hibernate会对Session中持久状态的对象进行检测,判断对象的数据时候发生了改变,这种判断称为脏检查。

Hibernate为什么要进行脏检查呢?

因为如果对象发生了改变,就需要将改变更新到数据库中,以确保内存中的对象与数据库中的数据保持一致。

Session是如何进行脏检查的呢?

当一个Dept对象被加入到Session缓存中时,Session会为Dept对象的值类型的属性复制一份快照。当Session刷新缓存是,会先进行脏检查,即比较Dept对象的当前属性与它的快照,来判断Dept对象的属性是否发生了变化。如果发生了变化,Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中。

2.刷新缓存机制

当Session缓存中对象的属性每次发生变化时,Session并不会立即刷新缓存和执行相关的SQL语句,而是在特定的时间点才刷新缓存。这使得Session能够把几条相关的SQL语句合并为一条或者一批SQL语句,减少了访问数据库的次数,从而提高应用程序的数据访问性能。

Session在何时刷新缓存呢?

1.当应用程序调用Transcation的commit()方法时,commit()方法先调用Session的刷新缓存方法flush(),然后向数据库提交事务。Hibernate之所以把刷新缓存时间点安排在事务快结束时,一方面是因为可以减少访问数据库的频率,林一方面是因为可以尽可能缩短当前事务对数据库中相关资源的锁定时间。

2.当应用程序显示调用Session的flush()方法时,刷新缓存。

Session的flush()方法和Transaction的commit()方法的区别?

flush()方法进行刷新缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。

sava、update、savaOrUpdate、merge的区别?

save()方法用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中;

update()方法用于将一个游离对象重新转变为持久化对象,也就是更新一个已经存在的业务实体到数据库中;

saveOrUpdate()兼具了save()和update()方法的功能,该方法根据传入参数的状态执行不同的操作,当为临时状态时,调用save()方法;当为持久化状态时,则直接返回;当为游离状态时,调用update()方法。

merge()方法主要用于更新和保存实体,当实体不存在时,则执行保存操作,当实体已经存在时,执行更新操作,其实同saveOrUpdate()的功能是类似的。

update 和 merge的区别

首先在执行更新操作的时候,两者都必须要有id

update是直接执行update 语句,执行后状态为持久化状态

而merge则不一样:

1. 如果session中有与之对应的对象,也就是主键相同,则会把要保存的obj的值copy给session中的对象,然后update被复制后的session中的对象

2. 如果session中没有,则会先从数据库中select,然后把obj给查出来的对象copy,则update查出来的对象。

3. 所以merge会先select 再update

4. 所以merge后原来的对象状态为游离。

save 和update区别

把这一对放在第一位的原因是因为这一对是最常用的。

save的作用是把一个新的对象保存

update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库

update 和saveOrUpdate区别

这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别

通常下面的场景会使用update()或saveOrUpdate():

程序在第一个session中加载对象,接着把session关闭

该对象被传递到表现层

对象发生了一些改动

该对象被返回到业务逻辑层最终到持久层

程序创建第二session调用第二个session的update()方法持久这些改动

saveOrUpdate(po)做下面的事:

如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事

如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常


五、HQL实用技术

Hibernate支持三种查询方式:HQL查询、Criteria查询及原生 SQL查询。

HQL是面向对象的查询语句,在Hibernate提供的各种查询方式中,HQL是使用最广的一种查询方式。

执行HQL语句需要使用Query接口,Query也是Hibernate的核心接口之一,执行HQL的两种常用方法是list()方法和iterate()方法。

执行HQL语句的步骤:

(1)获取Session对象

(2)编写HQL语句

(3)创建Query对象

(4)执行查询,得到查询结果

HQL的参数绑定有以下两种形式:

1.按参数位置绑定

2.按参数名称绑定

通过Query接口的setFirstResult(int firstResult)方法和setMaxResults(int maxResults)方法实现分页。

投影查询就是想查询某一字段的值或者某几个字段的值

 

六、Hibernate关联映射

对象间的关联分为一对多、多对一和多对多等几种情况,关联是有方向的,可以是双向的关联,也可以是单向的关联。

Hibernate通过配置的方式,将对象见的关联关系映射到数据库上,方便完成多表的持久化操作。

使用<set>元素和<one-to-many>元素配置一对多关系,<set>元素常用属性如下:

1.name:关联类属性的名称,是必须填写,没有默认值。

2.table:关联类的目标数据库表,可以不关联数据表,没有默认值。

3.lazy:指定关联对象延迟加载策略,默认为true.

4.fetch:设置抓取数据的策略,默认为select.

5.inverse:描述对象之间关联关系的维护方式,默认为false.

<set>节点的inverse属性描述了由哪一方负责维系关系联系;cascade属性描述了级联操作的规则。

cascade属性:

  1.all :对象所有操作进行级联操作 save,update,delete
  2.save-update : 执行保存和更改操作时进行级联操作
  3.delete : 执行删除操作时进行级联操作
  4.none : 对所有操作不进行级联操作 默认

Hibernate提供了延迟加载策略,主要分为类级别、一对多和多对多关联,以及多对一关联加载策略。

Open Session In View模式的主要思想是:在用户的每次请求过程中,始终保持一个Session对象处于开启状态。

 

七、HQL连接查询和注解

HQL支持左外连接、迫切左外连接、内连接、迫切内连接及右外连接等连接查询。

连接类型:

  内连接 inner join 或join

  迫切内链接 inner join fetch

  左外联结 left outer join 或 join

  迫切左外连接 left outer join fetch 或 left join fetch

  右外连接 right outer join 或 right join

Hibernate查询优化策略:

1.使用迫切左外连接或迫切内连接查询缓存方式,减少select语句的数目,降低访问数据库的频率。

2.使用延迟加载策略方式避免加载多余的不需要访问的数据。

3.使用Query接口的iterator()方法减少select语句中的字段,从而降低访问数据库的数据量。

HQL优化:

HQL优化是Hibernate程序性能优化的一个方面,HQL的语法与SQL非常相似。HQL是基于SQL的,只是增加了面向对象的封装。如果抛开HQL同Hibernate本身一些缓存机制的关联,HQL的优化技巧同SQL的优化技巧一样。在编写HQL时,需注意以下几个原则:

(1)避免or操作的使用不当

(2)避免使用not

(3)避免使用like的特殊形式,例如 “%”或者”_”开头

(4)避免having字句

(5)避免distinct

(6)索引在以下情况下失效,应注意使用

1.只要对字段使用函数,该字段的索引将不起作用,如substring(aa,1,2)=’xx’

2.只要对字段进行计算,该字段的索引将不起作用,如Price+10

HQL常用聚合函数:

(1)count():统计记录条数

(2)sum():求和

(3)min():求最小值

(4)max():求最大值

(5)avg():求平均值

HQL查询语句使用group by子句进行 分组查询,使用having子句筛选分组结果。

使用Hibernate注解的步骤如下:

(1)使用注解配置持久化类及对象关联关系。

(2)在Hibernate配置文件(hibernate.cfg.xml)中声明持久化类。

配置持久化类的常用注解:
@Entity 将一个类声明为一个持久化类
@Id 声明了持久化类的标识属性(相当于数据表的主键)
@GeneratedValue 定义标识属性值的生成策略
@Table 为持久化类映射指定表(table)。目录(catalog)和schema的名称。默认值:持久化类名,不带包名
@UniqueConstraint 定义表的唯一约束
@Lob 表示属性将被持久化为Blob或者Clob类型
@Column 将属性映射到列
@Transient 忽略这些字段和属性,不用持久化到数据库

@GeneratedValue 定义标识属性值的生成策略,JPA提供了4种标准用法
  (1) AUTO:根据不同的数据库选择不同的策略
  (2) TABLE:使用表保存id值
  (3) INDENTITY:使用数据库自动生成主键
  (4) SEQUENCE:使用序列创建主键

注解配置对象关联关系:
  @OneToOne 建立持久化类之间的一对一关联关系
  @OneToMany 建立持久化类之间的一对多关联关系
  @ManyToOne       建立持久化类之间的多对一关联关系
  @ManyToMany  建立持久化类之间的多对多关联关系

cascade属性指定级联操作
  1.CascadeType.remove:连接删除
  2.CascadeType.persist:persist()方法级联
  3.CascadeType.merge:级联更新
  4.CascadeType.refresh:级联刷新
  5.CascadeType.all:包含所欲有级联操作

 

 

八、Struts 2入门

Struts 2是以WebWork设计思想为核心,在吸收了Struts 1部分优点的基础上设计出来的新一代MVC框架。

Struts 2 相比Struts 1的优点:

1、在软件设计上Struts 2 没有像Struts 1那样跟Servlet API 和 struts API 有着紧密的耦合。Struts 2的应用可以不依赖于Servlet API和Struts API 。

2、Struts 2 提供了拦截器,利用拦截器可以进行AOP编程。

3、Struts 2 提供了类型转换器。

4、Struts 2 提供支持多种表现层技术,如:JSP 、 freeMarker等。

5、Struts 2 的输入校验可以指定方法进行校验。

6、Struts 2 提供了全局范围、包范围和Action范围的国际化资源文件管理实现。

 

Struts 2 体系结构 :

  1、Web浏览器请求一个资源。

  2、过滤器Dispatcher查找方法,确定适当的Action。

  3、拦截器自动对请求应用通用功能,如验证和文件上传操作。

  4、Action的execute方法通常用来存储和重新获得信息。

  5、结果被返回到浏览器。

 

基本简要流程:

1、客户端浏览器发出HTTP请求。

2、根据web.xml配置,该请求被FilterDispatcher接收。

3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。

4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。

5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

6、返回HTTP响应到客户端浏览器。

 

与Servlet API解耦的访问方式:

  1.通过ActionContext类进行访问。

  2.Struts 2向Action注入。

与Servlet API耦合的访问方式:

  1.通过ServletActionContext类进行访问。

  2.Struts 2向Action注入。


Struts 2数据校验:

1. 用validate()方法实现数据校验

继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。

2.用execute()方法实现数据校验

继承自ActionSupport类,重写execute()。继承该类是因为它实现了Validateable接口,才能实现数据校验

相对于Validate()方法不同之处就是对hasErrors进行了判定,判定FieldError对象中是否有错误信息,若有错误信息,返回input

3.用validateXxx()方法实现数据校验
在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。 针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式。

一般在字段判定比较多的情况下,可以使用这种方式实现数据校验。

Struts 2标签主要分为两大类:即UI标签和通用标签。

Struts 2的UI标签可分为三类:表单标签、非表单标签、Ajax标签。

通用标签用来在页面表示的时候控制代码执行的过程,这些标签也允许从Action或者值堆栈中取得数据。


九、Struts 2配置详解

1.在Struts 2框架中,控制器由两部分组成:

核心控制器:用于拦截用户请求,对请求进行处理 ------StrutsPrepareAndExecuteFilter
业务控制器:调用相应的Model类实现业务处理,返回结果

2.Result
作用:实现结果视图的调用,并决定视图以哪种形式展现给客户端

3.Struts 2的执行过程

(1)当Web容器接收到请求后,将请求交由在web.xml中配置的Struts 2框架的控制器 StrutsPrepareAndExecuteFilter(核心控制器)。
(2)由StrutsPrepareAndExecuteFilter确定请求对应的Action(业务控制器)。
(3)框架根据Action返回的结果字符串,由StrutsPrepareAndExecuteFilter(核心控制器 )选择对应的result,将结果呈现给用户。

4.处理中文乱码
<constant name = "struts.il8n.encoding" value = "UTF-8"/>

5.在struts.xml中使用package元素定义包。package元素包含多种属性,其中:
name属性为必需的并且是唯一的,用来指定包的名称(被其他包引用)。
extends属性类似java的extends关键字,指定要扩展的包。

6.namespace是一个可选属性,该属性定义该包中action的命名空间。
默认的命名空间用“”表示,也可以使用“/”定义一个根命名空间。
区别:当请求Web应用程序根路径下的action,框架在根命名空间中查看相应的action,如果在根路径下未找到,则再到默认的命名空间中去查找

7.Action的作用:
(1)Action最重要的作用是为给定的请求封装需要做的实际工作(调用特定的业务处理类)
(2)为数据的转移提供场所
(3)帮助框架决定由哪个结果呈现请求相应

8.Struts 2在根据action元素的method属性查找执行方法时有两种途径
(1)查找与method属性值完全一致的方法
(2)查找doMethod()形式的方法

9.Result的配置由两部分组成:

一部分是Result所代表的实际资源的位置及Result名称;
另一部分是Result的类型,由 result元素的type属性进行设定;

10.对Result配置中常用的三种结果类型总结如下

dispatcher类型:Action默认的结果类型,采用转发的形式请求指定的视图资源,请求中的数据信息不会丢失;
redirect类型:采用重定向的方式指定的视图资源,通过HttpServletResponse对象的sendRedirect()方法重新生成一个请求,原请求中的数据信息会丢失;
redirectAction类型:采用重定向的方式请求一个新的Action,原请求中的数据信息会丢失;

11.Struts 2的配置文件:
struts.xml:Struts 2的核心配置文件。
struts-plugin.xml:Struts 2插件使用的配置文件。
struts-default.xml:Struts 2的默认配置文件。

12.struts.xml文件的各项内容如下。
Action配置:
动态方法:actionName!methodName.action。
通配符:使用星号(*)表示0个或多个字符串。
默认Action:使用<default-action-ref/>完成。

Result配置:
常用结果类型:dispatcher类型、redirect类型、redirectAction类型。
动态结果:使用${attributeName}该问Action中的属性,实现动态结果配置。
全局结果:在global-results元素中嵌套result元素实现全局结果配置。

十、OGNL

OGNL的全称是Object Graph Navigation Language,即对象图导航语言。它是一个开源项目,工作在视图层,用来取代页面中的Java脚本,简化数据的访问操作。

OGNL在框架中主要做两件事:表达式语言和类型转换器。

ValueStack值栈

 定义:是内存中的一块空间,栈和堆之外的空间,它具有栈的特征,可以存放多个对象,如果存放多个对象,他们是按照先后顺序压入堆栈的。框架在处理每个请求时,都会创建该请求对应的运行环境,这时会创建值栈和请求对应的Action实例,并将Action实例压入值栈中。

Struts 2提供了非常强大的类型转换功能,提供了多种内置类型转换器,支持开发自定义类型转换器。

Struts 2提供了两种方式来配置转换器,即应用于全局范围的类型转换器和应用于特定类的类型转换器。

Struts2内置的类型转换:

  String和boolean 完成字符串与布尔值之间的转换。

  String和char 往常字符串与字符之间的转换。

  String和int、Integer 完成字符串与整型之间的转换。

  String和Long 完成字符串与长整型值之间的转换。

  String和double、Double 完成字符串与双精度浮点值的转换。

  String和Float 完成字符串和单精度浮点之间的转换。

  String和Date 完成字符串和日期类型之间的转换,日期格式使用格式用户请求所在Locale的SHORT格式。

  String和数组 在默认的情况,数组元素是字符串,如果用户定义类型转换器,也可以是其它复合数据类型。

Struts 2框架使用OGNL作为默认的表达式语言。

OGNL相对其它表达式语言具有下面几大优势:

  1、支持对象方法调用,如xxx.doSomeSpecial();

  2、支持类静态的方法调用和值访问,表达式的格式: @[类全名(包括包路径)]@[方法名 | 值名],例如: @java.lang.String@format('foo %s', 'bar') 或@tutorial.MyConstant@APP_NAME;

  3、支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;

  4、访问OGNL上下文(OGNL context)和ActionContext;

  5、操作集合对象。

ActionContext中包含多个对象。如果访问根对象,可直接书写对象的属性,而要使用其他对象必须使用“#key”前缀来访问。

URL标签和日期标签:

URL标签的作用是构建一个URL地址,在该标签中借助param子元素可以指定在跳转URL的同时传递的参数。

日期标签用于格式化输出一个日期,还可以计算指定日期和当前日期时刻之间的时差。


十一、拦截器

Struts 2体系结构的核心就是拦截器。
什么是Struts 2拦截器?

从软件构架上来说,拦截器是实现了面向方面编程的组件。它将影响了多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现功能的高度内聚,确保了业务对象的整洁和纯度。

从Java代码上来说,它就是一个普度的Java对象,它只需要实现一个名为Interceptor的接口。
为什么要使用拦截器?

拦截器消除了动作组件中的横切任务(cross-cutting task)。例如,日志记录是一个典型的横切关注。以前,我们可能需要为每个动作组件准备一些记录日志的代码。虽然这样看上去也没什么错误,但是一个不可以忽视的事实是——这些用于记录日志的代码并不是动作组件与模型交互的一部分。并且,日志记录是我们想为系统处理的每一个请求完成的管理性任务,它不是一个动作组件所特有的,而是贯穿了所有动作组件。Struts 2将这个功能放在了更高的层次上,我们可以能把日志记录的代码转移到动作组件之外,从而让动作组件更加简洁清晰。

拦截器组件提供了一个不错的场所,来将不同的横切关注点逻辑分成有层次的、可重用的部件。
拦截器的工作原理?

Struts2拦截器围绕Action和Result的执行而执行。其实现原理和Servlet Filter差不多,以链式执行,对真正要执行的方法(execute())进行拦截。首先执行Action配置的拦截器,在Action和Result执行之后,拦截器在一次执行(与先前的执行顺序相反),在此以链式的执行过程中,任何一个拦截器都可以直接返回,从而终止余下的拦截器、Action及Result的执行。

当ActionInvocation的invoke()方法被调用时,开始执行Action配置的第一个拦截器,拦截器作出相应的处理后会在此调用ActionInvocation的invoke()方法,ActionInvocation对象负责跟踪执行过程的状态,并且把控制权交给合适的拦截器。ActionInvocation通过调用拦截器的intercept()方法将控制转交给拦截器。因此,拦截器的执行过程可以看做是一个递归的过程,后续拦截器继续执行,直到最后一个拦截器,invoke()方法会执行Action的execut()方法。

拦截器触发时能够做些什么?

1. 做一些预处理。在这个阶段拦截器可以用来准备、过滤、改变或者操作任何可以访问的重要数据。这些数据包括所有与当前请求相关的关键对象和数据,也包括动作。

2. 通过调用invoke()方法将控制转移给后续的拦截器,直到动作。或者通过返回一个控制字符串中断执行。在这个阶段,如果拦截器决定请求不应该继续,他可以不调用ActionInvocation实例上的invoke()方法,而是直接返回一个控制字符串。通过这种方式可以停止后续的执行,并且决定哪个结果被呈现。

3. 做一些后加工。在这个阶段,任何一个返回的拦截器可以修改可以访问的对象的数据作为后加工,但是此时结果已经确定了。

Struts 2内置拦截器

  params拦截器 :将请求中的数据设置到Action的属性上。

  servletConfig拦截器:将源于Servlet API的各种对象注入Action。

  staticParams拦截器:将在配置文件中配置的参数注入Action。

  fileUpload拦截器:将文件和元数据从多重请求转换为常规的请求数据。

  validation拦截器:执行数据校验。

  workdation拦截器:当数据校验错误时,提供终止流程的功能。

  exception拦截器:用于捕获异常。

自定义拦截器:

  实现Interceptor接口。

  继承AbstractInterceptor类。

Struts 2框架实现文件上传时需要添加commons-fileupload-x.x.x.jar和commons-io-x.x.x.jar文件。在Action中使用三个属性封装文件信息:

  File类型的xxx属性。

  String类型的xxxFileName。

  String类型的xxxContentType。

使用Struts 2框架实现文件下载时,需要经过stream结果类型来实现,参数设置包括:

  contentType:下载文件的文件类型。

  contentLength:设置文件的大小。

  inputName:对应实现的InputStream属性。

  contentDisposition:一方面表示文件的处理方式,另一方面指定下载文件的显示文件名称。

  bufferSize:指定下载文件时的缓冲区大小。

转载于:https://www.cnblogs.com/zjcal/p/7645033.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值