Oracle&JDBC&Hibernate知识总结

来源:互联网 发布:手机淘宝怎么登不上 编辑:程序博客网 时间:2024/05/16 23:58

 

Oralce

DML数据操作语言:insert、update、delete(merge)

DDL数据定义语言:create、drop、alter、truncate、rename

DCL数据控制语言:grant

DQL数据查询语言:select

Transaction:commit、rollback、savepoint

 

1、 介绍

存储方式:文件、DB(DBMS)

SQL语句的分类

关系型数据库:二维表

SQLPLUS

2、 Select语句 选择、投影、连接

select …… from ……

distinct、算术表达式、字符串拼接||、[’字符串’、”列别名case sensitive、特殊字符如空格”]、NVL(salary,100)

[where ……]限制

可以出现列名、表达式、常量、运算符

<=、>=、!=、=、not between……and、in、like(%匹配0-n,_匹配一个,escape转义)、is (not) null、and、or、not

[group by……]

select语句只能出现group by从句中出现的字段或者组函数

mysql不做限制

[having ……]

对分组后的数据进行进一步限制

[order by ……]

默认asc、desc,select中未出现字段可做排序

 

标准的 SQL 的解析顺序为:
   (1).FROM 子句, 组装来自不同数据源的数据
   (2).WHERE 子句, 基于指定的条件对记录进行筛选
   (3).GROUP BY 子句, 将数据划分为多个分组
   (4).使用聚合函数进行计算
   (5).使用 HAVING 子句筛选分组
   (6).计算所有的表达式
   (7).使用 ORDER BY 对结果集进行排序

举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的.
   标准顺序的 SQL 语句为:
   select 考生姓名, max(总成绩) as max总成绩
   from tb_Grade
   where 考生姓名 is not null
   group by 考生姓名
   having max(总成绩) > 600
   order by max总成绩
  
   在上面的示例中 SQL 语句的执行顺序如下:
   (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
   (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
   (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
   (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
   (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600分的.
   (7). 执行 ORDER BY 子句, 把最后的结果按"Max 成绩" 进行排序.

 

单行函数:数据计算、修改条目、控制输出、格式转换

操作字符串lower、nvl、to_char(number,”fmt”)、to_number(char)

多行函数(组函数):select或者having从句

count、avg、min、max、sum

 

多表:笛卡尔积

join 等值(=)、非等值(运算符)、外连接(+在右边相当于left outjoin)、自连接(用别名区分同一张表)

子查询:内部查询结束进行外部查询

oracle分页借助rownum实现

select salary from

(select salary,rownum rn from

(select salary from s_emp order by salary)

) where rn between 5 and 10;

 

数据库设计

实体、属性、关系(one-to-one、one-to-many、many-to-many)

 

数据库范式:

第一范式:记录唯一、列不可再分

第二范式:非主键列完全依赖主键列,主键唯一

第三范式:非主键列互不依赖

第四范式:禁止非主键列与主键列一对多关系不受约束

第五范式:尽可能细分、排除冗余

 

3、 Table

建表:表名字母开头、1-30、_/$/#开头、表名不能重复、与保留字不冲突

数据类型:varchar2(可变长20)、char(定长20)、number、number(p,s)、date(sysdate函数)、clob、blob(4G)

Date相关:to_date(date,’fmt’),DD-MON-RR、to_char(char[,’fmt’])、java语言SimpleDateFormat、last_day()、next_day()

约束Constraint:表级约束/行集约束,主键约束primary key、外键约束foreign key references、唯一性约束unique、非空约束not null、check约束

DML

insert into……values ……

delete from …… where (drop、truncate差异?)

update …… set …… where

 

4、  数据库事务

ACID:原子性、一致性、隔离性(事务并发)、持久性

事务开始:第一个DML

事务结束:手动控制commit/rollback、自动提交(DDL、DCL、会话正常结束)、系统异常终止即回滚

事务并发:脏读(读到未提交的数据)、不可重复读(两次读出的记录内容不一致)、幻读(两次读出来的记录条数不一致)

 

5、 数据库对象

Sequence(配合触发器实现主键自增,nextval、currval)

index索引由数据库自动维护(具体数据——rowid)相当于目录 唯一性索引(主键约束或唯一性约束自动创建)

好处:加快检索速度、减少IO、Oracle自动维护索引

view视图

方便检索数据、简单查询得到复杂的结果、数据独立多表检索、相同数据不同视图

简单视图(一个表、DML)、复杂视图(多个表、函数、分组、不能用DML)

创建视图时 withcheck option:插入或修改需满足定义的约束

                  with readonly:禁止DML

 

6、 其它

exists 子查询(判断子查询的结果是否存在) not exists

union多条查询语句的并集,不显示重复字段、unionall显示重复、intersect交集、minus差集

修改表和约束

alter 增删改列、增删约束、enable或disable约束

drop不能回滚、删除空间、约束、索引全部失效

truncate 不能回滚、释放空间、可以恢复

(删表——drop、删数据,可能需要回滚——delete、删数据,不要回滚truncate)

rename 重命名

 

SQL练习

 

JDBC

1、 JDBC使用

java数据库连接

API分为两部分:java程序员java.sql、javax.sql包、jdbc驱动程序开发人员

Driver:驱动程序

DriverManager:驱动程序的管理类,利用连接字符串测试已注册的一个或多个驱动中哪个可用

Connecton:数据库连接

Statement:数据库的操作对象,PreparedStatement预编译、CallableStatement存储过程等

ResultSet:结果集

DataBaseMetaData(通过Connection获得,isReadOnly),ResultSetMetaData(通过ResultSet获得,rowCount),元数据有关容器本身结构方面的数据

Types:类型

开发步骤:

注册驱动:三种方式(类加载器Class.forName,直接实例化驱动new ,使用java -Djdbc.drivers属性)

建立连接:DriverManager.getConnection()——Driver.connect (PPT19检索连接示意图)

创建Statement:createStatement,preparedStatement

执行SQL:无改变的传至数据库

处理结果集:while(rs.next()){rs.getInt…… setter/getter}

关闭连接:ResultSet、Statement、Connection

2、 高级特性

元数据

事务:事务包含若干条数据库操作,并且保证这些操作具有原子性,可以正确的恢复 ACID

默认自动提交,setAutoCommit(false)——执行若干数据库操作——提交/回滚

并发控制:脏读、不可重复读、幻读

3、2.0核心特性

可滚动、可更新结果集:前后滚动+相对/绝对定位,通过结果集对数据库进行增删改

       可更新结果集限制(单表、不能join、包含主键、不能为空、不能有默认值)

批量更新:addBatch、executeBatch

新增加数据类型:clob、blob流式读取(PPT67-69)

4、2.0扩展

数据源和JNDI:封装了数据库连接的具体细节,制定特定的逻辑名称将其绑定到JNDI服务器上

连接池:利用对可重用数据库连接对象的缓存来提高数据库连接效率(牺牲空间换时间)

行集RowSet(继承ResultSet):ResultSet(可滚动可更新)+Statement+Connection

 

Hibernate

JDBC适用于数据量较大、表之间关系较为简单

Hibernate适用于数据量较小、表之间关系较为复杂

1、 概述

对象持久化:序列化、保存在数据库(CRUD)

对象关系映射:java对象和关系型数据库之间的映射(类——表,对象——条目,属性——字段,关系——表间关系或表)

PPT 8 Hibernate应用程序结构

Session:连接和事务之间,非线程安全,轻量级,一线程一session

Sessionfactory:获取Session,线程安全,重量级,多线程共享,缓存

Configuration:配置对象,读取hbm.cfg.xml,*.hbm.xml,创建SessionFactory

Transaction:jdbc事务/jta事务

Query:执行HQL

2、 实体映射

id生成方式(oid独立于数据库,唯一,与业务无关,简化对象到表的映射):native、hilo、seqhilo、sequence(DB2)、increment、identity(DB2)、assigned(默认)、foreign、uuid-hex等等

映射类型:java类型和SQL字段类型的映射类型

integer、string、class(java.lang.Class——varchar2类全限定名)、clob、blob

3、 持久化对象的管理

对象状态:暂态(new创建、与session无关、没有id)、持久态(session管理、有id)、游离态(session管理过了、有id)

状态管理 PPT38

get(直接查数据库,找不到返回null)和load(先查缓存,找不到抛异常)

list(Query接口下)、find(直接查数据库)和iterate(先通过id查缓存,找不到再去查数据库)

close、clear、evict、lock、saveOrUpdate、delete

自动脏检查

批量处理:循环save,超过限量会报错

Hibernatenate查询方式:根据id查询(单个)、HQL(常用、跟SQL类似、面向对象、只被Hibernate支持、不限制DB类型)、Criteria(模糊匹配、动态查询、只被Hibernate支持)、Native SQL(适用于不熟悉Hibernate,有些HQL不能实现的SQL,指定DB类型)

4、 实体映射

关联关系:单向、双向one-to-one(唯一外键、共享主键)one-to-many、many-to-many

inverse(true放弃维护关系,one方写)、lazy(延迟加载带来的问题?fetch)

传播性持久化:cascade:all、save-update、delete、delete-orphon、all-delete-orphon

组件映射:某些对象不要求共享,没必要重新分配一张表

集合映射:set(无序不重复)、bag(无序可重复,list实现)、list(有序可重复)、map(键值对)

继承映射:

table-per-class(支持多态、表太多)、table-per-concrete-class(表较少、重复定义属性、不支持多态)、table-per-class-hierarchy(表最少、表可能很大、支持多态)

5、 事务和并发控制

提交(某些查询,commit,flush)setFlushMode

beginTransaction——commit

读未提交(1)——读提交(2)——重复读(4)——串行(8)

应用程序事务:悲观锁(慎重使用、效率太低)、乐观锁(version、timestamp)

6、 高级查询

分页setFirstResult、setMaxResult

NamedQuery(查询语句写在映射文件按中)

集合过滤session.createFilter()

报表查询:like、投影、函数lower、分组、distinct、count(*)

join(fetch 解决延迟加载问题)

参数绑定(位置从1开始,名称:name)

 

多试,看执行SQL

 

标注可以补充