Hibernate与代理模式相关知识详解
- 格式:docx
- 大小:37.58 KB
- 文档页数:9
多期: 天润4+5名字: 陈宣任日期作业: 2011年12月8日Hibernate课堂讲课知识点总结:一.hibernate基础知识二.hibernate一对一映射三.hibernate一对多(多对一)映射四.hibernate多对多映射五.hibernate的HQL检索学习一.Hibernate基础知识1.hibernate:hibernate就是一个可以自动的根据xml或annotation完成对象关系映射(orm),并持久化到数据库的开源框架。
是连接java应用程序和关系数据库的中间件,这是对JDBC的封装,主要负责java对象的持久化。
2.ORM(Object Relation Mapping)对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
3.hibernate映射文件:它的作用是描述持久层对象以及让他们的属性和数据库中的表和表的字段之间的对应关系。
没有映射文件,Hibernate系统无法完成Java对象和数据库表中的数据的相互转化。
只有通过映射文件,Hibernate才能知道所操作的对象与哪个表相关联。
4.hibernate.cfg.xml文件中包含了hibernate与数据库的基本连接信息。
在Hibernate工作的初始阶段,由Configuration的对象开启hibernate框架,然后将信息加载到SessionFactory实例中。
5.SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对Session的操作。
6.手动创建hibernate框架的步骤:a)拷贝所需Jar包到lib目录下,基本包含(antlr.jar,cglib.jsr,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar,hibernate3.jar,hibernate-annotations.jar)b)在src目录下创建一个hibernate.cfg.xml文件,该文件包含了hibernate与数据库连接的基本连接信息。
Hibernate的工作原理Hibernate是一个开源的Java持久化框架,它提供了对象关系映射(ORM)的功能,可以将Java对象映射到关系型数据库中的表结构。
它的工作原理主要包括以下几个方面:1. 配置文件:Hibernate使用一个XML配置文件来描述数据库连接信息、映射关系以及其他配置选项。
在配置文件中,我们需要指定数据库的驱动程序、连接URL、用户名、密码等信息,同时还需要定义实体类与数据库表之间的映射关系。
2. SessionFactory:Hibernate的核心组件是SessionFactory,它是线程安全的,负责创建Session对象。
SessionFactory是基于配置文件创建的,它会解析配置文件中的信息,并根据这些信息建立数据库连接池,以便提高性能。
3. Session:Session是Hibernate与数据库进行交互的核心接口。
每个线程都应该拥有自己的Session对象,它负责管理实体对象的持久化、更新、删除和查询等操作。
Session可以通过SessionFactory的openSession()方法来获取。
4. 对象状态:在Hibernate中,实体对象可以有三种状态:瞬时态、持久态和游离态。
- 瞬时态:当我们通过new关键字创建一个新的实体对象时,该对象处于瞬时态。
瞬时态的对象没有与数据库的关联,不受Hibernate管理。
- 持久态:当我们将一个瞬时态的对象保存到数据库中时,该对象就变成了持久态。
持久态的对象由Hibernate管理,任何对该对象的修改都会被自动同步到数据库中。
- 游离态:当我们从数据库中查询一个对象后,该对象处于游离态。
游离态的对象与数据库的连接已经断开,但它仍然是一个受Hibernate管理的对象。
我们可以通过将游离态的对象重新关联到Session中,使其变成持久态。
5. 对象关系映射:Hibernate使用映射文件来描述实体类与数据库表之间的映射关系。
hibernate 基础一、Hibernate工作原理:读取并解析配置文件读取并解析映射信息,创建SessionFactory打开Sesssion创建事务Transation持久化操作提交事务关闭Session关闭SesstionFactory二、Hibernate有什么好处:对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。
他很大程度的简化DAO层的编码工作hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
hibernate的性能非常好,因为它是个轻量级框架。
映射的灵活性很出色。
它支持各种关系数据库,从一对一到多对多的各种复杂关系。
三、Hibernate是如何延迟加载的:Hibernate2延迟加载实现:a)实体对象b)集合(Collection)Hibernate3 提供了属性的延迟加载功能四、Hibernate的查询方式:Sql、Criteria,object comptositionHql:属性查询参数查询、命名参数查询关联查询分页查询统计函数五、说下Hibernate的缓存机制:使用双向一对多关联,不使用单向一对多灵活使用单向一对多关联不用一对一,用多对一取代配置对象缓存,不使用集合缓存一对多集合使用Bag,多对多集合使用Set继承类使用显式多态表字段要少,表关联不要怕多,有二级缓存撑腰内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存二级缓存:六、如何优化Hibernate:a)应用及缓存b)分布式缓存条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据c) 第三方缓存的实现★→→SessionFactory (org.hibernate.SessionFactory)包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在各个事务(transaction)之间共享的数据(1) SessionFactory的缓存可分为两类:内置缓存和外置缓存。
hibernet的原理Hibernate的原理简介Hibernate是一个开源的对象关系映射(ORM)框架,用于将Java应用程序中的对象与关系型数据库之间进行映射。
它可以大大简化数据库操作,并提供了高度的灵活性和可维护性。
ORM的基本概念•对象关系映射(ORM):将关系数据库中的表和对象之间的映射关系定义在一个配置文件中,使得Java中的对象可以直接操作数据库,无需编写复杂的SQL查询语句。
•持久化:将对象保存在数据库中,以便随时从数据库中获取对象。
•对象关系映射文件(ORM文件):包含了实体类和数据库表之间的映射关系。
•实体类:表示Java应用程序中的一个实体,通常与数据库表中的一行数据对应。
Hibernate的工作原理1.配置文件–创建``配置文件,包含了数据库连接信息、实体类与数据库表之间的映射关系等。
2.实体类–创建实体类,为类添加注解或使用XML文件,用于定义实体类与数据库表之间的映射关系。
3.SessionFactory–在应用程序启动时,使用配置文件和实体类来创建SessionFactory对象。
SessionFactory是线程安全的,通常一个应用只需要一个SessionFactory实例。
4.Session–在应用程序运行过程中,通过()方法创建Session对象。
–Session代表了与数据库的一次会话,可用于执行数据库操作,如增删改查等。
–Session具有缓存机制,它会缓存从数据库检索到的实体对象,以提高性能。
5.事务管理–Hibernate使用事务来管理数据库操作,保证数据的一致性。
–开启事务:();–提交事务:();–回滚事务:();6.对象操作–使用Session对象操作数据库,如保存对象、更新对象、删除对象等。
–查询操作:使用HQL(Hibernate Query Language)或Criteria API进行查询,它们提供了更高级的查询功能。
7.数据库操作–Hibernate会根据实体类和数据库表之间的映射关系,自动生成对应的SQL语句并执行。
目录1.1 跟我学Hibernate框架技术——Hibernate框架技术基础 (2)1.1.1 O/R Mapping工具----Hibernate技术基础 (2)1.1.2 Hibernate和JDBC在性能上的对比 (9)1.1.3 Hibernate系统介绍 (12)1.1.4 Hibernate系统的应用环境 (18)1.1.5 Hibernate为什么如此成功 (20)1.1跟我学Hibernate框架技术——Hibernate框架技术基础1.1.1O/R Mapping工具----Hibernate技术基础1、Hibernate基本概念(1)Hibernate技术本质上是一个提供数据库服务的中间件●Hibernate 是一个面向Java 环境的对象/ 关系数据库映射工具,把Java类对应到数据库的table中,并且采用了xml技术、Java Reflection技术等。
●Hibernate技术本质上也是遵守的ODMG标准的,它的出色源于不断的升级、不断的维护、修改。
以及完善的文档、人气很旺的论坛。
还有很重要的一点就是它的易学易用性。
●Hibernate它不仅提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制。
可以大幅度减少开发时人工使用SQL 和JDBC 处理数据的时间。
(2)Hibernate是一个开放源代码的对象关系映射框架●以OO的方式来操纵数据库它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
●Hibernate可以应用在任何使用JDBC的场合Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
try{stmt=con.createStatement();rs=stmt.executeQuery("select * from student");metaData = rs.getMetaData();for(int column = 0; column < metaData.getColumnCount(); column++){System.out.print(metaData.getColumnName(column+1)+"\t");}while(rs.next()){for (int i = 1; i <= metaData.getColumnCount(); i++){System.out.print(rs.getObject(i)+"\t");}System.out.println("");}stmt.close(); //must closecon.close();}catch(SQLException e){}(3)主要的特点及与Entity EJB Bean的不同点Hibernate是JDBC的轻量级的对象封装它是一个独立的对象持久层框架,和应用服务器以及和EJB没有什么必然的联系。
1、Hibernate 介绍
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了轻量级的对象封装,使 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
它不仅提供了从 Java 类到数据表之间的映射,也提供了数据查询和恢复机制。
相对于使用 JDBC 和 SQL 来手工操作数据库,Hibernate 可以大大减少操作数据库的工作量。
另外 Hibernate 可以利用代理模式来简化载入类的过程,这将大大减少利用 Hibernate 从数据库提取数据的代码的编写量,从而节约开发时间和开发成本 Hibernate 可以和多种Web 服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。
2、Hibernate 原理
Hibernate 技术本质上是一个提供数据库服务的中间件。
它的架构如图所示:
图1 显示了 Hibernate 的工作原理,它是利用数据库以及其他一些配置文件如Hibernate .properties ,XML Mapping 等来为应用程序提供数据持久化服务的。
Hibernate 具有很大的灵活性,但同时它的体系结构比较复杂,提供了好几种不同的运行方式。
在轻型体系中,应用程序提供 JDBC 连接,并且自行管理事务,这种方式使用了 Hibernate 的一个最小子集;在全面解决体系中,对于应用程序来说,所有底层的 JDBC/JTA API 都被抽象了,Hibernate 会替你照管所有的细节。
1。
Hibernate是目前最流行的开源对象关系映射(ORM)框架。
Hibernate采用低侵入式的设计,也即完全采用普通的Java对象(POJO),而不必继承Hibernate的某个基类,或实现Hibernate的某个接口。
Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式来操作关系数据库。
因为我们知道hibernate它能支持透明持久化从这个角度来看它没有侵入性所谓侵入性它没有侵入hibernate任何的API所以它叫轻量级框架,轻量级框架的好处是没有侵入性另外的一个好处是为测试带来了好处,测试非常简单测试就行我们写普通的java应用程序一样不需要什么环境只需要几个jar包就可以了写个main函数一侧就可以了它没有侵入性和测试非常简单这是它流行的一个原因。
hibernate的优缺点优点:1、程序更加面向对象;2、提高了生产率;3、方便移植(修改配置文件);4、无侵入性。
缺点:1、效率比JDBC略差;2、不适合批量操作。
3、只能配置一种关联关系Hibernate有四种查询方案1、get,load方法,根据id查找对象2、HQL--hibernate query language(查询对象:Query)3、Criteria--标准查询语言(查询对象:Criteria,查询条件:Criterion)4、通过sql来查(查询对象:SQLQuery)具体Query/Criteria:1.Query接口封装了Hibernate强大的对象查询能力,同时也支持数据库的更新操作2.提供了动态查询的参数绑定功能3.提供list(),iterator(),scroll()等对象导航方法4.提供uiqueResult()方法获取单独的对象5.提供executeUpdate()方法来执行DML语句6.提供了可移植的分页查询方法Session:1、save,presist保存数据,persist在事务外不会产生insert语句。
Java框架Hibernate基础知识Hibernate是一款开源的Java ORM框架,它的基本功能是将Java 程序中的对象映射到数据库中的关系表,实现了Java对象和数据库表格之间的互相转换。
Hibernate的特点主要包括以下几个方面:1.高效的数据访问Hibernate使用缓存技术来提高数据库的访问效率,它可以通过缓存对象和结果来减少频繁的数据库查询,提高性能;同时,在数据库设计时,可以使用Hibernate内置的注解或XML文件映射数据表,大大减少了手动编写SQL语句的工作量。
2.简化的数据访问Hibernate可以把Java对象映射到和数据库表相似的对象,而不需要在编写复杂的SQL语句时独立处理每个Java属性;这使得Hibernate的使用更加简单,代码更加紧凑。
3.独立性Hibernate是一个独立的框架,不依赖于任何特定的技术或平台,可以与不同的数据库平台和不同的Java框架一起使用,为开发者提供了更大的灵活性。
以上是Hibernate的基本特点,接下来将介绍Hibernate的一些常见使用方法和技术。
1.Session管理在Hibernate中,Session是处理一级缓存的入口,也是与数据库交互的唯一途径。
Session可以通过SessionFactory来获取,而SessionFactory则可以通过Hibernate配置信息初始化。
2.映射文件在使用Hibernate时,需要将Java对象和数据库表之间建立映射关系。
Hibernate采用XML文件或注解方式来描述Java对象和数据库表之间的映射关系,其优点是抽象了数据库表的细节和差异,简化了代码开发。
3.HQL查询Hibernate中的HQL是Hibernate Query Language的缩写,是一种类似于SQL语法的查询语言,支持面向对象的查询和复杂查询。
使用HQL可以通过编写查询语句来获取所需的Java对象,而不需要手动创建数据库查询语句。
Hibernate 教程什么是 HibernateHibernate 是一种 Java 持久化框架,它提供了一种简单的方法来存储、检索和操作 Java 对象与关系数据库之间的数据。
Hibernate 是基于 Java Persistence API (JPA)标准的实现,是一个开放源代码的框架。
Hibernate 的优势1. 简化数据库操作Hibernate 提供了一个简单的面向对象的 API,让开发人员可以直接使用 Java 对象进行数据库操作,而无需编写复杂的SQL 语句。
通过 Hibernate,开发人员可以更专注于业务逻辑的实现,而不必关心底层的数据库细节。
2. 跨数据库的透明性Hibernate 提供了一种数据库无关的开发方式,它支持多种不同类型的数据库,如 MySQL、Oracle、PostgreSQL 等。
开发人员可以通过简单的配置,无缝切换不同的数据库,而不必修改代码。
3. 提高性能Hibernate 提供了一些缓存机制,可以有效地提高数据库访问性能。
通过缓存,Hibernate 可以减少对数据库的频繁访问,提高系统的响应速度。
4. 支持延迟加载Hibernate 具有延迟加载机制,它可以在需要使用对象时才从数据库中加载数据。
这种机制可以减少不必要的数据库访问,提高应用程序的性能。
Hibernate 的基本概念1. 实体类在 Hibernate 中,实体类是指映射到数据库表的 Java 类。
实体类包含了与数据库表中的字段对应的属性,以及与数据库表中的记录对应的对象。
2. 映射文件映射文件是用来描述实体类与数据库表之间的映射关系的配置文件。
通过映射文件,Hibernate 可以知道如何将实体类的属性映射到数据库表的字段,以及如何将数据库表的记录转换为实体类的对象。
3. 会话工厂在使用 Hibernate 之前,需要先创建一个会话工厂。
会话工厂负责创建会话对象,会话对象用于与数据库进行交互。
Hibernate与代理模式代理模式:当需要调用某个对象的时候,不需要关心拿到的是不是一定是这个对象,它需要的是,我拿到的这个对象能够完成我想要让它完成的任务即可,也就是说,这时调用方可以拿到一个代理的一个对象,这个对象可以调用它想创建的对象的方法完成调用方的任务就好了。
静态代理模式模拟实例应用场景介绍:这里有一个PDF,我想打开,但是,初始化的过程比较耗时,那么在这个时候如果在创建对象的时候直接初始化那么势必会消耗掉一定的时间,但是并不一定初始化完成以后就直接要打开,可能过一段时间之后才需要打开呢,是有可能的。
File的一个接口,这个接口定义了一个openFile的方法。
[java]1.package com.siti.proxytest1;2.3.public interface File {4.5. /**6. * 打开文件7. */8. public void openFile();9.}PDFFile实现File接口,并实现openFile方法。
[java]1.package com.siti.proxytest1;2.3.public class PDFFile implements File{4.5. /**6. * sleep一秒钟表示初始化的时候的耗时7. */8. public PDFFile(){9. try {10. Thread.sleep(1000);11. System.out.println("PDF文件加载成功~");12. } catch (InterruptedException e) {13. e.printStackTrace();14. }15. }16.17. @Override18. public void openFile() {19. System.out.println("PDF文件打开!");20. }21.22.23.}PDFFile的代理类,也要实现File接口,并实现openFile方法,在这个方法当中并不是从新的实现一遍PDFFile的openFile方法,而是将获得调用者想要创建的那个对象的实例,用这个实例去调用具体的实现方法。
代码如下:[java]1.package com.siti.proxytest1;2.3.public class PDFFileProxy implements File{4.5. private PDFFile pdfFile;6. /**7. * 获取代理对象8. * @param pdfFile9. */10. public PDFFileProxy(PDFFile pdfFile){11. this.pdfFile = pdfFile;12. }13. /**14. * 代理对象调用openFile方法时,才会创建pdfFile对象(耗时1s);15. * 然后执行对象的openFile方法完成。
16. */17. @Override18. public void openFile() {19. if(pdfFile == null){20. this.pdfFile = new PDFFile();21. }22. pdfFile.openFile();23. }24.25.26.}在这个代理类中,可以清楚的看到,当创建一个代理对象传了null参数的时候,并没有直接得到pdfFile的实例,这时候速度非常快的创建完成了,当你调用执行的时候才会创建真正的实例,并调用该对象的方法,完成调用者的请求。
测试代码如下:[java]1.package com.siti.proxytest1;2.3.public class ProxyTest {4.5. public static void main(String[] args) {6. Long beginTime = System.currentTimeMillis();7. // 创建代理对象8. PDFFileProxy proxy = new PDFFileProxy(null);9. Long MiddTime = System.currentTimeMillis();10.11. System.out.println("创建代理对象耗时:" + (MiddTime - beginTime));12.13. // 调用openFile方法,创建实际的PDFFile对象并执行openFile方法14. // 如果此时不调用openFile的话那么这一秒钟的时间就会被节约下来,那么只是消耗了创建代理对象的时间(很少的时间)15. proxy.openFile();16. System.out.println("打开文件耗时:" + (System.currentTimeMillis() - beginTime));17.18. }19.}测试结果如下:当然,系统的最终开销并没有减少,但是有的时候创建完对象之后并不一定就会直接调用它的方法,甚至直到被回收也没有调用,那么这时候代理模式很显然的效率更高,再者就是推迟了对象的创建时间,保障前面的程序运行流畅的,减少对象在内存中的存活时间,宏观上减少了内存的消耗。
Hibernate默认使用延迟加载(懒加载),也就是,当一个对象关联着另一个对象的时候,默认是不被直接加载的,它会获得一个代理对象,等到真正调用的时候,这个对象才真正的被创建。
动态代理模式模拟实例借用上面类似的例子首先还是一个File接口:[java]1.package com.siti.proxytest2;2.3.public interface File {4.5. /**6. * 加载文件7. */8. public void loadFile();9.10. /**11. * 打开文件12. */13. public void openFile();14.15.}PDFFile对File接口进行实现:[java]1.package com.siti.proxytest2;2.3.public class PDFFile implements File{4.5. @Override6. public void openFile() {7. System.out.println("PDF文件打开!");8. }10. @Override11. public void loadFile() {12. System.out.println("PDF文件加载成功~");13. }14.15.16.}创建一个事务类,表示事务机制。
[java]1.package com.siti.proxytest2;2.3.public class TransactionManager {4.5. /**6. * 事务开启7. */8. public void transactionStart(){9. System.out.println("事务开启!");10. }11.12. /**13. * 事务关闭14. */15. public void transactionEnd(){16. System.out.println("事务关闭!");17. }18.}接下来是MyInvocationHandler类实现InvocationHandler,实现的invoke方法将作为代理对象的方法实现。
[java]1.package com.siti.proxytest2;2.3.import ng.reflect.InvocationHandler;4.import ng.reflect.Method;6.public class MyInvocationHandler implements InvocationHandler {7.8. // 需要被代理的对象9. private Object targetObj;10.11. public void setProxyObj(Object targetObj){12. this.targetObj = targetObj;13. }14. @Override15. public Object invoke(Object proxy, Method method, Object[] args)16. throws Throwable {17. TransactionManager transaction = new TransactionManager();18. transaction.transactionStart();19. // 执行targetObj的method方法20. Object obj = method.invoke(targetObj, args);21. transaction.transactionEnd();22. return obj;23. }24.25.}上面的invoke方法将会作为动态代理对象的所有方法的真正实现者。
这样的话即调用了需要调用的方法又增加了一层事务管理机制。
[java]1.package com.siti.proxytest2;2.3.import ng.reflect.Proxy;4.5.public class ProxyFactory {6.7. public static Object getProxy(Object targetObj) {8. // 创建一个MyInvocationHandler9. MyInvocationHandler handler = new MyInvocationHandler();10. // 为MyInvocationHandler设置target对象11. handler.setProxyObj(targetObj);12. // 返回一个动态代理对象13. return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),14. targetObj.getClass().getInterfaces(), handler);15. }16.}该类提供了一个getProxy()方法,该方法为目标对象生成一个动态代理对象,该动态代理对象可以看做是需要的目标对象使用,真正调用的时候会执行MyInvocationHandler的invoke方法,执行事务调用方法完成操作。