SSh

1、Oracle数据库基础java

Oracle数据库的主要特色以下:web

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

(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函数分为单行函数、聚合函数和分析函数。

 

2、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) 改善查询性能:对分区对象的查询能够仅搜索本身关心的分区,提升检索速度。

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

  何时使用分区表:
一、表的大小超过2GB。
二、表中包含历史数据,新的数据被增长都新的分区中。

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

 

3、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错误。

 

4、Hibernate入门

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

Hibernate框架的缺点:

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

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

 

一、什么是hibernate

 

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

 

hibernate核心类和接口

 

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

 

SessionFactory接口:会话工厂,能够获得会话

 

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

 

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

 

二、hibernate工做原理

 

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

 

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

 

三、为何要用hibernate

 

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

 

四、hibernate和jdbc的区别

 

查询效率:jdbc由于直接操做数据库,因此查询效率相比hibernate要高,

 

hibernate要对实体类和数据库表字段之间作映射关系的维护,因此查询效率相对来讲要低。

 

开发效率:jdbc至关于手动式,SQL代码和封装都须要手动完成,而hibernate至关于自动化,因为对jdbc进行封装,因此底层代码不须要开发人员编写,因此开发效率hibernate要高。

 

五、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、DB二、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),抛出一个异常


5、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)方法实现分页。

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

 

6、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对象处于开启状态。

 

7、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:包含所欲有级联操做

 

 

8、Struts 2入门

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

Struts 2 相比Struts 1的优势:

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

二、Struts 2 提供了拦截器,利用拦截器能够进行AOP编程。

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

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

五、Struts 2 的输入校验能够指定方法进行校验。

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

 

Struts 2 体系结构 :

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

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

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

  四、Action的execute方法一般用来存储和从新得到信息。

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

 

基本简要流程:

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

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

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

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

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

六、返回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或者值堆栈中取得数据。


9、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元素实现全局结果配置。

10、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相对其它表达式语言具备下面几大优点:

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

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

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

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

  五、操做集合对象。

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

URL标签和日期标签:

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

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


11、拦截器

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:指定下载文件时的缓冲区大小。

相关文章
相关标签/搜索