Hibernate基础讲解.ppt

上传人:scccc 文档编号:12932828 上传时间:2021-12-07 格式:PPT 页数:65 大小:219KB
返回 下载 相关 举报
Hibernate基础讲解.ppt_第1页
第1页 / 共65页
Hibernate基础讲解.ppt_第2页
第2页 / 共65页
Hibernate基础讲解.ppt_第3页
第3页 / 共65页
Hibernate基础讲解.ppt_第4页
第4页 / 共65页
Hibernate基础讲解.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《Hibernate基础讲解.ppt》由会员分享,可在线阅读,更多相关《Hibernate基础讲解.ppt(65页珍藏版)》请在三一文库上搜索。

1、Hibernate基础讲解,Hibernate,第一讲Hibernate概述第二讲对象关系映射基础第三讲复杂实体映射第四讲关联映射第五讲Hibernate,Hibernate基础讲解,Hibernate 程序设计,第一讲 Hibernate 概述,Hibernate基础讲解,DAO模式的不足,SQL语句出现在程序中,不利于维护、移植;与java倡导的面向对象的原则相违背; 重复同类编码;开发人员需要处理底层代码如建立、断开数据库连接等;,Hibernate基础讲解,O/R Mapping,对象-关系映射就是Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta

2、data)描述对象与数据库间的映射。本质上,ORM的工作是将数据从一种表示转换为另一种。,Hibernate基础讲解,对象关系映射的优点,提高生产率(Productivity)减少与业务逻辑无关的代码可维护性(Maintainability)对象与关系数据库之间的缓冲区更好性能(Performance)厂商独立性(Vendor independence),Hibernate基础讲解,三个层面的映射,一:Java基本类型表的字段类型二:Java类 表三:类之间关系的映射(继承、关联),Hibernate基础讲解,如何实现?,Hibernate基础讲解,O/R Mapping 的难点,粒度(gra

3、nularity)的问题子类型(subtypes)的问题同一性(identity)的问题与关联(associations)有关的问题对象结构导航的问题,Hibernate基础讲解,实体Bean的不足,使用复杂,不易掌握;处理复杂关联关系的能力不足,在使用EJB的同时可能仍然需要使用JDBC API;不易调试,增加了开发的成本;分布式的模型在简单应用上不合适;依赖于容器;,Hibernate基础讲解,Hibernate 优势,开源成熟流行(约13 000 downloads/month)自定义APIJBoss用Hibernate3实现Entity Beans,Hibernate基础讲解,开发环境

4、,IDE: Eclipse()Hibernate()Database:MySQL+驱动()可选工具:SQLyog(),Hibernate基础讲解,示例1,Hibernate基础讲解,Hibernate 原理,实体对象(Persistent Object) 持久化的对象Hibernate配置文件 配置数据库连接信息Hibernate映射文件 配置对象和关系表的映射信息,Hibernate基础讲解,Hibernate 程序设计,第二讲 Hibernate 映射基础,Hibernate基础讲解,Hibernate基本配置,Hibernate配置文件POJO对象映射文件,Hibernate基础讲解,P

5、ojo的理解,POJOAn acronym for: Plain Old Java Object.The term was coined while Rebbecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000. In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Ent

6、ity Beans. We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and its caught on very nicely.这个名词是我(Martin Fowler)与Rebbecca Parsons,Josh MacKenzie在2000年准备在一个研讨会中演讲时所创造出来的.在这个演讲中,我们指出,

7、将商业逻辑编码成标准(regular)的Java对象,比使用Entity Beans,可以提供更多的好处.但是我们很惊讶,为什么人们如此反对在他们的系统中使用标准对象,我们的结论是:因为简单的对象缺乏一个流行的名称.因此我们给他一个好听的名称,而且这个名称非常贴切.Either EJB (Enterprise JavaBeans) or POJO (plain old Java objects) can be used to build the business-logic tier. EJB with remote interfaces is a better choice if the a

8、pplication is distributed. Since JCatalog is a typical Web application with no remote access required, POJO, with the help of the Spring Framework, is used to implement the business-logic tier. 无论EJB还是POJO都可以用来构建业务逻辑层.如果应用程序是分布式的,则拥有远程接口的EJB是一个很好的选择.而我们的JCatalog是一个典型的没有远程访问需求的Web应用,所以在Spring框架下的POJO

9、被我们用来实现业务逻辑层.,Hibernate基础讲解,Pojo的理解,POJO 是无需遵循特定外部接口或第三方 API 的 Java 类,Hibernate基础讲解,Hibernate 架构,实体对象(Persistent Object) 持久化的对象Hibernate配置文件 配置数据库连接信息Hibernate映射文件 配置对象和关系表的映射信息,Hibernate基础讲解,Hibernate核心API,Configuration 负责管理数据库的配置信息。数据库的配置信息包含了Hibernate连接数据库的一些基本信息,Configuration对象可以通过加载配置文件获取并管理这些信

10、息Configuration conf = new Configuration()conf.configure() = new File(“C:myhibernate.xml”);Configuration config = new Configuration().configure(file);,Hibernate基础讲解,Hibernate配置文件, org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/hibernate root root true ,Hibernate基础

11、讲解,Hibernate配置文件,Hibernate基础讲解,Hibernate核心API,SessionFactory 负责创建Session对象,可以通过Configuration对象创建SessionFactory对象 SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。SessionFactory对象的创建会有较大的开销,而且SessionFactory对象采取了线程安全的设计方式,因此在实际中SessionFactory对象可以尽量的共享,在大多数情况下,一个应用

12、中针对一个数据库可以共享一个SessionFactory实例。 如果需要访问2个以上的数据库,可以写多个配置文件,Hibernate基础讲解,Hibernate核心API,SessionFactory创建方式Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();,Hibernate基础讲解,Hibernate核心API,Session 定义了添加、更新、删除和查询等操作,是持久化操作的基础。Session的设计是非线程安全的,因此,

13、一个Session对象只可以由一个线程使用。 Session对象可以由SessionFactory对象创建。Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();,Hibernate基础讲解,Session对象常用方法,savegetloaddeleteupdatesaveOrUpdatequery,Hibernate基础讲解,Hibernate核心AP

14、I,Transaction 将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。 使用Hibernate进行操作时(增、删、改)必须显式地调用Transaction(默认:autoCommit=false)Transaction tx = session.beginTransaction();/do something with database (insert, update)mit();,Hibernate基础讲解,Hibernate映射文件, ,Hibernate基础讲解

15、,映射文件一,Class :定义一个持久化类 name:持久化类(或者接口)的Java名(如果不加Packege的话,要在mapping节点加Package属性)table:对应的数据库表名,默认是类名 discriminator-value:子类辨别标识 mutable:类是否会发生改变,用于脏数据检查 where:数据筛选条件,Hibernate基础讲解,id:被映射的类必须定义对应数据库表主键字段name (可选): 标识属性的名字type (可选): 标识Hibernate类型的名字,建议大家使用对象型的Integer/Long定义主键column (可选 - 默认为标识属性名): 主

16、键字段的名字unsaved-value (可选 - 默认为一个字段判断(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。 这可以把这种实例和从以前的session中装载过可能又做过修改) 但未再次持久化的实例区分开来(session.saveOrUpdate时需要判断),映射文件二,Hibernate基础讲解,Hibernate主键生成方式,Hibernate基础讲解,Hibernate主键生成方式,Hibernate基础讲解,映射文件三,roperty (1) name: 属性的名字,以小写字母开头。 (2) column (可选 - 默认为属性名字)

17、: 对应的数据库字段名。 也可以通过嵌套的元素指定。 (3) type (可选): 一个Hibernate类型的名字。 (4) update, insert (可选 - 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序。 (5) formula (可选): 一个SQL表达式,定义了这个计算 (computed) 属性的值。计算属性没有和它对应的数据库字段

18、。 (6) access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。 (7) lazy (可选 - 默认为 false): 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。 (8) unique (可选): 使用DDL为该字段添加唯一的约束。 此外,这也可以用作property-ref的目标属性。 (9) not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。 (10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更

19、新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长,Hibernate基础讲解,Hibernate基本数据类型,Hibernate基础讲解,构造持久化类,必须有无参的构造器getter和setter的命名规则推荐使用id属性尽量不要用final声明(延迟加载失效)重载equals和hashCode方法重用脱管实例在Set中保存持久化的实例,Hibernate基础讲解,持久化对象的状态,Transient Objects:使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据

20、库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。 Persist Objects:持久实例是任何具有数据库标识的实例。它由持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。Detached Objects:Session关闭之后,持久化对象就变为detached对象。表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。,Hibernate基础讲解,持久化对

21、象的生命周期,Hibernate基础讲解,Hibernate 程序设计,第三讲 Hibernate 高级映射,Hibernate基础讲解,联合主键,public class Student implements java.io.Serializable private StudentPK pk; public class StudentPK implements java.io.Serializable private String firstName; private String lastName; ,Hibernate基础讲解,联合主键, ,Hibernate基础讲解,组成关系映射,Hi

22、bernate基础讲解,组成关系映射, ,Hibernate基础讲解,特殊数据类型的映射,Clob(存储单字节的字符数据 )Blob(存储二进制数据),Hibernate基础讲解,自定义类型, ,Hibernate基础讲解,Hibernate 程序设计,第四讲 Hibernate 关联映射,Hibernate基础讲解,集合类映射, ,Hibernate基础讲解,Set集合,name 集合属性的名称 table (可选)目标关联数据库表lazy (可选默认为false)允许延迟加载(lazy initialization )outer-join 默认auto。true: 表示使用外连接抓取关联的

23、内容,这里的意思是当使用load(Book.class,“id“)时,Hibernate只生成一条SQL语句将Topic与他的父亲Book全部初始化。false:表示不使用外连接抓取关联的内容,当load(OrderLineItem.class,“id“)时,Hibernate生成两条SQL语句,一条查询Book表,另一条查询Topic表。这样的好处是可以设置延迟加载,此处要将Order类设置为lazy=true。auto:具体是ture还是false看hibernate.cfg.xml中的配置,Hibernate基础讲解,一对多、多对一,Hibernate基础讲解,一对多、多对一, ,Hib

24、ernate基础讲解,一对多、多对一, ,Hibernate基础讲解,级联操作,Hibernate基础讲解,Set集合,Hibernate基础讲解,Set集合,name 集合属性的名称 table (可选)目标关联数据库表lazy (可选默认为false)允许延迟加载(lazy initialization )inverse (可选默认为false) 标记由哪一方来维护关联关系(双向关联中使用)。 cascade (可选默认为none) 让操作级联到子实体 order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag

25、的迭代顺序 where (可选) 指定任意的SQL where条件outer-join(可选-默认为auto)是否使用外联接,Hibernate基础讲解,多对多,column(必需): 中间映射表中,关联目标表的关联字段class (必需): 类名,关联目标类outer-join (可选 - 默认为auto) column(必需):当前表的关联字段,Hibernate基础讲解,继承关系映射,Hibernate基础讲解,继承关系映射, ,Hibernate基础讲解,三种继承策略,每棵类继承树使用一个表(table per class hierarchy) 每个子类一个表(table per su

26、bclass) 每个具体类一个表(table per concrete class ),Hibernate基础讲解,Hibernate 程序设计,第五讲 Hibernate 查询,Hibernate基础讲解,查询概述,概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)Hibernate语言查询(H

27、ibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询。Native SQL Queries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。,Hibernate基础讲解,HQL 实例,from Employeefrom Vendor as v where v.address=:address and v.name like java%select dept.name, dept.description from Department as dept order

28、 by dept.name descselect new Department(dept.name,dept.description) from Department as dept order by dept.name ascupdate Department as dept set dept.name=deptname_update where dept.name in(:deptlist)delete Department where description is null,Hibernate基础讲解,HQL 实例,select count(vendor),vendor.address

29、from Vendor as vendor group by vendor.address order by count(vendor) ,Hibernate基础讲解,标准化对象查询(Criteria Query),Criteria criteria = session.createCriteria(Employee.class); List list = criteria.list();增加查询条件: criteria.add(Restrictions.ge(salary, new Double(1000);,Hibernate基础讲解,原生SQL查询,SQLQuery sqlQuery =

30、 session.createSQLQuery(select * from h_employee e);,Hibernate基础讲解,其他要考虑的问题,大批量处理性能问题,Hibernate基础讲解,批量插入,Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();for ( int i=0; i100000; i+ ) Customer customer = new Customer(.);session.save(customer);if ( i % 20 = 0

31、) /flush 插入数据和释放缓存:session.flush(); session.clear(); mit();session.close();,Hibernate基础讲解,批量更新或删除,Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();ScrollableResults customers = session.getNamedQuery(GetCustomers).scroll(ScrollMode.FORWARD_ONLY);int count=0;while ( customers.next() ) Customer customer = (Customer) customers.get(count);customer.updateStuff(.);if ( +count % 20 = 0 ) /flush 更新数据和释放内存:session.flush(); session.clear(); mit(); session.close();,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1