




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、对象持久化与 解耦 DAO模 ORMObjectRelactionalMapper对象--关系型数据映射组 Hibernate做什 Hibernate存在的原因 Hibernate的优缺点 Hibernate使用范围 2、Hibernate项目开发过 3、通过MyEclipse来开发Hibernate项目(使用2.2的方式,以mysql为数据库 4、Hibernate中的持久化对象的生命周 5、HibernateAPI介绍与其使 Configuration接 Session接 6、Hibernatejar 7、Hibernate常用配置 8、ID主键生成策 10、*.hbm.xml与 11、hql语 12、Hibernate查 13、hibernate缓 15、hibernate悲观锁、乐观 1、对象持久化与解耦DAO模DAO对业务层提供数据抽象层接口数据逻辑分离数据底层实现的分离ORMObjectRelactionalMapper对象--关系型数据映ORM(ObjectRelationalMap)---是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。简单说:ORMJava数据持久业务表示数据持久业务表示
O--实体模R–关系模持久化实现类型(理解sqlDataClass:数据操作写在一个类中,sqlHibernatesql持久化框架介ApacheOJBJDO(是SUN一套标准—Java数据对象)Toplink(Orocle公司的)EJB(2.0XCMP;3.0X提出了一套“JavaAPI”---IBatis(非常的轻量级,对JDBC做了一个非常非常轻量级的包装,严格说不是O/R(实体/关系)映射框架,而是基于SQL的映射(提供了一套配置文件,把SQL语句配置到文件中,再配置一个对象进去,只要配置文件时,就可得到对象))JAP(SUN公司的一套标准)Hibernate做什么:NOSQL(非关系型数据库Hibernate存在的原因JDBC操作数据库很繁琐SQLO/RMap简化编O/R hibernate_0200_OR_MapHibernate的优缺点能够、更新、删除、加载对象,可以提高生产效;HibernateHibernate,移植性好(Hibernate标准开发,更换数据库时,只需要配置没有继承第框架的任何类它的任何接口)HibernateHibernateHibernate使用范围Hibernate(O/映射框架都不适合使用);要求使用数据库中特定的功能时不适合使用,HibernateSQL语句;2、Hibernate项目开发过3通过MyEclipse来开Hibernate项目(使用2.2的方式mysql为数据库)通过MyEclipseDatabaseExplorerHibernate的功能(右击项目->MyEclipse->AddHibnernateDatabaseExplorer将数据库中的表生成实体类与*.hbm.xmlHibernate4、Hibernate中的持久化对象的生命周Hibernate的开发者应该总是关注对象的状态(state)SQL使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再这些对象(不再被任何其它对象所),它们的状态将会丢失,并由回收机制回收持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作 它们的状态在事务结束时同数据库进行同步。当事务提交时SQLINSERT、UPDATEDELETE游离对象(DetachedSession关闭之后,持久化对象就变为游离对象。游离表示这个对象不能再与数据库保hibernate管理。Transient对象:随时可能被回收器回收(在数据库中没有于之对应的记录,应为是ID,缓存中也没有Detached对象:也可能被回收器回收掉(数据库中存在对应的记录,只是没有任何对象它是指session),注引状态经过Persistent状态,没有纳入session的管理5、HibernateAPI介绍与其使Configuration接Configuration接口的作用是对Hibernate进行配置并启动Hibernate和连接数据库系统。在Hibernate的启动过程中,Configuration类的实例首先定位缺省XML配置文件(hibernate.cg.xml,并关的配置项目,然后创建出一个SessionFactory对象。根ConfigurationcfgnewConfiguration();SessionFactorysessionFactory=Sessionsession=sessionFactory.openSession();Transactiontrans=null;Useruser=newUser();5.1.3XML配置文件(少用可以指定开发者自己的*.hbm.xml文件的位置,而不是使用默认的classpathSessionFactorySessionSessionsession=SessionFactorySessionFactory(占内存)SessionFactoryHibernateHibernateSQL语句等;SessionFactory的外置缓存是一个可配置的缓存插件在默认情况下,SessionFactory不会启用这个缓存插件。Session接HibernateSession是一个轻量级的类,创建和销毁它都不会占用很多SessionSession对象(将它设计为局部对象privatestaticThreadLocalthreadSession=newThreadLocal();publicstaticSessiongetThreadLocalSession(){Sessions=(Session)threadSession.get();if(s==null){}return}Log4jApacheLog4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守Log4jC、C++、.Net、PL/SQLLog4j,其语法和用法与在Java而且,通过使用各种第扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMPSessionSessionSession(操作SessionSessionclose()Session实例占用的资源。Session首先创建SessionFactory对象,应用程序如果多个数据源时,则应该产生多个SessionFactory;但是仅仅为了服务于某个请求时,不要创建一个新的SessionFactory,SessionFactory需要耗费大量的资源。SessionFactorySessionSession的编程规则---Sessin接口中针对单条记录CURDsessionsaveObject3、Session.load(Classarg0,Serializablearg1throwsarg1:查询条件(实现了序列化接口的对象):例 hibernate此方法返回类型为Object,但返回的是对象SQLloadlazy(称为延迟加载、赖加载延迟加载:只有真正使用这个对象的时候,才加载(SQL语句hibernate延迟加载实现原理是方式trysession=sf.openSession();Useruser=//SQL//因为此的user为persistent状态,所以数据库进行同步为}catch(HibernateExceptione){}if(session!=if(session.isOpen()){}}}4、格式:Session.get(Classarg0,Serializablearg1) 型,则hibernate会自动转换成包装类,如1Object,也就是对象,然后我们再强行转换为需要加载的SQLUser对象try
session=sf.openSession();*Object,也就是对象,然后我们再强行转换为需要加载null*SQLUserUseruser=(User)session.get(User.class,//persistent//因为此的user为persistent状态,所以数据库进行同步为}catch(HibernateExceptione){}if(session!=if(session.isOpen()){}}5、load()与get()区load返回的是对象,等到真正使用对象的内容时才发出sql语句,这样就要求在第sessionopen状态,否则出错getHQL6、detachedpersistent状态(默认更新全部字段)更新transient对象会报错(ID)ID的transient对象可以(默认更新全部字段1:update/updatable属性xml:设定<property>的update属性,设置在更新时是否参数更<propertyname="name"annotateon:设定@Columnupdatable属性值,true参与更新,falsepublicStringgetTitle(){return方法二:dynamic-update属性xml方式,JAP1.0annotationsession(session),如果session同样会更新所有的字段内容。publicvoidtestUpdate5()Sessionsession=sessionFactory.getCurrentSession();Students=(Student)session.get(Student.class,1);//namespersistentSessionsession2=sessionFactory.getCurrentSession();//spersistent publicvoidtestUpdate6()Sessionsession=sessionFactory.getCurrentSession();Students=(Student)session.get(Student.class,1);Sessionsession2=sessionFactory.getCurrentSession();publicvoidtestUpdate7()Sessionsession=sessionFactory.getCurrentSession();Queryq="updateS='z5'wheres.id=1");}7、updatesave8、session缓loadget,都会首先查找缓存(session级缓存),如果没有,clear()session缓存Sessionsession=sessionFactory.getCurrentSession();SELECTsession.clear()去除,则只会发出一条SELECTloadsessionID1的对象,而这个对象已经load到缓存中了。9、在hibernate中也存在flush这个功能,在默认的情况下 执行了一个flush命令。Session.flush功能:sql(SQL语句(update、insert、delete语句等),语句。SessionFlushModeFlushMode.AUTO:自flush(默认MIT:commitflushFlushMode.MANUALflush。FlushMode.NEVER:不flush此选项在性能优化时可能用,比如session取数据为flushsession开启事务之前设置。flush;在执行查询前,如uuidsession.save()时并不会发出session.saveSQL语句。10、session缓存(EntityEntries属性)中逐出该对象commit同时使用,会抛出异常session=HibernateUtils.getSession();tx=session.beginTransaction();User1user=newUser1();//利用Hiberner主键生成策略采用的是d,erininertd已经生成,ntsInDabasealsesession.evict(user);//session缓存(EntityEntries属性)//hibernatesession的临时集合(insertions)中取evictusersession中逐出了,所以找不到相关数据,无法更新,抛出异常。session//flush后hibernateusersession中的usersessionexistsInDatabasefalsesession.evict(user);//session缓存(EntityEntries属性)//hibernateSessioninsertionsuserinsertsessionexistsInDatabaseTransaction接(Hibernate事务的时候会详细讲)Transactiontx=null;tx=session.beginTransaction();if(tx!=null){}throwif(session!=null){}}}6、HibernatejarHibernate所需要第类库的Jar包文件的列7Hibernate常用SessionFactoryschemaDDL导出到数据库create-drop时,SessionFactorydropschema.取值validate|update|create|create-dropSQL语句到控制台.org.hibernate.SQL这个log取值:true|logconsoleSQL。取值:true|false8ID主键生成策自然主键和主对象标识Java语言:内存地址OIDHibernateOIDHibernate内置的标识increment标识符具有以下适用范围由于incrementOIDlong、intshortidentity标识符具有以下适用范围据库系统:DB2,MySQL,MSSQLServer,等等OIDlong、intshortsequence标识符具有以下适用范围sequence生成标识符的机制依赖于底层数据库系统的序列,因此要求底层数据库OIDlong、intshorthilo标识符具有以下适用范围hilohiloOIDlong、intshortnative标识符具有以下适用范围OIDlong、intshort9、关系映射(重点一对多双向关1)在Customer类中关联Order映射Order<many-to-one>元素的属映射Customer<set>元素的属<set>元素包括以下属性name:设定待映射的持久化类的属性名,这里cascade:当取值为“save-update”,表示级存和更新像端。Hibernate不会按照镜像端的对象的状态变化去更<set>元素还包含两个子元素:<key><one-to-many>ORDERS表的CUSTOMER_ID字段。区分delete-orphan和非delete-orphan的行组合关建立精粒度对象模假定在User类中的name有两个属性:firstName为了提高程序代码的可重用性不妨从User类中抽象出单独的Name类不仅User类可以Name类如果日后又增加了Employee类,它也包含信息,那么Employee类也能Name类。按这种设建立粗粒度关系数据模入、更新、删除和查询等sql操作时,都必须建立多个表的连接,这映射组成关由于建立域模型和关系数据模型有着不同的出发点把粗粒度的表拆分为具有外键参照关系的几个细粒度的从而节空间;另一方面,在没有数据冗余的前提下,应该尽可能减少的数目简化表之间的参照关系以便提供数据库的速度因此,在建立关系数据模型时需要在节省数据空间和节省数据时域模型User类Name关系数据模User表在创建对象-关系映射文件时,不能使用<property>元素类映射类的name属性,而要使用<hibernate-mappackage="com.example.<idname="id" <propertyname="firstName" <propertyname="lastName" </hibernate-map区分值(Value)类型和实体(Entity)类Name类没有OID,因此不能通过Session来单独保存、更新、删除或加载一个Name对象,例如以下每行代码都会抛出MapExc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度绿地系统绿化工程施工及维护合同
- 2025年智慧城市建设项目合作合同范本
- 2025年度房地产项目众筹销售代理服务合同
- 二零二五年度校园信息化设备采购安装合同
- 印度尼西亚河南交通郭婕21课件
- 二零二五年度生物制药生产订单合同范本集
- 2025版河堤工程景观设计与施工一体化合同
- 2025年度智能交通系统承包合同书热
- 2025年度跨境电商进口货物代理服务合同范本
- 2025版地下室车位买卖及车位使用权互换合同
- 住宿流水单免费模板
- 北京中考英语词汇表(1600词汇)
- 五年级下册英语教案-Unit 4 When is the art show?Part B Let's try Let's talk 人教(PEP)
- 北京大学金融伦理学 (3)课件
- 2021年杨凌现代农业国际合作有限公司招聘笔试试题及答案解析
- BWD3K130干式变压器温控器说明书
- 全员育人导师制工作手册
- 220kV输线路220kV间隔扩建工程施工组织设计(定稿)
- HSE管理体系审核员培训考核测试试卷
- 广柴8320ZCD管理须知
- 08S305-小型潜水泵选用及安装图集
评论
0/150
提交评论