版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、对象对象/关系映射关系映射Hibernateq学员要求:熟习学员要求:熟习Java、SQL、JDBC,掌握面向对象,掌握面向对象的开发方法,并有实践工程开发阅历的开发方法,并有实践工程开发阅历q课程目的:了解课程目的:了解O/R Mapping原理,掌握原理,掌握Hibernate开开发的相关知识,并能运用发的相关知识,并能运用Hibernate进展实践工程开发进展实践工程开发目录目录一、耐久化层O/R Mapping二、Hibernate入门三、Hibernate映射声明Mapping declaration四、耐久化对象的形状和生命周期五、Hibernate查询六、Hibernate最正确
2、实际一、耐久化层一、耐久化层O/R Mapping基于B/S的典型三层架构如何分层?如何分层?业务逻辑层和耐久化层业务逻辑层和耐久化层绝不要依赖于展现层。绝不要依赖于展现层。运用假设法测试。运用假设法测试。例子:例子:1、一个显示课程、一个显示课程考试分数的列表。如今考试分数的列表。如今要将不及格的分数用红要将不及格的分数用红色字体显示低于色字体显示低于60分。分。2、搜索。、搜索。如何进展对象关系数据库的匹配如何进展对象关系数据库的匹配public class User private String name; private String password;private List add
3、ress;create table tbl_user name varchar255 not null , password varchar255,.primary key name 如何进展对象关系数据库的匹配?如何进展对象关系数据库的匹配?对象对象关系数据库关系数据库类的属性根本类型表的列类表1:n/n:1外键n:m关联表继承单表继承、详细表继承、类表继承对象对象关系数据库的不匹配范式关系数据库的不匹配范式q 粒度granularity的问题q 子类型subtypes的问题q 同一性identity的问题q 与关联associations有关的问题q 对象构造导航navigation的问题
4、q 范式不匹配的代价q 破费很多时间和精神来手工实现对象和关系的匹配。q 甚至要扭曲对象模型直到它与下层的关系技术匹配为止。q JDBC API本身的问题。JDBC和SQL提供了一个面向语句即命令的方法从SQL数据库中来回挪动数据。至少在三个时辰Insert,Update,Select必需指定一个构造化关系,这添加了设计和实现所需求的时间。 基于关系数据库的耐久层可选方案基于关系数据库的耐久层可选方案优点优点缺点缺点SQL/JDBC成熟,流行,使用DAO形式代码烦杂,可读性差,维护困难,移植困难Entity BeanCMPEJB1.1之后,将来的EJB3错误的设计。不可移植,依赖性强,不可序列
5、化,不支持多态的关联查询JDO简单、透明、标准不够成熟基于关系数据库的耐久层可选方案基于关系数据库的耐久层可选方案优点优点缺点缺点Apache OJB性能、稳定性,属于Apache 基金组织文档资源太少,支持标准太多成了负担ODMG 3.0,JDO1.0iBATIS可以控制更多的数据库操作细节。实用于遗留系统的改造和对既有数据库的复用。持久层封装不够彻底,只是一个DBHelper。Hibernate成熟、流行、功能强大。并逐渐开展成Java 持久层事实上的标准。不够透明O/R Mapping -What? Why? 什么是什么是O/R Mapping? 对象对象-关系映射是一门非常适用的工程技
6、术,它实现关系映射是一门非常适用的工程技术,它实现了了Java运用中的对象到关系数据库中的表的自动的运用中的对象到关系数据库中的表的自动的和透明的耐久化,运用元数据和透明的耐久化,运用元数据meta data描画描画对象与数据库间的映射。对象与数据库间的映射。 O/R Mapping的优点的优点 提高消费率提高消费率Productivity 可维护性可维护性Maintainability 更好性能更好性能Performance 厂商独立性厂商独立性Vendor independence二、二、Hibernate入门入门 Hibernate概述概述 Hibernate是非常优秀、成熟的是非常优秀
7、、成熟的O/R Mapping框架。框架。它提供了强大的对象和关系数据库映射以及查询功能。它提供了强大的对象和关系数据库映射以及查询功能。 Hibernate优势优势 开源开源LGPL 成熟成熟 流行约流行约13 000 downloads/month 自定义自定义API JBoss 将用将用Hibernate3实现实现Entity BeansHibernate开发步骤开发步骤一、耐久化类的设计一、耐久化类的设计二、耐久化类和关系数据库二、耐久化类和关系数据库的映射的映射三、运用的开发三、运用的开发耐久化耐久化Java类必需遵照的原那么类必需遵照的原那么q 为类的耐久化类字段声明访问方法get
8、/set。Hibernate对JavaBeans风格的属性实行耐久化。q 实现一个默许的构造方法constructor。这样的话Hibernate就可以运用Constructor.newInstance来实例化它们。q 假设是集合类型的属性,它的类型必需定义为集合的接口。例如:List、Set。q 提供一个标识属性identifier property。假设没有该属性,一些功能不起作用,比如:级联更新Cascaded updatesSession.saveOrUpdate。耐久化类和关系数据库的映射耐久化类和关系数据库的映射XDoclet:它经过在:它经过在Java源代码中参与特定的源代码中参
9、与特定的JavaDoc tag,从而为其添加特定的附加语义,从而为其添加特定的附加语义,之后经过,之后经过XDoclet工具对代码中工具对代码中JavaDoc Tag进展分析,自动生成与代码对应的配置文进展分析,自动生成与代码对应的配置文件件 从数据库中已从数据库中已有有的表构造中生成的表构造中生成Hibernate映射文映射文件。当前版本是件。当前版本是2.1可以去可以去 boss.bekk.no/boss/middlegen下载。下载。Hibernate中心接口中心接口Configuration 概述:概述:Configuration 类担任管理类担任管理Hibernate 的配置信息的配
10、置信息。它包括如下内容:。它包括如下内容: Hibernate运转的底层信息:数据库的运转的底层信息:数据库的URL、用户名、用户名、密码、密码、JDBC驱动类,数据库驱动类,数据库Dialect,数据库衔接池等。数据库衔接池等。 Hibernate映射文件映射文件*.hbm.xml。 Hibernate配置的两种方法:配置的两种方法: 属性文件属性文件perties。 调用代码:调用代码:Configuration cfg = new Configuration; Xml文件文件hibernate.cfg.xml。 调用代码:调用代码:Configuration c
11、fg = new Configuration.configure;Configuration例子 数据库衔接的配置数据库衔接的配置 hibernate.dialect net.sf.hibernate.dialect.MySQLDialect hibernate.connection.driver_class com.mysql.jdbc.Driver hibernate.connection.url jdbc:mysql localhost/hibernate hibernate.connection.username root hibernate.connection.password 数
12、据库衔接池的配置数据库衔接池的配置DBCPApp Server衔接池首选衔接池首选 vider_class net.sf.hibernate.connection.DBCPConnectionProvider 配置配置DBCP衔接池衔接池 其它其它 hibernate.show_sql true hibernate.jdbc.fetch_size 50 hibernate.jdbc.batch_size 25SessionFactory 概述:运用程序从概述:运用程序从SessionFactory会话工厂里获得会话工厂里获得Session会会话实
13、例。它在多个运用线程间进展共享。通常情况下,整个运用话实例。它在多个运用线程间进展共享。通常情况下,整个运用只需独一的一个会话工厂只需独一的一个会话工厂例如在运用初始化时被创建。然而,例如在运用初始化时被创建。然而,假设他运用假设他运用Hibernate访问多个数据库,他需求对每一个数据库运访问多个数据库,他需求对每一个数据库运用一个会话工厂。用一个会话工厂。 会话工厂缓存了生成的会话工厂缓存了生成的SQL语句和语句和Hibernate在运转时运用的映在运转时运用的映射元数据。射元数据。 调用代码:调用代码: SessionFactory sessionFactory = cfg.buildS
14、essionFactory;Session会话会话 概述:概述: Session不是线程平安的,它代表与数据库之间的一次操不是线程平安的,它代表与数据库之间的一次操作,它的概念介于作,它的概念介于Connection和和Transaction之间。之间。 Session也称为耐久化管理器,由于它是与耐久化有关也称为耐久化管理器,由于它是与耐久化有关的操作接口。的操作接口。 Session经过经过SessionFactory翻开,在一切的任务完成后翻开,在一切的任务完成后,需求封锁。,需求封锁。 它与它与Web层的层的 Session没有任何关系。没有任何关系。 调用代码调用代码 Session
15、 session = sessionFactory.openSession;Transaction事务事务 概述:概述: 它将运用代码从底层的事务虚现中笼统出来它将运用代码从底层的事务虚现中笼统出来这这能够是一个能够是一个JDBC事务,一个事务,一个JTA用户事务或者甚至是用户事务或者甚至是一个公共对象恳求代理构造一个公共对象恳求代理构造CORBA允许运用允许运用经过一组一致的经过一组一致的API控制事务边境。这有助于坚持控制事务边境。这有助于坚持Hibernate运用在不同类型的执行环境或容器中的可移运用在不同类型的执行环境或容器中的可移植性。植性。 调用代码:调用代码: Transacti
16、on tx = session.beginTransaction; 注:运用注:运用Hibernate进展操作时增、删、改必需显进展操作时增、删、改必需显示的调用示的调用Transaction默许:默许:autoCommit=false。Query 概述:概述: Query查询接口允许他在数据库上执行查询并控制查询接口允许他在数据库上执行查询并控制查询如何执行。查询语句运用查询如何执行。查询语句运用HQL或者本地数据库的或者本地数据库的SQL方言编写。方言编写。 调用代码:调用代码: Query query = session.createQuery“from User; 用户的例子用户的例子
17、耐久化类耐久化类User.javapublic class User private Long id; private String name; private Date birthday; private String ; public User public UserString name,Date birthday,String .Get/Set映射文件映射文件User.hbm.xml 运用运用UserTest.javapublic void testCreate throws Exception Configuration cfg = new Configuration; cfg.ad
18、dURLUserTest.class.getResource/com/test/um/User.hbm.xml; SessionFactory sessionFactory = cfg.buildSessionFactory; Session session = sessionFactory.openSession; Transaction tx = session.beginTransaction; SimpleDateFormat format = new SimpleDateFormatyyyy-mm-dd; User user = new UserJack,format.parse19
19、80-04-12,Jackyahoo ; session.saveuser; tx mit; assertNotNulluser.getId; session.clear; User user_2 = Usersession.getUser.class,user.getId; assertNotNulluser_2; session.close; 运用运用UserTest.java保管用户:session.saveuser;修正用户:session.updateuser;保管或修正用户:session.saveOrUpdateuser;删除用户:session.deleteuser;删除一切用
20、户:session.delete“from User ;查询用户名为“test的用户:Query query = session.createQueryfrom User where = :name;query.setParameter“test,user.getName; User findUser = User query.list.get0;三、三、Hibernate映射声明映射声明Mapping declarationhibernate-mapping一、类层次。class1、主键。id2、根本类型。property3、自定义类。many-to-one | one-
21、to-one4、集合。set | list | map | array4.1、one-to-many4.2、many-to-many5、子类。subclass | joined-subclass6、其它。component | any等二、查询语句。Query阐明:一个Hibernate-mapping中可以同时定义多个类。Query非常简单,主要是用来放置查询语句,便于对数据库查询的一致管理和优化。hibernate-mapping1、schema可选:数据库Schema Name2、default-cascade可选,默以为none:默许的级联风格3、auto-import可选,默以为tr
22、ue:能否在查询中只运用类名。不用加package名字。4、package可选,假设该映射文件中定义的类名不包含package,那么运用这里定义的package作为类名的前缀。一、类层次一、类层次class1、主键、主键-idid name=propertyName 1 type=typename 2 column=column_name 3 unsaved-value=any|none|null|id_value 4 1、name 可选 :标识属性的称号。2、type可选:标识Hibernate类型的名字。3、column可选默以为属性名:对应数据库表的主键字段的名字。4、unsaved-v
23、alue可选默以为null:这个值用来判别对象能否要保管。 1.1主键生成战略主键生成战略generator generator 主键生成器,每个主键都必需定义相应的主键生成战略主键生成器,每个主键都必需定义相应的主键生成战略。它用来为耐久化类实例生成独一的标识。它用来为耐久化类实例生成独一的标识。 Hibernate内置的主键生成战略内置的主键生成战略 数据库提供的主键生成机制。数据库提供的主键生成机制。identity、sequence序列序列 。 外部程序提供的主键生成机制。外部程序提供的主键生成机制。increment 递增递增 ,hilo上下位上下位 ,seqhilo运用序列的上下位
24、运用序列的上下位 ,uuid.hex运用了运用了IP地址地址+JVM的启动时间准确到的启动时间准确到1/4秒秒+系统时间系统时间+一个计数器值在一个计数器值在JVM中独一中独一 ,uuid.string。 其它。其它。native本地,本地,assigned手工指定,手工指定,foreign外部援用。外部援用。2、根本类型、根本类型property4 update, insert 可选 - 默以为 true :阐明在用于UPDATE 和/或 INSERT的SQL语句中能否包含这个字段。 5 formula 可选: 一个SQL表达式,定义了这个计算computed 属性的值。计算属性没有和它对应
25、的数据库字段。3.1、自定义类、自定义类many-to-one3 class 可选 - 默许是经过反射得到属性类型: 关联的类的名字。 4 cascade级联 可选: 指明哪些操作会从父对象级联到关联的对象。 5 o u t e r - j o i n 外 衔 接 可 选 - 默 以 为 自 动 hibernate.use_outer_join 7 property-ref: 可选 指定关联类的一个属性,这个属性将会和本外相对应。例子例子:User-Group3.2、自定义类one-to-one 一对一关联:主键关联和独一外键关联两种方式。一对一关联:主键关联和独一外键关联两种方式。 例子:例
26、子:User-IdCard外键关联外键关联 4、集合、集合Set1 name 集合属性的称号 2 table 可选目的关联数据库表3 lazy 可选默以为false允许延迟加载lazy initialization 4 inverse 可选默以为false 标志有哪一方来维护关联关系双向关联中运用。 5 cascade 可选默以为none 让操作级联到子实体 6 order-by 可选, 仅用于jdk1.4 指定表的字段一个或几个再加上asc或者desc可选, 定义Map,Set和Bag的迭代顺序 7 where 可选 指定恣意的SQL where条件8 outer-join可选-默以为aut
27、o能否运用外联接4.1、one-to-many概念:一对多关联直接衔接两个类对应的表概念:一对多关联直接衔接两个类对应的表,而没有中而没有中间集合表。实现了一个一对多的关系模型,例如:间集合表。实现了一个一对多的关系模型,例如:User-Address这里的这里的Java集合必需满足下面的语义:集合必需满足下面的语义:map,set或或list中不能包含中不能包含null值值一个被包含的实体的实例只能被包含在一个集合的实例一个被包含的实体的实例只能被包含在一个集合的实例中中1 class必需必需:被关联类的称号。被关联类的称号。例子例子one-to-many:User-Address 4.2、
28、many-to-many1 column必需: 中间映射表中,关联目的表的关联字段2 class 必需: 类名,关联目的类3 outer-join 可选 - 默以为auto 11 column必需:当前表的关联字段例子例子many to many:student-trainClass5、承继、承继 承继实现的三中战略承继实现的三中战略 单表承继。每棵类承继树运用一个表单表承继。每棵类承继树运用一个表table per class hierarchy 详细表承继。每个子类一个表详细表承继。每个子类一个表table per subclass 类表承继。每个详细类一个表类表承继。每个详细类一个表ta
29、ble per concrete class有一些限制有一些限制 单表承继单表承继 例子承继:例子承继:user-student双向关联双向关联 概念:双向关联允许经过关联的任一端访问另外一端。概念:双向关联允许经过关联的任一端访问另外一端。在在Hibernate中中, 支持两种类型的双向关联。支持两种类型的双向关联。 一对多一对多one-to-many,Set或者或者bag值在一端值在一端, 单独值单独值非集合在另外一端非集合在另外一端 。 多对多多对多many-to-many,两端都是,两端都是set或或bag值。值。例子双向关联:例子双向关联:group-user 例子:从例子:从Jav
30、a代码看代码看group-user双向关双向关联的联的inverse 概念:概念:inverse用来标识双向关联的关联关系由哪一端维用来标识双向关联的关联关系由哪一端维护。默许护。默许inverse的值为的值为false,由自动方担任维护关联关,由自动方担任维护关联关系;假设设为系;假设设为true,那么由反向一端维护关联关系。,那么由反向一端维护关联关系。 用例:我们假设曾经有一个用例:我们假设曾经有一个Group类的实例:类的实例:adminGroup,如今我们要新增一个用户,并且将用户,如今我们要新增一个用户,并且将用户分配到分配到adminGroup中。中。 inverse=“fals
31、e,由自动方,由自动方Group担任维护担任维护group-user的关联关系的关联关系. User user = new User“Jak; adminGroup.getUsers.adduser; session.saveuser;session.updategroup; inverse=“true,由,由Group的反向段的反向段User担任维护关联担任维护关联关系。关系。 User user = new User“Jak; user .setGroupadminGroup;session.saveuser;四、耐久化对象的形状四、耐久化对象的形状 瞬时对象瞬时对象Transient O
32、bjects:运用:运用new 操作符初始操作符初始化的对象不是立刻就耐久的。它们的形状是瞬时的,也化的对象不是立刻就耐久的。它们的形状是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只需运就是说它们没有任何跟数据库表相关联的行为,只需运用不再援用这些对象不再被任何其它对象所援用,用不再援用这些对象不再被任何其它对象所援用,它们的形状将会丧失,并由渣滓回收机制回收。它们的形状将会丧失,并由渣滓回收机制回收。 耐久化对耐久化对Persist Objects:耐久实例是任何具有数:耐久实例是任何具有数据库标识的实例。它有耐久化管理器据库标识的实例。它有耐久化管理器Session一致管理,一致
33、管理,耐久实例是在事务中进展操作的耐久实例是在事务中进展操作的它们的形状在事务它们的形状在事务终了时同数据库进展同步。当事务提交时,经过执行终了时同数据库进展同步。当事务提交时,经过执行SQL的的INSERT、UPDATE和和DELETE语句把内存中的语句把内存中的形状同步到数据库中。形状同步到数据库中。 离线对象离线对象Detached Objects:Session封锁之后,耐封锁之后,耐久化对象就变为离线对象。离线表示这个对象不能再与久化对象就变为离线对象。离线表示这个对象不能再与数据库坚持同步,它们不再受数据库坚持同步,它们不再受Hibernate管理。管理。耐久化对象的生命周期耐久化
34、对象的生命周期lifecycleHibernate脏数据字段捡入 检索一个用户,并将它的用户名更改为检索一个用户,并将它的用户名更改为“Mary Session session = sessionFactory.openSession; Transaction tx = session.beginTransaction; User user = User session.getUser.class, userId; user.setNameMary; tx mit; session.close;耐久化对象必需独一耐久化对象必需独一 一个一个Session中不能同时存在两个中不能同时存在两个ID
35、一样的耐久化对象一样的耐久化对象 例如:例如:id为为userId的的user_1对象曾经存在对象曾经存在Session中,这中,这时假设时假设Session中试图产生一个中试图产生一个user_2对象!对象! Session session = sessionFactory.openSession; Transaction tx = session.beginTransaction; User user_1 = Usersession.getUser.class,userId; User user_2 = new UseruserId,Mary; session.updateuser_2;
36、最后将会产生异常:最后将会产生异常:net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 处理方法:处理方法: 运用运用evict 方法将方法将user_1实例从实例从session中中去除。去除。session.evictuser_1;五、五、Hibernate查询查询 概述:数据查询与检索是概述:数据查询与检索是Hibernate中的一个亮点。相中的一个亮点。相对其他对其他ORM实
37、现而言,实现而言,Hibernate提供了灵敏多样的查提供了灵敏多样的查询机制。询机制。 规范化对象查询规范化对象查询Criteria Query:以对象的方式进:以对象的方式进展查询,将查询语句封装为对象操作。优点:可读性好展查询,将查询语句封装为对象操作。优点:可读性好,符合,符合Java 程序员的编码习惯。缺陷:不够成熟,不支程序员的编码习惯。缺陷:不够成熟,不支持投影持投影projection或统计函数或统计函数aggregation Hibernate言语查询言语查询Hibernate Query Language,HQL:它是完全面向对象的查询语句,查询功能非常强大:它是完全面向对
38、象的查询语句,查询功能非常强大,具备承继、多态和关联等特性,具备承继、多态和关联等特性 。Hibernate官方引荐官方引荐运用运用HQL进展查询。进展查询。 Native SQL Queries原生原生SQL查询:直接运用数据查询:直接运用数据库提供的库提供的SQL方言进展查询。方言进展查询。例子:规范化对象查询例子:规范化对象查询Criteria Query 简单例子:查询用户名以简单例子:查询用户名以“J开头的一切用户。开头的一切用户。Criteria criteria = session.createCriteriaUser.class; criteria.addExpression.
39、likename,J%; List users = criteria.list;Hibernate言语查询言语查询Hibernate Query Language,HQL HQL用面向对象的方式生成用面向对象的方式生成SQL 以类和属性来替代表和数据列以类和属性来替代表和数据列 支持多态支持多态 支持各种关联支持各种关联 减少了减少了SQL的冗余的冗余 HQL支持一切的关系数据库操作支持一切的关系数据库操作 衔接衔接joins,包括包括Inner/outer/full joins,笛卡尔积,笛卡尔积cartesian products 投影投影projection 聚合聚合Aggregation,max, avg和分组和分组group 排序排序Ordering 子查询子查询Subqueries SQL函数函数SQL function calls例子:例子: Hibernate言语查询言语查询Hibernate Query Language,HQL 简单例子:查询用户名以简单例子:查询用户名以“J开头的一切用户。开头的一切用户。Query query = session.createQueryfrom User user where like J%; List users = query.list; 复杂例子:从复杂例子:从User和和Gr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省吉安永丰县联考2026届初三1月教学质量检测试题英语试题试卷含解析
- 河南省郑州市名校联考2026届初三第二学期3月第一次测试语文试题含解析
- 云南省红河市达标名校2026届初三下学期数学试题统练(七)(期中模拟)含解析
- 山东省乐陵市实验中学2025-2026学年初三下学期期初自测语文试题含解析
- 湖南邵阳县2025-2026学年第二学期期末初三联考英语试题含解析
- 陕西省榆林市绥德县市级名校2026年初三全真语文试题模拟试卷(4)含解析
- 慢性偏头痛耳穴三序疗法护理
- 2026年行纪合同和承揽合同(1篇)
- 第四单元 崇尚法治精神
- 培训入学合同
- 2025年中国饰品行业发展状况与消费行为调查数据-
- (一模)扬州市2026届高三模拟调研测试数学试卷(含答案详解)
- 2026福建水投集团沙县水务有限公司招聘4人笔试参考题库及答案解析
- 2025-2026学年北京市东城区九年级(上)期末英语试卷
- 【答案】《当代社会中的科学与技术》(南京大学)章节期末慕课答案
- 建筑防火安全培训
- 2025年云南省公务员录用考试《行测》真题及解析及答案
- 规范村干部坐班制度
- 2026年高密度互连板(HDI)项目可行性研究报告
- 癫痫培训教学课件
- 职业装讲标实战培训课件
评论
0/150
提交评论