Hibernate学习.doc_第1页
Hibernate学习.doc_第2页
Hibernate学习.doc_第3页
Hibernate学习.doc_第4页
Hibernate学习.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

第一天持久层:实现对数据的持久化持久化:广义,对于数据对象的CRUD操作DAO模式:DATA Access ObjectORM object relation Mappingjava面向对象 关系型数据库ORM对象 关系 映射类 表对象 记录属性(成员变量) 关系类之间的关系 表之间的关系CRUD(create read update delete)增删改查业务逻辑层 持久层 数据库(封装的方法)注册 c create添加 u update删除 d delete查询 r read充血模型类本身封装了crud方法DAO (data Access Object) (处理的类名+Dao) 这里封装了crud方法1.定义一个Dao接口2.实现Dao完善的持久化层应该达到的目标:1,代码重用性高,可完成所有的数据访问操作。2,如果需要的话,能够支持多种数据库平台。3,具有相对独立性,当持久化层变化时,不会影响上层实现。对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术ORM框架根据配置信息自动完成 对象与关系型数据库之间的转化并在此基础上提供更多的辅助功能框架:软件的半成品,用户再次基础上开发自己的软件,提高开发效率的简化操作常见的ORM框架HibernateIBatisEJBJPATopLinkHibernate:非常优秀、成熟的 ORM 框架。提供强大的对象和关系数据库映射以及查询功能。Hibernate是面向对象的程序设计语言和关系型数据库之间的桥梁,允许开发者采用面向对象的方式来操作关系数据库。Hibernate 的目标是释放开发者通常的与数据库持久化相关的编程任务的 95%。消除那些针对特定数据库厂商的SQL代码。Ibatis:相比 Hibernate 灵活高,运行速度快。开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能。Hibernate的主要功能1.根据配置文件完成ORM转化 自动生成CRUD操作2.提供面向对象的查询语言3.提供缓存功能,提高程序的运行效率4.提供跨数据库的方言使用hibernate所需要的jar1.Hibernate核心jar包hibernate32.hibernate依赖组建,在lib文件夹下3.jdbc驱动开发hibernate步骤第一步 编写映射文件.hbm.xml第二部:编写hibernate配置文件 hibernate.cfg.xml(1)配置数据库连接信息(2)配置映射文件路径信息 (3)缓存信息(4)其他杂项第三部:获取session对象(1)读取配置文件Configuration cfg=new Configuration();cfg.configure(filePath);(2)创建SessionFactorySessionFactory sessionFactory=cfg.biuldSessionFactory();1.重量级对象,创建消耗资源大,耗时长一个数据库创建一个SessionFactory2.这个对象是线程安全的3.缓存根据配置文件生成CRUD的语句4维护二级缓存5.创建session对象 Session session=sessionFactory.openSession();(1)负责执行CRUD操作session.save(Object);(2)轻量级对象 可以频繁的创建与销毁(3)线程不安全 建议一个线程独享一个Session一个事务对应一个Session的使用(4)维护一级缓存Session常用方法1.save(Object)保存方法返回当前插入主键的值2.persist(Object)保存对象无返回值3.get(class,主键) 根据主键读取对象 如果对应的记录不存在则返回空4.load(class,主键)根据主键读取对象 如果对应的记录不存在则抛出异常懒加载:调用load()的时候并不是立即执行sql语句去查询,而是返回一个代理对象。当第一次访问代理对象的任意一个属性值时才发出sql语句访问数据库如果数据库没有对象的记录,则抛出异常。如果加载的类是final修饰,则懒加载机制失效。(final修饰的类是不可以继承的 像String)代理对象:就是我们要查寻对象的一个子类。class A extends B pubic Object getObject() if(b=null) 这时才执行sql访问数据库 5.update(Object) 更新不被Session管理的对象 更新结束后,将对象重新加入到session的管理中,直到commit结束在session的管理中的对象直接掉用set方法就可以更新,不再调用update6.deletet(Object)e删除对象,如果该对对象在session管理内则在session缓存中移除该对象脏检查:当前对象处于Session管理状态下,session将自动检测这些对象是否被修改,如果数据被修改(对象数据与数据库的不一致)被称为脏数据Hibernate会自动生成update语句,将数据同步。第四部:开启事务Transaction tran=Session.beginTransaction();mit();session.getTransaction().commit();第五步 关闭资源Session.close();sessionFactory.close();Hibernate核心接口SessionFactorySessionTransactionCongigurationQuery 负责HQLCriteria 面向对象的查询工具,支持动态查询hibernate映射基础根节点:可以包含多个常用属性name:映射类的类名table:映射表明(缺省的条件下和类名是一致的)dynamic-update:是否动态生成update SQL语句dynamic-insert:是否动态的生成insert SQL语句 建议:当需要频繁插入少数字段时使用 第二天数据库查询出的值一定要与类里的属性类型一致第二章Hibernate的映射基础Hibernate映射类的规范1.需要有无参数的构造器2.需要针对每一个属提供get和set方法3.建议不要加入final修饰4.建议拥有一个和业务无关的主键hibernate主键管理标签负责主键映射标签负责主键生成策略 sequence常用主键生成策略: name 每次需要sequence时都会产生一条select语句找出nextval increment 查询数据库中主键的最大值,在此基础上累加 只在第一次使用时执行查询语句 Select max(id) from table; 开发阶段可以使用,不建议正式运行时的使用 identify mysql中的自增长自动创建表:create每次插入都创建一张表update没有表则创建,有表就插入还有update hilo: 高低值主键生成策略 可以在配置文件中配置高值hi,低值lo和 主键=hi*(max_lo+1)+lo 每一次事务 hi lo max_lo id 0 1 20 0*(20+1)+1=1; . . 0 21 0*(20+1)+21=21; 1 1 1*(20+1)+1=22; topic_hilo next_value 10在一次事务中插入多个数据时,lo每次加一,知道lo=max_lo时hi值加一,lo值返回,等于1在多次事务中,每一次事务hi值都加一lo值等于0 UUID:String类型主键java.util.UUID根据多个系统参数生成一组不可预知不重复的字符串native本地化主键生成策略根据数据库底层动态的选择主键的生成策略例如:Oracle选择sequenceassigned 手动输入主键的常用属性namecolumntypeinsert true or false在默认插入的时候int的默认值为0,等于false的时候没有在插入数句时不会插入默认值为,取值时会报错为空的值,null valueupdate 默认值是trueformula在查询的语句中加入表达式 执行结果作为属性值unique true or false(在自动建表的时候使用)not-nullHibernate数据类型 值类型:Basic Value Type 没有配置文件 不能通过session对其进行CRUD操作 实体类型:Entity Type; 拥有独立的配置文件 拥有独立的id,可以使用session对其进行CRUD操作 第三章 关联关系和继承关系映射一对一关联一对多关联多对多关联一般关联 第三天第三章 关联与继承关系的映射一对多关联关系: inverse属性默认false,表示一对多关联关系的外键值由一的一端维护。即在生成insert的语句的同时在追加updsate语句更新多的一端的外键设置为true。表示关联关系的外键值由多的一端维护。要求,在保存之前,多的一端需持有一的一端的引用cascade:级联操作save-update:当对象执行保存和更新操作的同时,他所关联的对象一并进行保存或更新操作delete:当对象执行删除操作的同时,他所关联的对象一并删除none没有级联操作all save-update + delete一对多懒加载策略:查询一的一端 ;默认情况下,对应的多的一端采用懒加载策略 (1)基于外键一对一的关联关系:要求:外键列增加唯一的约束 不负责外键列维护的类使用one2one标签 并且需要加入property-ref属性fetch检索策略:join 使用join连接语句,将所关联的对象用一条sql语句查询出来select 使用多条select语句查询关联的对象(2)基于主键的一对一关联关系要求 双方主键同步,一方的主键同时作为外键继承关联关系映射:(1)一个类图一张表 通过表中特殊列的值区别改行记录具体属于那一个类 缺点:当一个子类有过多的特有属性,浪费存储空间(2)一个类一张表父类表中存放公有属性,子类表中存放特有的属性、通过主键相同进行关联缺点:查询子类记录时,需要连接父类表,效率比较低(3)每个子类一张表 公有属性重复出现在各个子类表中缺点:面向对象体现不明显,不支持多态查询此句必须配置在id下面第四章 操纵持久化对象对象的三种状态 (1)瞬态(transient) Session缓存中没有管理 数据库中没有对应的记录 (2)持久态(Persistent) session缓存中管理 数据库中有对应记录 (3)游离态(detachad) session缓存中没有管理 数据库中有对应的记录对象状态转换 T-P save() saveOrUpdate(不知道更新还是插入) P-T delete() P-D evict() 将对象从缓存中移除 close() clear() 清空session的一级缓存 D-P update() saveOrUpdate() lock()将对象放入session一级缓存中 -P iterator() get() load() iterator get load方法执行过程: 1.查询session的一级缓存 2.1失败则查询二级缓存 3.2失败则查询数据库 4.3成功 将查询对象放入session一级缓存 第四天Session缓存POJO对象及POJO对象的拷贝Session根据拷贝对象实现脏检查功能Session缓存对象数据库的操作,当清理缓存时先执行save方法生成insert语句。按sava方法调用顺序执行,然后进行脏检查Session.flush()清理缓存默认情况下commit方法会默认调用flush方法Seesion.setFlushMode设置SessionFlush的执行方式在commit与某些查询的时候调用FlushFlushMode.MANUAL手动调用flush方法才有效FlushMode.COMMIT在commit的时候调用flush使用hibernate批量保存数据 执行一定数量的sace方法时,需要调用flush和clear方法,释放内存空间hibernate.jdbc.batch_size 设置hibernate底层批处理数量可以在配置文件中配置并发事务产生的问题脏读:事务之间可以看到未提交的数据不可重复读:同一个事务,针对同一条记录俩次查询的结果不同第一类数据丢失多个事务执行因某一事务的回滚 使其他事务的修改也被撤销第二类数据丢失多个事务修改同一个记录先后提交的事务将前一个事务覆盖通过数据库隔离性解决部分问题 隔离方式 隔离级别Read UnCommited 1 读未提交事务数据(没有提交)Read Commited 2 读提交数据Repertable Read 4 可重复读Serializable 8 串行(不允许事务并发)隔离级别越高,运行效率越低等级 脏读 不可重复读 第一类 第二类 幻影1 N N N N N2 Y N Y N N4 Y Y Y Y N8 Y Y Y Y Yjdbc设置数据库隔离级别 Connection.setTransactionIsolactionhibernate设置数据库隔离级别 connection.isolation隔离级别需要底层数据库的支持 悲观锁与乐观所解决第二类数据丢失悲观锁: 在事务开启。读取某记录的同时上锁,其他刚问该数据的事务必须等待,完全依靠数据库底层的支持 select * from xxx where . for updateHibernate的悲观锁支持Session.load(Class,id,LockMode)session.get(Class,id,LockMode)LockMode.update: 锁定记录,如果其他事务锁定该记录,则等待LockMode.NONE: 使用默认的,没有悲观锁LockMode.UPDATE_NOWAIT: 锁定记录。如果其他的事务访问则抛异常LockMode.read: 锁定记录,其他事务可读不可写。乐观锁:不依赖与数据库底层 1.在POJO类中增加新的属性持有乐观锁 2.在映射文件中加入标签OID(Object id)通过id查询对象导航 通过关联关系查询对象HQL(Hibernate query Language)Query接口 支持一条HQL语句,bingq根据相应的操作生成SQL语句,返回执行结果(1)创建Query对象Query query=session.createQuery(hql);(2)HQL的基本语法SQL: select 列from 表 whereHQL: from 类名 where 属性条件 and 属性条件; (3)返回结果list()list() 将结果作为List返回 调用方法时,立即生成select语句 查询全部符合条件的对象 查询的结果全部放在session一级缓存中维护 list不会是先查询一级二级缓存iterator:返回Iterator 调用方法时,首先查出所有符合条件记录的id值 迭代结果时,根据id值临时查询数据库。 如果一级缓存或二级缓存里这个对象,则不发出sql语句 迭代出的每一个结果,都放入session一级缓存中 iterator方法会利用一级缓存和二级缓存uniqueResult 如果确定查询的结果只有一条记录 则直接返回Object记录 查询的结果放入一级缓存中 查询时不会查询一级和二级缓存,而是直接访问数据库 如果查询多条记录时,会抛出异常 如果没有查询结果,则返回空值占位符与方法链占位符: :param(占位符为冒号加参数)赋值的参数为param和要付给param参数的值: setxxxx(param,result);方法链:多个方法返回值 return this,使用方法可以连续调用;懒加载 与检索策略 默认情况下HQL查询的结果,其关联对象仍然保持懒加载状态 1.lazy属性设置为false N+1查询方式,首先查询出所有一的一端的对象,然后根据其主键值查询对应的多的一端的对象 2.fetch=join把俩条sql语句用join连接起来 当fetch属性为join的时候,懒加载策略失效 3.设置batch-size属性 首先查询出所有一的一端的数据 根据batch-size的值,批量查询其相关联的多的一端的数据 lazy!=false仍然执行懒加载策略 4 join fetch的用法 from Order o join fetch o.orderLine; 使用一条SQL查询所有对象,但是List结果中有大量重复的元素,使用hashSet可以去重 Hibernate initialize方法 将一个代理对象懒加载的值全部从数据库中取出 第五天HQL: 设置fetch=join在Iterator get load方法时,使用一条外连接方式生成一条SQL语句查询相关对象,Query.list join没有效果取出fetch重复元素的方法Query query=session.createQuery(from Order o join fetch o.orderLines).list();LinkedHashSet(list)LinkedHashSet保证元素不重复,并且记录加入到顺序LinkedHashMap;LinkedList;(6) select使用 from classA-select a from classA aselect 后的元素可以是实体类 也可以是属性当select后元素有多个时,调用用list或iterator或uniqueResult返回的结果为Object数组for(Object o :list)for(Object o : list) if(o.getClass().isArray()select new构造方法(属性) 返回结果为对象获得类名class、.getName();Number是Long Integer组函数group by order by多态查询:查询父类, 父类子类全部被查询上来子查询:HQL的子查询只能出现在where子句的后面select c from c where c in (select);HQL的命名查询 在映射文件中写HQL查询语句 命名查询的HQL语法不能有错误hql可以出现在标签的中间也可以出现在的里面在标签中访问:session.getNamedQuery(包名。类名。查询名)在标签中访问:session.getNamedQuery(查询名)select o from Order oQuery query=session.getNamedQuery(domain.Order.selectOrder);HQL风格的更新删除;session.createQuery(delete from Order o where o.id=3).executeUpdate();HQL的更新删除与一级缓存和二级缓存没有关联如果缓存中有对象,删除后可继续访问这个对象使用Query执行本地sqlSQLQuery query=session.createSQLQuery();本地的SQLQuery查询的结果和一级缓存二级缓存没有任何关系,是纯粹的SQL语句query返回一个包含Object数组的集合假分页: List list=session.createQuery(from e).list(); list.subList(0,10); Mysql sel

温馨提示

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

评论

0/150

提交评论