对象关系映射Hibernateppt课件

上传人:沈*** 文档编号:174473431 上传时间:2022-12-15 格式:PPT 页数:37 大小:225.02KB
收藏 版权申诉 举报 下载
对象关系映射Hibernateppt课件_第1页
第1页 / 共37页
对象关系映射Hibernateppt课件_第2页
第2页 / 共37页
对象关系映射Hibernateppt课件_第3页
第3页 / 共37页
资源描述:

《对象关系映射Hibernateppt课件》由会员分享,可在线阅读,更多相关《对象关系映射Hibernateppt课件(37页珍藏版)》请在装配图网上搜索。

1、对象对象/关系映射关系映射HibernateEmail:课程目标:课程目标:w 理解O/R Mapping原理w 掌握Hibernate开发的相关知识w 能使用Hibernate进行实际项目开发目录目录一、持久化层O/R Mapping二、Hibernate入门三、Hibernate映射申明(Mapping declaration)四、持久化对象的状态和生命周期五、Hibernate查询六、Hibernate最佳实践一、持久化层一、持久化层O/R Mapping表现层逻辑层数据层业务逻辑层对象持久化层如何进行对象关系数据库的匹配如何进行对象关系数据库的匹配-oid:int-name:Strin

2、g-publish:Date-description:StringBookOidPublishNamedescription基于关系数据库的持久层可选方案基于关系数据库的持久层可选方案优点优点缺点缺点SQL/JDBC成熟,流行,使用DAO模式代码烦杂,可读性差,维护困难,移植困难Entity BeanCMP(EJB1.1之后),EJB3错误的设计。不可移植,依赖性强,不可序列化,不支持多态的关联查询JDO简单、透明、标准不够成熟基于关系数据库的持久层可选方案基于关系数据库的持久层可选方案优点优点缺点缺点Apache OJB性能、稳定性,属于Apache 基金组织文档资源太少,支持标准太多成了负

3、担(ODMG 3.0,JDO1.0)iBATIS可以控制更多的数据库操作细节。实用于遗留系统的改造和对既有数据库的复用。持久层封装不够彻底,只是一个DBHelper。Hibernate成熟、流行、功能强大。并逐渐发展成Java 持久层事实上的标准。不够透明O/R Mapping-What?Why?什么是什么是O/R Mapping?对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。O/R Mapping的优点的优点q 提高生产率(Productivity)q 可维护性(Ma

4、intainability)q 更好性能(Performance)q 厂商独立性(Vendor independence)二、二、Hibernate入门入门 Hibernate概述概述 Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。Hibernate优势优势q 开源(LGPL)q 成熟q 流行(约13 000 downloads/month)q 自定义APIq JBoss 将用Hibernate3实现Entity BeansHibernate开发步骤开发步骤一、持久化类的设计一、持久化类的设计二、持久化类和关系数据库二、持久化类

5、和关系数据库的映射的映射三、应用的开发三、应用的开发持久持久化化Java类必须遵循的原则类必须遵循的原则q 为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。q 实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。q 如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。q 提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)

6、Session.saveOrUpdate()。持久化类和关系数据库的映射持久化类和关系数据库的映射Hibernate核心接口核心接口Configuration 概述:概述:Configuration 类负责管理Hibernate 的配置信息。它包括如下内容:q Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。q Hibernate映射文件(*.hbm.xml)。Hibernate配置的两种方法:配置的两种方法:q 属性文件(hibernate.properties)。调用代码:Configuration cfg=new Co

7、nfiguration();q Xml文件(hibernate.cfg.xml)。调用代码:Configuration cfg=new Configuration().configure();Configuration例子 数据库连接的配置数据库连接的配置(用属性文件方式用属性文件方式)hibernate.dialect net.sf.hibernate.dialect.MySQLDialecthibernate.connection.driver_class com.mysql.jdbc.Driverhibernate.connection.url jdbc:mysql:/localhost

8、/hibernatehibernate.connection.username roothibernate.connection.password 数据库连接池的配置数据库连接池的配置DBCP(App Server连接池首选)连接池首选)hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider配置配置DBCP连接池连接池 其它hibernate.show_sql truehibernate.jdbc.fetch_size 50hibernate.jdbc.batch_size 2

9、5SessionFactory 概述:概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只用一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。调用代码:调用代码:SessionFactory sessionFactory=configuration.buildSessionFactory();Session(会话会话)概述:概述:q Session不是线程安

10、全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。q Session也称为持久化管理器,因为它是与持久化有关的操作接口。q Session通过SessionFactory打开,在所有的工作完成后,需要关闭。q 它与Web层的HttpSession没有任何关系。调用代码调用代码Session session=sessionFactory.openSession();Transaction(事务事务)概述:概述:它将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通

11、过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。调用代码:调用代码:Transaction tx=session.beginTransaction();v 注:注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。Query 概述:概述:Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。调用代码:调用代码:Query query=session.createQuery(“from User”);用

12、户的例子用户的例子持久化类持久化类User.javapublic class User private Long id;private String name;private Date birthday;private String email;public User()public User(String name,Date birthday,String email).Get/Set映射文件映射文件User.hbm.xml 应用应用UserTest.javapublic void testCreate()throws Exception Configuration cfg=new Conf

13、iguration();cfg.addURL(UserTest.class.getResource(/com/test/um/User.hbm.xml);SessionFactory sessionFactory=cfg.buildSessionFactory();Session session=sessionFactory.openSession();Transaction tx=session.beginTransaction();SimpleDateFormat format=new SimpleDateFormat(yyyy-mm-dd);User user=new User(Jack

14、,format.parse(1980-04-12),J);session.save(user);mit();assertNotNull(user.getId();session.clear();User user_2=(User)session.get(User.class,user.getId();assertNotNull(user_2);session.close();应用应用UserTest.java保存用户:session.save(user);修改用户:session.update(user);保存或修改用户:session.saveOrUpdate(user);删除用户:sess

15、ion.delete(user);删除所有用户:session.delete(“from User”);查询用户名为“test”的用户:Query query=session.createQuery(from User where user.name=:name);query.setParameter(“test,user.getName();User findUser=(User)query.list().get(0);三、三、Hibernate映射申明映射申明(Mapping declaration)hibernate-mapping一、类层次。class1、主键。id2、基本类型。pro

16、perty3、自定义类。many-to-one|one-to-one4、集合。set|list|map|array4.1、one-to-many4.2、many-to-many5、子类。subclass|joined-subclass6、其它。component|any等二、查询语句。Query说明:一个Hibernate-mapping中可以同时定义多个类。Query非常简单,主要是用来放置查询语句,便于对数据库查询的统一管理和优化。一、类层次一、类层次class1、主键、主键-idid name=propertyName (1)type=typename (2)column=column_

17、name (3)unsaved-value=any|none|null|id_value (4)(1)、name(可选):标识属性的名称。(2)、type(可选):标识Hibernate类型的名字。(3)、column(可选默认为属性名):对应数据库表的主键字段的名字。(4)、unsaved-value(可选默认为null):这个值用来判断对象是否要保存。1.1主键生成策略主键生成策略generator generator主键生成器,每个主键都必须定义相应的主键生成策略。它用来为持久化类实例生成唯一的标识。Hibernate内置的主键生成策略内置的主键生成策略q 数据库提供的主键生成机制。id

18、entity、sequence(序列)。q 外部程序提供的主键生成机制。increment(递增),hilo(高低位),seqhilo(使用序列的高低位),uuid.hex(使用了IP地址+JVM的启动时间(精确到1/4秒)+系统时间+一个计数器值(在JVM中唯一)),uuid.string。q 其它。native(本地),assigned(手工指定),foreign(外部引用)。2、基本类型、基本类型property(4)update,insert(可选-默认为 true):表明在用于UPDATE 和/或 INSERT的SQL语句中是否包含这个字段。(5)formula(可选):一个SQL表

19、达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据库字段。四、持久化对象的状态四、持久化对象的状态 瞬时对象瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。持久化对持久化对(Persist Objects):持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时同数据库进行同步。当事务提交时,

20、通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。离线对象离线对象(Detached Objects):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。持久化对象的生命周期(持久化对象的生命周期(lifecycle)持久化对象必须唯一持久化对象必须唯一 一个一个Session中不能同时存在两个中不能同时存在两个ID相同的持久化对象相同的持久化对象例如:id为userId的user_1对象已经存在Session中,这时如果Session中试图产生一个user_2对象!Session

21、 session=sessionFactory.openSession();Transaction tx=session.beginTransaction();User user_1=(User)session.get(User.class,userId);User user_2=new User(userId,”Mary”);session.update(user_2);最后将会产生异常:net.sf.hibernate.NonUniqueObjectException:a different object with the same identifier value was already

22、 associated with the session解决办法:使用evict()方法将user_1实例从session中去除。session.evict(user_1);五、五、Hibernate查询查询 概述:概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。q 标准化对象查询标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)q Hiber

23、nate语言查询(语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。q Native SQL Queries(原生原生SQL查询)查询):直接使用数据库提供的SQL方言进行查询。例子:标准化对象查询例子:标准化对象查询(Criteria Query)简单例子:简单例子:查询用户名以“J”开头的所有用户。Criteria criteria=session.createCriteria(User.class);criteria.add(Expression.l

24、ike(name,J%);List users=criteria.list();Hibernate语言查询(语言查询(Hibernate Query Language,HQL)HQL用面向对象的方式生成用面向对象的方式生成SQLq 以类和属性来代替表和数据列q 支持多态q 支持各种关联q 减少了SQL的冗余 HQL支持所有的关系数据库操作支持所有的关系数据库操作q 连接(joins,包括Inner/outer/full joins),笛卡尔积(cartesian products)q 投影(projection)q 聚合(Aggregation,max,avg)和分组(group)q 排序(O

25、rdering)q 子查询(Subqueries)q SQL函数(SQL function calls)例子:例子:Hibernate语言查询(语言查询(Hibernate Query Language,HQL)简单例子:简单例子:查询用户名以“J”开头的所有用户。Query query=session.createQuery(from User user where user.name like J%);List users=query.list();复杂例子:复杂例子:从User和Group中查找属于“admin”组的所有用户。Query query=session.createQuery

26、(“from User user where user.group.name=admin”);如果用传统的SQL则查询语句如下:select user.userId as userId,user.name as name,user.groupId as groupId,user.idCardId as idCardId from TBL_USER user,TBL_GROUP group where(group.groupName=admin and user.groupId=group.groupId)六、六、Hibernate最佳实践(最佳实践(Best Practices)1、使用Con

27、figuration装载映射文件时,不要使用绝对路径装载。最好的方式是通过getResourceAsStream()装载映射文件,这样Hibernate会从classpath中寻找已配置的映射文件。2、SessionFactory的创建非常消耗资源,整个应用一般只要一个SessionFactory就够了,只有多个数据库的时候才会使用多个SessionFactory。3、在整个应用中,Session和事务应该能够统一管理。(Spring为Hibernate提供了非常好的支持)4、将所有的集合属性配置设置为懒加载(lazy=”true”)。在hibernate2.x版本中,lazy默认值是“fal

28、se”,但hibernate3.x已经将lazy的默认改为“true”了。Hibernate最佳实践(最佳实践(Best Practices)5、在定义关联关系时,集合首选Set,如果集合中的实体存在重复,则选择List(在定义配置文件时,可以将List定义为bag),数组的性能最差。6、在一对多的双向关联中,一般将集合的inverse属性设置为true,让集合的对方维护关联关系。例如:Group-User,由User来维护Group和User的关联关系。7、HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。8、在非分布式架构中,不需要使用DTO来向上层传输数据。直接使用

29、POJO的Entity就可以了。9、如果要精通Hibernate,熟练掌握关系数据库理论和SQL是前提条件。Hibernate资源资源q 官方网站:http:/www.hibernate.orgq 国内网站:http:/q Java新视线论坛:http:/forum.hibernate.orgq Hibernate 中文开发指南作者夏昕(http:/ 深入浅出Hibernate作者:夏昕 曹晓钢 唐勇(http:/www.china- Hibernate in Action作者:Christian Bauer and Gavin King(http:/ Hibernate:A Developers Notebook作者:James Elliott

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!