博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate入门应用(一)
阅读量:4261 次
发布时间:2019-05-26

本文共 2531 字,大约阅读时间需要 8 分钟。

1、Hibernate概念

  

 Hibernate 是基于javaEE平台的一种开放源代码的ORM框架技术。

   是对JDBC的封装,向业务层提供了更加面向对象的API,而操作的对象

是域模型对象(POJO)。Hibernate 要求对javabean提供一个不带参数的构造方法

2、hibernate的体系架构图

       应用层 ------> 【  Hibernate API (JDBC 、JTA 、JNDI)】 --------->数据层

3、Hibernate 的核心API(5个)

     

      Configuration 接口:用于Hibernate配置,在Hibernate启动的时候读取配置文件,创建一个SessionFactory对象。

      SessionFactory 接口:用来产生Session对象,一个SessionFactory对象代表一个数据库连接。他是线程安全的,他所拥有的信息(二级缓存,不是必须的)被客户用户所共享。

      Session 接口:用于对数据进行持久化操作。相当于持久化对象在内存中的一个缓冲区(一级缓存,必须的)。他是线程不安全的,hibernate会自动检测缓冲区中持久化对象的是否已经被改变并及时进行刷新,以保证数据的同步性。

      Transaction 接口:是Hibernate API通过操作底层事务(如:JDBC事务管理、JTA)来达到管理事务的目的。

      Query/Criteria 接口:提供对数据的查询方法。

  

  五个接口之间的关系是:

Configuration   ------> SessionFactory  -------> Session   -------->【Transaction、Query /  Criteria】

4、简单案例

hibernate.cfg.xml配置
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
root
root
org.hibernate.dialect.MySQLDialect
true
update
模型类对象关系映射文件Person.hbm.xml
关键代码://构建配置对象,加载配置文件信息 Configuration cfg = new Configuration().configure();//创建SessionFactory对象SessionFactory factory = cfg.buildSessionFactory();//获取数据操作对象sessionSession session = factory.openSession();//获得事务对象Transaction tx = session.beginTransaction();//利用session对象进行数据查询(利用OID进行查询)Object o1 = session.get(Person.class,new Integer(1));Object o2 = session.load(Person.class,new Integer(2));//利用HQL进行数据查询Query query = session.createQuery(“from Person”);List list = query.list();Iterate iterate = query.iterate();

5、方法比较

session.get()

   他首先会查询一级缓存,没有的话二级缓存,最后再查询数据库。

   如果没有就返回null,是一种立即加载。

session.load()

   他首先查询一级缓存,如果没有创建一个代理对象。在实际使用的时候没有就再去

查询二级缓存,最后再查询数据。再没有就会抛出异常。load()方法认为要查询的

对象一定存在,所以使用了代理对象来达到延迟加载的目的。

query.list()

首先查询一级缓存,没有的话二级缓存,最后再查询数据库。

他返回的是完整数据对象的集合,没有就返回null.立即加载。

产生的sql:select * from person;

query.iterate()

首先查询一级缓存,没有的话二级缓存,最后再查询数据库。

他返回的是数据对象的OID集合,当真正使用的时候,他在

针对每一个对象进行数据查询此时返回的才是完整的数据对象。

都没有就返回null,是一种延迟加载。

产生的sql:

  首次返回OID集合 select id from person;

  真正使用时在查询每个对象select p.id,p.name from person p where id = 1;

通过上面的比较发现:

   使用了get()与list()会立即返回完整对象,所以当session关闭后可以直接使用

   而load()与iterate()则分别通过生成代理对象与返回OID对象集合的方式达到延迟

   加载的目的。当session关闭后再去使用这些对象,由于他们这时才会真的去查询出完整

   对象,所以就会抛出session关闭的异常。再有使用了iterate将会产生多条sql,进行

   影响性能.

转载地址:http://xhxei.baihongyu.com/

你可能感兴趣的文章
BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用
查看>>
转载:在 Windows 10 下遇到移动硬盘不自动分配盘符的问题
查看>>
DDR2 SSTL_18标准
查看>>
DDR3的DQS_p/n信号电平摆幅变化不一致现象
查看>>
北大旁听生中的历史名人
查看>>
大唐凌烟阁开国廿四将
查看>>
Access数据库出现"Selected collating sequence not supported by the operating system."错误
查看>>
逻辑思维测试题
查看>>
如何用Easy CHM制作CHM格式电子书(帮助文档)
查看>>
为什么学习python
查看>>
华为进不了美国,并不是贸易保护这么简单
查看>>
markdown文件的基本常用编写语法(图文并茂)
查看>>
java变量简介
查看>>
Shell十分钟入门
查看>>
nginx 配置 upstream backup 报错
查看>>
Linux执行 wget命令:提示command not found的两种解决方法
查看>>
openssl实现md5加rsa签名
查看>>
史上最全的前端学习路线图,干货满满
查看>>
来点不一样的:解耦 HTML、CSS 和 JS之间的那些事
查看>>
使用go编写webassembly
查看>>