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中的一级缓存的快照区
深入理解一级缓存的快照区
事务提交的时候就会更新数据库了

转载于:https://www.cnblogs.com/WuXuanKun/p/5817466.html

Hibernate 和快照相关推荐

  1. hibernate的快照更新

    对于hibernate的快照更新的理解: hibernate在获得持久化对象时,会在一级缓存和快照区同时保存一份相同的原始数据.在对数据进行过更新维护之后,提交事务时hibernate会自动将数据与快 ...

  2. 【Hibernate一】概述及入门

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

  3. 框架-Hibernate

    Hibernate第一天 1. 搭建Hibernate环境 搭建Hibernate开发环境 数据库: DROP TABLE IF EXISTS `cst_customer`; CREATE TABLE ...

  4. spring 5.x(1)-----Spring Framework 5.x中的新功能

    Spring Framework 5.x中有什么新功能 5.1版中的新功能 一般核心修订 基础设施: 在类路径和模块路径上对JDK 11的无警告支持. 支持Graal原生图像约束(反射,参数名称). ...

  5. SSH框架电力项目八--运行监控的保存

    需求分析:保存运行监控文本内容到数据库,并再次查询后回显. 页面中调用保存的函数 function checkchar(){if(document.Form2.stationRun.value.len ...

  6. BOS物流管理系统-第五天

    BOS物流管理系统-第五天-定区管理-WebServcie远程调用 主要内容: 分区设置-导出(分区条件查询后的结果导出为Excel-POI生成Excel和文件下载) 定区管理---定区添加(定区关联 ...

  7. Hibernate学习—— 一级缓存快照

    上一篇说到,Hibernate框架中,对象转化为持久化状态后,会在事务提交时,自动将对象属性存储到数据库,而在事务提交之前,我们是对哪里的对象进行操作呢,这就是一级缓存(Session缓存)的作用. ...

  8. Hibernate框架第二天

    ### Hibernate的持久化类 ### ---------- **什么是持久化类** 1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为 ...

  9. Hibernate的一级缓存

    Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...

最新文章

  1. python拟牛顿法迭代点绘制_拟牛顿法python
  2. 推荐 7 个牛哄哄 Spring Cloud 实战项目
  3. mysql snmp agent_WebNMS SNMP Micro Agent for MySQL - MySQL Management Console
  4. python基础之删除文件及删除目录的方法
  5. Flux架构小白入门笔记
  6. Redis Cluster集群架构实现
  7. java stream 多个filter_如何在Java Stream上应用多个过滤器?
  8. 链表选择排序算法功能实现演示
  9. 勒索病毒入侵中国, Splunk建议网络立即进行区分和隔离设置
  10. aix查看oracle进程内存,Aix 查看进程占用内存大小(按从大小排列)
  11. 第五课 vim基本用法、bash编程初步和for循环
  12. android 8.1.0怎么截屏,vivo Z1i怎么截屏?4种vivo Z1i截图方法
  13. 天寒宜早睡,梦醒闻雪声,倒计时83
  14. Node.js连接MySQL数据库
  15. retrofit + rxjava2报错java.lang.IllegalStateException:Excepted a String but was BEGIN_OBJECT at line..
  16. Steve Jobs Said
  17. Python量化交易平台:QMT (日内交易策略示例)
  18. 学习初期 荆棘之路
  19. 如何查mysql里有多少条数据_mysql快速查询数据库中有多少条数据
  20. 视频直播常见问题与解决办法汇总

热门文章

  1. Android之创建简单的ProgressDialog
  2. JavaScript语言基础11
  3. 使用Storm实现WordSum
  4. 利用 CoreGraphics 绘制折线图
  5. (0081)iOS开发之无限后台定位并上传数据到服务器
  6. codeforces316E3
  7. C语言博客作业--数据类型
  8. eclipse MAT分析heap dump
  9. JSPServlet学习手册
  10. slab 内存分配器介绍(一)