8.Oracle中的数据类型

9.Oracle中的伪列

Rowid和RowNum

Rowid

Rownum:在内存中形成一个不断裂的自增列

--最重要的。就是Oracle分页

我想要emp中的第二页数据,4--6

9.Oracle分页三层嵌套  :性能最高

select * from

(

Select emp.*,rownum as rn

from

select * from emp

)emp

where  rownum<=9

)

where rn>=7

这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,
这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

10.第一个入门案例

1.构建了一个Student实体类

public class Student {

private Integer id;

//name

private String name;

//age

private Integer age;

}

2.构建一个大配置

在src根目录下书写

Hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<<hibernate-configuration>

<session-factory>

<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>

<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

<property name="connection.username">sb</property>

<property name="connection.password">sb</property>

<!-- 输出所有 SQL 语句到控制台。 -->

<property name="hibernate.show_sql">true</property>

<!-- 在 log 和 console 中打印出更漂亮的 SQL。 -->

<property name="hibernate.format_sql">true</property>

<!-- 方言 -->

<property name="hibernate.dialect">    org.hibernate.dialect.Oracle10gDialect</property>

<!-- 关联小配置 -->

</session-factory>

</hibernate-configuration>

3.构建小配置,和实体类对应的

Student.hbm.xml

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.happy.entity">

<class name="Student" table="Student">

<id name="id" type="int" column="id">

</id>

<property name="name" type="string" column="name"/>

<property name="age" type="int" column="age"/>

</class>

</hibernate-mapping>

4.测试代码

对session进行探究。

Session.save(stu);

package cn.happy.test;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import org.hibernate.classic.Session;

import org.junit.Test;

import cn.happy.entity.Student;

public class H_01Test {

@Test

public void testAdd(){

//1.1构建一个学生对象

Student stu=new Student();

stu.setAge(18);

stu.setName("2016年8月28日09:21:09训练营");

stu.setId(3);

//1.2 找到和数据库的接口      xxx========session--->sessionFactory--->configure.buildSessionFactory()

//咱们要想打通和db通道

Configuration cf=new Configuration().configure("hibernate.cfg.xml");

SessionFactory factory = cf.buildSessionFactory();

Session session = factory.openSession();

Transaction tx = session.beginTransaction();

//1.3保存

session.save(stu);

tx.commit();

session.close();

}

}

11.ORM

Object Relational Mapping 对象/关系 映射

Object(对象)Java

Java实体类

Public class Student{

Priavte Integer age;

Private Integer id;

Private String name;

}

Mapping (hbm配置文件)

<class name=”Student” table=”Student”>

<id name=”id” column=”id”>

</id>

<property name=”name” column=”name”/>

</class>

Relational(关系)  DB

关系型数据库

Sql sever mysql oracle

Student

Id    Number

Age       Number

Name  nvarchar2(32)

12.Hibernate定位

HIbernate是一款实现了ORM思想的框架

JDO

TOpLink

13.用HIbernate实现删除,修改和查询

/**

* 1.1 删除学生

*/

@Test

public void delTest(){

Session session = HibernateUtil.getSession();

Student stu=new Student();

stu.setId(2);

Transaction tx = session.beginTransaction();

session.delete(stu);

tx.commit();

HibernateUtil.closeSession();

System.out.println("del ok!");

}

/**

* 1.2 修改学生

*/

@Test

public void updateTest(){

Session session = HibernateUtil.getSession();

//不被上下文跟踪对象

/*Student stu=new Student();

stu.setId(3);

stu.setName("微冷的雨训练营");*/

//方式二:如何用呗上下文跟踪的方式

//检索出一条记录,一个实体对象

Student stu= (Student)session.load(Student.class,3);

stu.setName("金龙加油!!!!");

Transaction tx = session.beginTransaction();

session.update(stu);

tx.commit();

HibernateUtil.closeSession();

System.out.println("update ok!");

}

Hibernate的一级缓存:快照区

现在我们详细的说一下一级缓存的结构

 
session就会维护我们的一级缓存
 
session的内部是有一系列java的集合的
 
我们要怎样才能看到集合里面的东西呢?
 
断点运行的时候
 
session是一个接口,我们使用的都是这个session
里面提供的实现类是SessionImpl,其实 我们在这里面就可以看到很多的内容
actionQueue就是java的集合,是一个活动队列,他记录了一些插入的信息,更新的次数,删除的信息。
 
 
里面其实还有map集合的
 
这个你可以去查看它的源代码
 
 
Ctrl+Shift+T
 
它是在我们核心包hibernate3.jar包下
 
这个当然是实现了session这个接口
 
 
它这里面有很多的这种集合
里面有很多的集合才构成了一级缓存
 
 
一级缓存里面是有一个非常特殊的区域的,叫做快照区,快照区有什么用呢?
持久态对象能自动去更新数据库,其实是完全依赖里面的快照区的,相当于把你的数据照了一个快照,快照放在它的一个区域里面,它提交的时候都会与快照去匹配,快照区的原理是会去比对你的数据是否一致,如果不一致,就会自动更新数据出来,就会自动更新数据库,其实是完全依赖了它的快照区
 
 
 
深入去理解一级缓存的结构
 
 
我要更新,更新我不要调用update,就可以自动完成更新
 
 
我现在查询,还是这两个
我现在还是把第一条记录改成hibernate3
 
然后我还是在加一个断点运行
 
我们现在DeBug
然后在这里执行get查询方法会发送sql查询语句
我只要commit就会发送update语句了
 
然后我们现在看一下数据库 已经完成更新了
 
 
 
 
 
现在我再运行这个程序
 
数据中原来就是Hibernate3
现在程序里设置的名字也是hibernate3
 
执行get是查询,是会发查询sql语句的
但是我执行下面提交commit就没有sql的update语句了
 
它是智能的,如果你的数据不一致就更新,如果一致就不更新
 
 
这都是依赖我们一级缓存的快照区域
 
 
结合程序的运行来看
 
 
hibernate一级缓存的快照区
 
我现在让它不一样
 
这个时候是和数据库中的内容是不一样的
 
 
 
现在我们还是运行程序
 
 
我们现在看一下session的结构,session主要是由java集合组成的
 
只有手动调用update的时候,actionQueue里面才有值的,所以这也是一级缓存的数据
 
我们只要调用get方法查一下,就会往一级缓存里面放数据,这里面其实还有一块区域是map集合。
 
 
 
entityEntries里面有map
 
map里面有一个table
 
 
 
 
actionQueue必须手动去调update,里面才会有东西,这个叫活动队列,persistentContext才是真正缓存的区域,一级缓存是用map来构成的,map的key是我们的一级缓存区,value是快照区,一开始执行了一次查询,
 
key里面有book,book里面查出有作者id,name,price。这是我们数据库里面的数据
 
value里面有一个loadstate,我们可以看到这里面也有数据
 
 
 
value就是它的快照区
 
当我setName的时候
 
 
它改变的是一级缓存的值,而不是改变快照区的值。
 
这个时候向下执行你可以看到变化
key里面的值发生变化了
而value里面还是hibernate3 没有变
 
 
 
就是快照是不会变的
 
 
但是当事务一提交的时候就可以更新数据库了,不提交的话数据库是不会变的,其实这里只有快照区变的时候数据库才会变。
 
 
不是更新快照区,而是比对你的快照区,和你的一级缓存区key里面是否一致,如果一直就不更改,如果不一致就更新,所以这里我们可以看到一个具体的结构。
 
 
我们把代码放过来一起看看的更清楚一点
 
当我调用get方法一查询的时候,向我的一级缓存区和快照区都缓存了一个,当你一执行查询的时候,数据往一级缓存里面放一个,往快照里面也放一个,当我一set的时候,改变了我们一级缓存区的数据,就是把原来的hibernate3改变成spring3,一级缓存spring3里面就改成了hibernate3了,当我做事务提交的时候,commit的时候回去比对一级缓存区key和快照区value是否相等,当我们事务提交的时候,它会去比对一级缓存区和快照区的值是否一致,如果一致了就不更新了,如果你的一级缓存区和快照区一样,就不更新,如果不一致,就会更新我们的数据库,现在我的数据变成了Spring了
 
当我们下一次再来运行程序的时候就不更新了
原来是spring3,现在还是spring3
一执行查询,在persistenceContext里面,key就是我们一级缓存的区域,value的loadstate里面,这里面就是我们的快照区,现在都是一样,都是spring3,当我执行get的时候还是spring3,value里面也是spring3,当你再一提交的时候,没有update,一级缓存中是有这么一个区域存在的,就是我们的快照区,
 
 
 
 
我们自动更新数据库,都是依赖hibernate中的一级缓存的快照区
 
 
深入理解一级缓存的快照区
 
 
 
 
事务提交的时候就会更新数据库了
 
 
 
 
 
 
 
 
 

Hibernate 和快照的更多相关文章

  1. Hibernate 和 快照

    Hibernate我们已经学了四天,该讲的知识我们已经讲完,明天放假,后天练习一天就要结束hibernate的学习,有点不舍的,想来hibernate也不是传说中的那么难,在次将hibernate中三 ...

  2. hibernate学习(四)hibernate的一级缓存&快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  3. hibernate笔记加强版

    hibernate 一. hibernate介绍 hibernate事实上就是ormapping框架,此框架的作用就是简单话数据库的操作. hibernate就是将用户提交的代码.參照持久化类配置文件 ...

  4. Hibernate学习——持久化类的学习

    A.概念 持久化:将内存中的对象持久化(存储)到数据库的过程.Hibernate就是持久化的框架. 持久化类:一个普通java对象与数据库的表建立了映射关系,那么这个类在Hiberna中被称为持久化类 ...

  5. Hibernate事务以及一级缓存02

    一. Hibernate中的事务 1. 事务的回顾 1.1 什么是事务(Transaction)(面试重点) 是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的 ...

  6. 【Hibernate一】概述及入门

    Hibernate学习框架: 1.基本部分      crud的操作      主键的生成机制      类型      持久化类      映射文件 *.hbm.xml      配置文件 hibe ...

  7. hibernate 中对象的3种状态总结

    1.Hibernate把对象分文三种状态:Transient(临时状态).Persistent(持久化状态).Detached(游离状态). 1)Transient:刚刚new出来的对象,就是Tran ...

  8. Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  9. hibernate的CRUD操作

    一对多关系映射的crud操作: 1.单项的保存操作 /** * 保存操作 * 正常的保存:创建一个联系人,需要关联客户 */ @Test public void test1(){ Session s= ...

随机推荐

  1. 如何设置'REUSE_ALV_GRID_DISPLAY'的单个单元格的颜色

    REPORT ydemo_rick_a . TYPE-POOLS: slis. , carrid LIKE sflight-carrid, connid LIKE sflight-connid, fl ...

  2. 初试在线破解工具Hydra爆破3389服务器

    hydra是一款全能的暴力破解工具,功能强大,几乎支持所有的协议,是著名黑客组织thc开发的. 在Kali Linux下已经是默认安装的,于是测试爆破一下自己的一台VM虚拟机服务器.hydra还支持G ...

  3. SharePoint 2013 场解决方案包含第三方程序集

    前言 当我们使用SharePoint 场解决方案的时候,经常会包含第三方的程序集,而第三方的程序集经常会有强签名的问题,如果有强签名可以部署到GAC,没有的话也可以部署到应用程序下. 那么,很多初学者 ...

  4. EXCEL快速自动填充方法集锦

    EXCEL快速自动填充方法集锦 原文地址,转载请注明:http://www.cnblogs.com/croso/p/5396841.html 方法一: 名称框输入a1:a1000回车,1, ctrl+ ...

  5. Kotlin语法(其他)

    三.其他 [TOC] 1. 多重声明 有时候可以通过给对象插入多个成员函数做区别是很方便的: val (name, age) = person 多重声明一次创建了多个变量.我们声明了俩个新变量:nam ...

  6. 使用fastboot工具刷入recovery.img、boot.img、system.img等

    在Android SDK目录的platform-tools目录下有fastboot.exe刷机工具(注:需要将机器进入fastboo模式) 刷recovery.img: fastboot flash ...

  7. iOS学习路线

    这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选区.这个学习路线必须发布到首页候选 ...

  8. swift学习之UI控件(一)

    // //  ViewController.swift //  test // //  Created by chuangqu on 15/7/23. //  Copyright (c) 2015年 ...

  9. Windows 7 安装.net framework 4.0 失败,错误HRESULT 0xc8000222解决办法

    今天在客服那里发现一个比较奇怪的错误,在客服机子上安装.NET Framework4.0时,出现如下错误:HRESULT 0xc8000222 百度了下原因,原来是win7自动更新造成的.原文网址:h ...

  10. == 与 equals 区别

          同: ==和equals都比较两个值是否相等.相等为true 否则为false:   异:      1. == 是一个运算符;equals则是string对象的方法,可以.(点)出来.  ...