Hibernate基础讲解.ppt

上传人:牧羊曲112 文档编号:6507038 上传时间:2023-11-07 格式:PPT 页数:66 大小:268.50KB
返回 下载 相关 举报
Hibernate基础讲解.ppt_第1页
第1页 / 共66页
Hibernate基础讲解.ppt_第2页
第2页 / 共66页
Hibernate基础讲解.ppt_第3页
第3页 / 共66页
Hibernate基础讲解.ppt_第4页
第4页 / 共66页
Hibernate基础讲解.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

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

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

2、的优点,提高生产率(Productivity)减少与业务逻辑无关的代码可维护性(Maintainability)对象与关系数据库之间的缓冲区更好性能(Performance)厂商独立性(Vendor independence),三个层面的映射,一:Java基本类型表的字段类型二:Java类 表三:类之间关系的映射(继承、关联),如何实现?,O/R Mapping 的难点,粒度(granularity)的问题子类型(subtypes)的问题同一性(identity)的问题与关联(associations)有关的问题对象结构导航的问题,实体Bean的不足,使用复杂,不易掌握;处理复杂关联关系的能力

3、不足,在使用EJB的同时可能仍然需要使用JDBC API;不易调试,增加了开发的成本;分布式的模型在简单应用上不合适;依赖于容器;,Hibernate 优势,开源成熟流行(约13 000 downloads/month)自定义APIJBoss用Hibernate3实现Entity Beans,开发环境,IDE:)Hibernate()Database:MySQL+驱动()可选工具:),示例1,Hibernate 原理,实体对象(Persistent Object)持久化的对象Hibernate配置文件 配置数据库连接信息Hibernate映射文件 配置对象和关系表的映射信息,Hibernate

4、 程序设计,第二讲 Hibernate 映射基础,Hibernate基本配置,Hibernate配置文件POJO对象映射文件,Pojo的理解,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 b

5、usiness logic into regular java objects rather than using Entity 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 P

6、arsons,Josh MacKenzie在2000年准备在一个研讨会中演讲时所创造出来的.在这个演讲中,我们指出,将商业逻辑编码成标准(regular)的Java对象,比使用Entity Beans,可以提供更多的好处.但是我们很惊讶,为什么人们如此反对在他们的系统中使用标准对象,我们的结论是:因为简单的对象缺乏一个流行的名称.因此我们给他一个好听的名称,而且这个名称非常贴切.Either EJB(Enterprise JavaBeans)or POJO(plain old Java objects)can be used to build the business-logic tier.E

7、JB with remote interfaces is a better choice if the application 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是一个很好的选择.而我

8、们的JCatalog是一个典型的没有远程访问需求的Web应用,所以在Spring框架下的POJO被我们用来实现业务逻辑层.,Pojo的理解,POJO 是无需遵循特定外部接口或第三方 API 的 Java 类,Hibernate 架构,实体对象(Persistent Object)持久化的对象Hibernate配置文件 配置数据库连接信息Hibernate映射文件 配置对象和关系表的映射信息,Hibernate核心API,Configuration 负责管理数据库的配置信息。数据库的配置信息包含了Hibernate连接数据库的一些基本信息,Configuration对象可以通过加载配置文件获取并

9、管理这些信息Configuration conf=new Configuration()conf.configure()File file=new File(“C:myhibernate.xml”);Configuration config=new Configuration().configure(file);,Hibernate配置文件,jdbc:mysql:/localhost:3306/hibernate root root true,Hibernate配置文件,Hibernate核心API,SessionFactory 负责创建Session对象,可以通过Configuration对

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

11、iguration config=new Configuration().configure();SessionFactory factory=config.buildSessionFactory();,Hibernate核心API,Session 定义了添加、更新、删除和查询等操作,是持久化操作的基础。Session的设计是非线程安全的,因此,一个Session对象只可以由一个线程使用。Session对象可以由SessionFactory对象创建。Configuration config=new Configuration().configure();SessionFactory facto

12、ry=config.buildSessionFactory();Session session=factory.openSession();,Session对象常用方法,savegetloaddeleteupdatesaveOrUpdatequery,Hibernate核心API,Transaction 将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。使用Hibernate进行操作时(增、删、改)必须显式地调用Transaction(默认:autoCommit=false)

13、Transaction tx=session.beginTransaction();/do something with database(insert,update)mit();,Hibernate映射文件,映射文件一,Class:定义一个持久化类 name:持久化类(或者接口)的Java名(如果不加Packege的话,要在mapping节点加Package属性)table:对应的数据库表名,默认是类名 discriminator-value:子类辨别标识 mutable:类是否会发生改变,用于脏数据检查 where:数据筛选条件,id:被映射的类必须定义对应数据库表主键字段name(可选)

14、:标识属性的名字type(可选):标识Hibernate类型的名字,建议大家使用对象型的Integer/Long定义主键column(可选-默认为标识属性名):主键字段的名字unsaved-value(可选-默认为一个字段判断(sensible)的值):一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。这可以把这种实例和从以前的session中装载过可能又做过修改)但未再次持久化的实例区分开来(session.saveOrUpdate时需要判断),映射文件二,Hibernate主键生成方式,Hibernate主键生成方式,映射文件三,property(1)name:属性的名字,以小写

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

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

17、 lock)。换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长,Hibernate基本数据类型,构造持久化类,必须有无参的构造器getter和setter的命名规则推荐使用id属性尽量不要用final声明(延迟加载失效)重载equals和hashCode方法重用脱管实例在Set中保存持久化的实例,持久化对象的状态,Transient Objects:使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。Persist O

18、bjects:持久实例是任何具有数据库标识的实例。它由持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。Detached Objects:Session关闭之后,持久化对象就变为detached对象。表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。,持久化对象的生命周期,Hibernate 程序设计,第三讲 Hibernate 高级映射,联合主键,public class Student implements pri

19、vate StudentPK pk;public class StudentPK implements private String firstName;private String lastName;,联合主键,组成关系映射,组成关系映射,特殊数据类型的映射,Clob(存储单字节的字符数据)Blob(存储二进制数据),自定义类型,Hibernate 程序设计,第四讲 Hibernate 关联映射,集合类映射,Set集合,name 集合属性的名称 table(可选)目标关联数据库表lazy(可选默认为false)允许延迟加载(lazy initialization)outer-join 默认a

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

21、 集合属性的名称 table(可选)目标关联数据库表lazy(可选默认为false)允许延迟加载(lazy initialization)inverse(可选默认为false)标记由哪一方来维护关联关系(双向关联中使用)。cascade(可选默认为none)让操作级联到子实体 order-by(可选,仅用于jdk1.4)指定表的字段(一个或几个)再加上asc或者desc(可选),定义Map,Set和Bag的迭代顺序 where(可选)指定任意的SQL where条件outer-join(可选-默认为auto)是否使用外联接,多对多,column(必需):中间映射表中,关联目标表的关联字段cla

22、ss(必需):类名,关联目标类outer-join(可选-默认为auto)column(必需):当前表的关联字段,继承关系映射,继承关系映射,三种继承策略,每棵类继承树使用一个表(table per class hierarchy)每个子类一个表(table per subclass)每个具体类一个表(table per concrete class),Hibernate 程序设计,第五讲 Hibernate 查询,查询概述,概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。标准化对象查询(Criteria Query):

23、以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)Hibernate语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。Native SQL Queries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。,HQL 实例,from Employeefrom Vendor as v where v.address=:ad

24、dress and v.name like java%select dept.name,dept.description from Department as dept order 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 Depar

25、tment where description is null,HQL 实例,select count(vendor),vendor.address from Vendor as vendor group by vendor.address order by count(vendor),标准化对象查询(Criteria Query),Criteria criteria=session.createCriteria(Employee.class);List list=criteria.list();增加查询条件:criteria.add(Restrictions.ge(salary,new Do

26、uble(1000);,原生SQL查询,SQLQuery sqlQuery=session.createSQLQuery(select*from h_employee e);,其他要考虑的问题,大批量处理性能问题,批量插入,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)/flush 插入数据

27、和释放缓存:session.flush();session.clear();mit();session.close();,批量更新或删除,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();,要点,理解O/R Mapping的概念理解4个基本API的作用理解持久化对象的概念以及状态转化几种典型映射关系对应的映射文件系统设计的问题(要不要DTO)要用好,关键还是要熟练掌握关系数据库的设计以及SQL查询语言,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号