hibernate培训.ppt_第1页
hibernate培训.ppt_第2页
hibernate培训.ppt_第3页
hibernate培训.ppt_第4页
hibernate培训.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

对象 关系映射 Hibernate 作者 钱安川 Moxie Email achqian 学员要求 熟悉Java SQL JDBC 掌握面向对象的开发方法 并有实际项目开发经验课程目标 理解O RMapping原理 掌握Hibernate开发的相关知识 并能使用Hibernate进行实际项目开发 目录 一 持久化层 O RMapping二 Hibernate入门三 Hibernate映射申明 Mappingdeclaration 四 持久化对象的状态和生命周期五 Hibernate查询六 Hibernate最佳实践 一 持久化层 O RMapping 基于B S的典型三层架构 如何分层 业务逻辑层和持久化层绝不要依赖于展现层 使用假设法测试 例子 1 一个显示课程考试分数的列表 现在要将不及格的分数用红色字体显示 低于60分 2 搜索 如何进行对象 关系数据库的匹配 publicclassUser privateStringname privateStringpassword privateListaddress createtabletbl user namevarchar 255 notnull passwordvarchar 255 primarykey name 如何进行对象 关系数据库的匹配 对象 关系数据库的不匹配范式 粒度 granularity 的问题子类型 subtypes 的问题同一性 identity 的问题与关联 associations 有关的问题对象结构导航 navigation 的问题范式不匹配的代价花费很多时间和精力来手工实现对象和关系的匹配 甚至要扭曲对象模型直到它与下层的关系技术匹配为止 JDBCAPI本身的问题 JDBC和SQL提供了一个面向语句 即命令 的方法从SQL数据库中来回移动数据 至少在三个时刻 Insert Update Select 必须指定一个结构化关系 这增加了设计和实现所需要的时间 基于关系数据库的持久层可选方案 基于关系数据库的持久层可选方案 O RMapping What Why 什么是O RMapping 对象 关系映射是一门非常实用的工程技术 它实现了Java应用中的对象到关系数据库中的表的自动的 和透明的 持久化 使用元数据 metadata 描述对象与数据库间的映射 O RMapping的优点提高生产率 Productivity 可维护性 Maintainability 更好性能 Performance 厂商独立性 Vendorindependence 二 Hibernate入门 Hibernate概述Hibernate是非常优秀 成熟的O RMapping框架 它提供了强大的对象和关系数据库映射以及查询功能 Hibernate优势开源 LGPL 成熟流行 约13000downloads month 自定义APIJBoss将用Hibernate3实现EntityBeans Hibernate开发步骤 一 持久化类的设计二 持久化类和关系数据库的映射三 应用的开发 持久化Java类必须遵循的原则 为类的持久化类字段申明访问方法 get set Hibernate对JavaBeans风格的属性实行持久化 实现一个默认的构造方法 constructor 这样的话Hibernate就可以使用Constructor newInstance 来实例化它们 如果是集合类型的属性 它的类型必须定义为集合的接口 例如 List Set 提供一个标识属性 identifierproperty 如果没有该属性 一些功能不起作用 比如 级联更新 Cascadedupdates Session saveOrUpdate 持久化类和关系数据库的映射 XDoclet 它通过在Java源代码中加入特定的JavaDoctag 从而为其添加特定的附加语义 之后通过XDoclet工具对代码中JavaDocTag进行分析 自动生成与代码对应的配置文件 Middlegen 从数据库中已有的表结构中生成Hibernate映射文件 当前版本是2 1可以去http boss bekk no boss middlegen下载 Hibernate核心接口 Configuration 概述 Configuration类负责管理Hibernate的配置信息 它包括如下内容 Hibernate运行的底层信息 数据库的URL 用户名 密码 JDBC驱动类 数据库Dialect 数据库连接池等 Hibernate映射文件 hbm xml Hibernate配置的两种方法 属性文件 hibernate properties 调用代码 Configurationcfg newConfiguration Xml文件 hibernate cfg xml 调用代码 Configurationcfg newConfiguration configure Configuration 例子 数据库连接的配置hibernate dialectnet sf hibernate dialect MySQLDialecthibernate connection driver classcom mysql jdbc Driverhibernate connection urljdbc mysql localhost hibernatehibernate connection usernameroothibernate connection password数据库连接池的配置 DBCP AppServer连接池首选 hibernate connection provider classnet sf hibernate connection DBCPConnectionProvider配置DBCP连接池其它hibernate show sqltruehibernate jdbc fetch size50hibernate jdbc batch size25 SessionFactory 概述 应用程序从SessionFactory 会话工厂 里获得Session 会话 实例 它在多个应用线程间进行共享 通常情况下 整个应用只有唯一的一个会话工厂 例如在应用初始化时被创建 然而 如果你使用Hibernate访问多个数据库 你需要对每一个数据库使用一个会话工厂 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据 调用代码 SessionFactorysessionFactory cfg buildSessionFactory Session 会话 概述 Session不是线程安全的 它代表与数据库之间的一次操作 它的概念介于Connection和Transaction之间 Session也称为持久化管理器 因为它是与持久化有关的操作接口 Session通过SessionFactory打开 在所有的工作完成后 需要关闭 它与Web层的HttpSession没有任何关系 调用代码Sessionsession sessionFactory openSession Transaction 事务 概述 它将应用代码从底层的事务实现中抽象出来 这可能是一个JDBC事务 一个JTA用户事务或者甚至是一个公共对象请求代理结构 CORBA 允许应用通过一组一致的API控制事务边界 这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性 调用代码 Transactiontx session beginTransaction 注 使用Hibernate进行操作时 增 删 改 必须显示的调用Transaction 默认 autoCommit false Query 概述 Query 查询 接口允许你在数据库上执行查询并控制查询如何执行 查询语句使用HQL或者本地数据库的SQL方言编写 调用代码 Queryquery session createQuery fromUser 用户的例子 持久化类 User javapublicclassUser privateLongid privateStringname privateDatebirthday privateStringemail publicUser publicUser Stringname Datebirthday Stringemail Get Set 映射文件 User hbm xml 应用 UserTest java publicvoidtestCreate throwsException Configurationcfg newConfiguration cfg addURL UserTest class getResource com test um User hbm xml SessionFactorysessionFactory cfg buildSessionFactory Sessionsession sessionFactory openSession Transactiontx session beginTransaction SimpleDateFormatformat newSimpleDateFormat yyyy mm dd Useruser newUser Jack format parse 1980 04 12 Jack session save user mit assertNotNull user getId session clear Useruser 2 User session get User class user getId assertNotNull user 2 session close 应用 UserTest java 保存用户 session save user 修改用户 session update user 保存或修改用户 session saveOrUpdate user 删除用户 session delete user 删除所有用户 session delete fromUser 查询用户名为 test 的用户 Queryquery session createQuery fromUserwhereuser name name query setParameter test user getName UserfindUser User query list get 0 三 Hibernate映射申明 Mappingdeclaration hibernate mapping一 类层次 class1 主键 id2 基本类型 property3 自定义类 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非常简单 主要是用来放置查询语句 便于对数据库查询的统一管理和优化 hibernate mapping 1 schema 可选 数据库SchemaName 2 default cascade 可选 默认为none 默认的级联风格 3 auto import 可选 默认为true 是否在查询中只使用类名 不用加package名字 4 package 可选 如果该映射文件中定义的类名不包含package 则使用这里定义的package作为类名的前缀 一 类层次class 1 主键 id 1 name 可选 标识属性的名称 2 type 可选 标识Hibernate类型的名字 3 column 可选 默认为属性名 对应数据库表的主键字段的名字 4 unsaved value 可选 默认为null 这个值用来判断对象是否要保存 1 1主键生成策略generator generator主键生成器 每个主键都必须定义相应的主键生成策略 它用来为持久化类实例生成唯一的标识 Hibernate内置的主键生成策略数据库提供的主键生成机制 identity sequence 序列 外部程序提供的主键生成机制 increment 递增 hilo 高低位 seqhilo 使用序列的高低位 uuid hex 使用了IP地址 JVM的启动时间 精确到1 4秒 系统时间 一个计数器值 在JVM中唯一 uuid string 其它 native 本地 assigned 手工指定 foreign 外部引用 2 基本类型 property 4 update insert 可选 默认为true 表明在用于UPDATE和 或INSERT的SQL语句中是否包含这个字段 5 formula 可选 一个SQL表达式 定义了这个计算 computed 属性的值 计算属性没有和它对应的数据库字段 3 1 自定义类 many to one 3 class 可选 默认是通过反射得到属性类型 关联的类的名字 4 cascade 级联 可选 指明哪些操作会从父对象级联到关联的对象 5 outer join 外连接 可选 默认为自动 hibernate use outer join 7 property ref 可选 指定关联类的一个属性 这个属性将会和本外相对应 例子 User Group 3 2 自定义类 one to one 一对一关联 主键关联和惟一外键关联两种方式 例子 User IdCard 外键关联 4 集合 Set 1 name集合属性的名称 2 table 可选 目标关联数据库表 3 lazy 可选 默认为false 允许延迟加载 lazyinitialization 4 inverse 可选 默认为false 标记有哪一方来维护关联关系 双向关联中使用 5 cascade 可选 默认为none 让操作级联到子实体 6 order by 可选 仅用于jdk1 4 指定表的字段 一个或几个 再加上asc或者desc 可选 定义Map Set和Bag的迭代顺序 7 where 可选 指定任意的SQLwhere条件 8 outer join 可选 默认为auto 是否使用外联接 4 1 one to many 概念 一对多关联直接连接两个类对应的表 而没有中间集合表 实现了一个一对多的关系模型 例如 User Address 这里的Java集合必须满足下面的语义 map set或list中不能包含null值一个被包含的实体的实例只能被包含在一个集合的实例中 1 class 必须 被关联类的名称 例子 one to many User Address 4 2 many to many 1 column 必需 中间映射表中 关联目标表的关联字段 2 class 必需 类名 关联目标类 3 outer join 可选 默认为auto 1 1 column 必需 当前表的关联字段 例子 manytomany student trainClass 5 继承 继承实现的三中策略单表继承 每棵类继承树使用一个表 tableperclasshierarchy 具体表继承 每个子类一个表 tablepersubclass 类表继承 每个具体类一个表 tableperconcreteclass 有一些限制 单表继承 例子 继承 user student 双向关联 概念 双向关联允许通过关联的任一端访问另外一端 在Hibernate中 支持两种类型的双向关联 一对多 one to many Set或者bag值在一端 单独值 非集合 在另外一端 多对多 many to many 两端都是set或bag值 例子 双向关联 group user 例子 从Java代码看group user双向关联的inverse 概念 inverse用来标识双向关联的关联关系由哪一端维护 默认inverse的值为false 由主动方负责维护关联关系 如果设为true 则由反向一端维护关联关系 用例 我们假设已经有一个Group类的实例 adminGroup 现在我们要新增一个用户 并且将用户分配到adminGroup中 inverse false 由主动方Group负责维护group user的关联关系 Useruser newUser Jak adminGroup getUsers add user session save user session update group inverse true 由Group的反向段User负责维护关联关系 Useruser newUser Jak user setGroup adminGroup session save user 四 持久化对象的状态 瞬时对象 TransientObjects 使用new操作符初始化的对象不是立刻就持久的 它们的状态是瞬时的 也就是说它们没有任何跟数据库表相关联的行为 只要应用不再引用这些对象 不再被任何其它对象所引用 它们的状态将会丢失 并由垃圾回收机制回收 持久化对 PersistObjects 持久实例是任何具有数据库标识的实例 它有持久化管理器Session统一管理 持久实例是在事务中进行操作的 它们的状态在事务结束时同数据库进行同步 当事务提交时 通过执行SQL的INSERT UPDATE和DELETE语句把内存中的状态同步到数据库中 离线对象 DetachedObjects Session关闭之后 持久化对象就变为离线对象 离线表示这个对象不能再与数据库保持同步 它们不再受Hibernate管理 持久化对象的生命周期 lifecycle Hibernate脏数据字段捡入 检索一个用户 并将它的用户名更改为 Mary Sessionsession sessionFactory openSession Transactiontx session beginTransaction Useruser User session get User class userId user setName Mary mit session close 持久化对象必须唯一 一个Session中不能同时存在两个ID相同的持久化对象例如 id为userId的user 1对象已经存在Session中 这时如果Session中试图产生一个user 2对象 Sessionsession sessionFactory openSession Transactiontx session beginTransaction Useruser 1 User session get User class userId Useruser 2 newUser userId Mary session update user 2 最后将会产生异常 net sf hibernate NonUniqueObjectException adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession解决办法 使用evict 方法将user 1实例从session中去除 session evict user 1 五 Hibernate查询 概述 数据查询与检索是Hibernate中的一个亮点 相对其他ORM实现而言 Hibernate提供了灵活多样的查询机制 标准化对象查询 CriteriaQuery 以对象的方式进行查询 将查询语句封装为对象操作 优点 可读性好 符合Java程序员的编码习惯 缺点 不够成熟 不支持投影 projection 或统计函数 aggregation Hibernate语言查询 HibernateQueryLanguage HQL 它是完全面向对象的查询语句 查询功能非常强大 具备继承 多态和关联等特性 Hibernate官方推荐使用HQL进行查询 NativeSQLQueries 原生SQL查询 直接使用数据库提供的SQL方言进行查询 例子 标准化对象查询 CriteriaQuery 简单例子 查询用户名以 J 开头的所有用户 Criteriacriteria session createCriteria User class criteria add Expression like name J Listusers criteria list Hibernate语言查询 HibernateQueryLanguage HQL HQL用面向对象的方式生成SQL以类和属性来代替表和数据列支持多态支持各种关联减少了SQL的冗余HQL支持所有的关系数据库操作连接 joins 包括Inner outer fulljoins 笛卡尔积 cartesianproducts 投影 projection 聚合 Aggregation max avg 和分组 group 排序 Ordering 子查询 Subqueries SQL函数 SQLfunctioncalls 例子 Hibernate语言查询 HibernateQueryLanguage HQL 简单例子 查询用户名以 J 开头的所有用户 Queryquery session createQuery fromUseruserwhereuser namelike J Listusers query list 复杂例子 从User和Group中查找属于 admin 组的所有用户 Queryquery session createQuery fromU

温馨提示

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

最新文档

评论

0/150

提交评论