hibernate初学者入门培训教程
Hibernate 学习教程大纲
Hibernate 学习教程第1课课程内容. 6第2课Hibernate UML图. 6第3课风格. 7第4课资源. 7第5课环境准备. 7第6课第一个示例HibernateHelloWorld 7第7课建立Annotation版本的HellWorld 9第8课什么是O/RMapping 11一、定义:. 11二、 Hibernate的创始人:. 11三、 Hibernate做什么:. 12四、 Hibernate存在的原因:. 12五、 Hibernate的优缺点:. 12六、 Hibernate使用范围:. 12第9课Hibernate的重点学习:Hibernate的对象关系映射. 12一、对象---关系映射模式. 12二、常用的O/R映射框架:. 13第10课模拟Hibernate原理(OR模拟) 13一、项目名称. 13二、原代码. 13第11课Hibernate基础配置. 15一、提纲. 15二、介绍MYSQL的图形化客户端. 16三、 Hibernate.cfg.xml:hbm2ddl.auto 16四、搭建日志环境并配置显示DDL语句. 16五、搭建Junit环境. 16六、 ehibernate.cfg.xml : show_sql 17七、 hibernate.cfg.xml :format_sql 17八、表名和类名不同,对表名进行配置. 17九、字段名和属性相同. 17十、字段名和属性名不同. 17十一、不需要(持久化)psersistence的字段. 18十二、映射日期与时间类型,指定时间精度. 18十三、映射枚举类型. 19第12课使用hibernate工具类将对象模型生成关系模型. 19第13课ID主键生成策略. 20一、 Xml方式. 20<generator>元素(主键生成策略) 20二、 annotateon方式. 211、AUTO默认. 212、IDENTITY 223、SEQUENCE 224、为Oracle指定定义的Sequence 225、TABLE - 使用表保存id值. 23三、联合主键. 241、xml方式. 242、annotation方式. 27第14课Hibernate核心开发接口(重点) 29一、 Configuration(AnnotationConfiguration) 29二、 SessionFactory 29三、 Session 291、管理一个数据库的任务单元. 292、 save(); 293、 delete() 294、 load() 295、 Get() 306、 load()与get()区别. 317、 update() 318、 saveOrUpdate() 329、 clear() 3210、 flush() 3311、 evict() 33第15课持久化对象的三种状态. 35一、瞬时对象(TransientObject):. 35二、持久化对象(PersistentObject):. 35三、离线对象(DetachedObject):. 35四、三种状态的区分:. 35五、总结:. 35第16课关系映射(重点) 36一、一对一关联映射. 36(一) 唯一外键关联-单向(unilateralism) 37(二) 唯一外键关联-双向. 40(三) 主键关联-单向(不重要) 41(四) 主键关联-双向(不重要) 44(五) 联合主键关联(Annotation方式) 44二、 component(组件)关联映射. 45(一) Component关联映射:. 45(二) User实体类:. 45(三) Contact值对象:. 46(四) xml--User映射文件(组件映射):. 46(五) annotateon注解. 46(六) 导出数据库输出SQL语句:. 47(七) 数据表结构:. 47(八) 组件映射数据保存:. 47三、多对一–单向. 48(一) 对象模型图:. 48(二) 关系模型:. 48(三) 关联映射的本质:. 48(四) 实体类. 48(五) xml方式:映射文件:. 49(六) annotation 50(七) 多对一存储(先存储group(对象持久化状态后,再保存user)):. 50(八) 重要属性-cascade(级联):. 51(九) 多对一加载数据. 51四、一对多- 单向. 51(一) 对象模型:. 52(二) 关系模型:. 52(三) 多对一、一对多的区别:. 52(四) 实体类. 52(五) xml方式:映射. 52(六) annotateon注解. 53(七) 导出至数据库(hbmàddl)生成的SQL语句:. 53(八) 一对多单向存储实例:. 53(九) 生成的SQL语句:. 54(十) 一对多,在一的一端维护关系的缺点:. 54 (十一) 一对多单向数据加载:. 54(十二) 加载生成SQL语句:. 54五、一对多- 双向. 54(一) xml方式:映射. 55(二) annotateon方式注解. 55(三) 数据保存:. 56(四) 关于inverse属性:. 56(五) Inverse和cascade区别:. 56(六) 一对多双向关联映射总结:. 57六、多对多- 单向. 57(一) 实例场景:. 57(二) 对象模型:. 57(三) 关系模型:. 57(四) 实体类. 57(五) xml方式:映射. 58(六) annotation注解方式. 58(七) 生成SQL语句. 59(八) 数据库表及结构:. 59(九) 多对多关联映射单向数据存储:. 59(十) 多对多关联映射单向数据加载:. 61七、多对多- 双向. 61(一) xml方式:映射. 61(二) annotation注解方式. 62八、关联关系中的CRUD_Cascade_Fetch 63九、集合映射. 63十、继承关联映射. 64(一) 继承关联映射的分类:. 64(二) 对象模型:. 64(三) 单表继承SINGLE_TABLE:. 64(四) 具体表继承JOINED:. 70(五) 类表继承TABLE_PER_CLASS 72(六) 三种继承关联映射的区别:. 74第17课hibernate树形结构(重点) 75一、节点实体类:. 75二、 xml方式:映射文件:. 75三、 annotation注解. 76四、测试代码:. 76五、相应的类代码:. 76第18课作业-学生、课程、分数的映射关系. 79一、设计. 79二、代码:. 79三、注意. 80第19课Hibernate查询(Query Language) 80一、 Hibernate可以使用的查询语言. 80二、实例一. 80三、实体一测试代码:. 82四、实例二. 86五、实例二测试代码. 87第20课Query by Criteria(QBC) 89一、实体代码:. 89二、 Restrictions用法. 90三、工具类Order提供设置排序方式. 91四、工具类Projections提供对查询结果进行统计与分组操作. 91五、 QBC分页查询. 92六、 QBC复合查询. 92七、 QBC离线查询. 92第21课Query By Example(QBE) 92一、实例代码. 92第22课Query.list与query.iterate(不太重要) 93一、 query.iterate查询数据. 93二、 query.list()和query.iterate()的区别. 94三、两次query.list() 94第23课性能优化策略. 95第24课hibernate缓存. 95一、 Session级缓存(一级缓存) 95二、二级缓存. 951、二级缓存的配置和使用:. 962、二级缓存的开启:. 963、指定二级缓存产品提供商:. 964、使用二级缓存. 975、应用范围. 996、二级缓存的管理:. 997、二级缓存的交互. 1008、总结. 102三、查询缓存. 102四、缓存算法. 103第25课事务并发处理. 104一、数据库的隔离级别:并发性作用。
《hibernate入门》课件
Hibernate配置
Hibernate通过配置文件指定数据库连接信息、 映射配置和其他配置选项。开发人员可以根 据实际需求进行灵活的配置,以满足不同的 场景和需求。
Hibernate映射
数据库表和Java类的映射
Hibernate提供了灵活的映射机制,将数据库 表和Java类之间的关系进行映射。开发人员 可以通过注解或XML配置文件定义映射规则, 实现数据的转换和传递。
Hibernate事件模型
Hibernate通过事件模型实现了灵活的事件处 理机制。开发人员可以通过注册事件监听器, 对特定的事件进行处理,如对象的加载、保 存、更新和删除等操作。
批量操作和预处理语句
Hibernate提供了批量操作和预处理语句的支 持,用于提高数据库操作的效率。批量操作 可以将多个操作合并成一个批量操作,减少 与数据库的交互次数。预处理语句可以预先 编译好SQL语句,提高查询性能。
《Hibernate入门》PPT课 件
Hibernate入门课程是为了让您了解Hibernate框架的使用和优势。通过本课程, 您将深入了解Hibernate的基本概念、映射、HQL查询、高级特性以及与Spring 的整合等内容。
简介
什么是Hibernate?
Hibernate是一个Java持久化框架,用于将Java对象映射到数据库。它提供了ORM解决方案, 使开发人员能够以面向对象的方式访问数据库。
HQL查询示例
HQL可以进行各种查询操作,包括简单的单 表查询、多表关联查询、聚合查询等。开发 人员可以根据实际需求编写HQL查询语句, 方便地获取所需的数据。
Hibernate高级特性
一级缓存和二级缓存
Hibernate提供了一级缓存和二级缓存机制, 用于提高系统的性能。一级缓存是Session级 别的缓存,用于缓存对象的读取和更新操作。 二级缓存是应用级别的缓存,用于缓存频繁 访问的数据。
Hibernate教程---看这一篇就够了
Hibernate教程---看这⼀篇就够了1 Hibernate概述1.1什么是hibernate框架(重点)1 hibernate框架应⽤在javaee三层结构中 dao层框架2 在dao层⾥⾯做对数据库crud操作,使⽤hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进⾏封装,使⽤hibernate好处,不需要写复杂jdbc代码了,不需要写sql语句实现3 hibernate开源的轻量级的框架4 hibernate版本Hibernate3.xHibernate4.xHibernate5.x(学习)1.2 什么是orm思想(重点)1 hibernate使⽤orm思想对数据库进⾏crud操作2 在web阶段学习 javabean,更正确的叫法实体类3 orm:object relational mapping,对象关系映射⽂字描述:(1)让实体类和数据库表进⾏⼀⼀对应关系让实体类⾸先和数据库表对应让实体类属性和表⾥⾯字段对应(2)不需要直接操作数据库表,⽽操作表对应实体类对象画图描述2 Hibernate⼊门2.1 搭建hibernate环境(重点)第⼀步导⼊hibernate的jar包因为使⽤hibernate时候,有⽇志信息输出,hibernate本⾝没有⽇志输出的jar包,导⼊其他⽇志的jar包不要忘记还有mysql驱动的jar包第⼆步创建实体类package cn.itcast.entity;public class User {/*hibernate要求实体类有⼀个属性唯⼀的*/// private int uid;private String uid;private String username;private String password;private String address;// public int getUid() {// return uid;// }// public void setUid(int uid) {// this.uid = uid;// }public String getUsername() {return username;}public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}(1)使⽤hibernate时候,不需要⾃⼰⼿动创建表,hibernate帮把表创建第三步配置实体类和数据库表⼀⼀对应关系(映射关系)使⽤配置⽂件实现映射关系(1)创建xml格式的配置⽂件- 映射配置⽂件名称和位置没有固定要求- 建议:在实体类所在包⾥⾯创建,实体类名称.hbm.xml(2)配置是是xml格式,在配置⽂件中⾸先引⼊xml约束- 学过约束dtd、schema,在hibernate⾥⾯引⼊的约束dtd约束(3)配置映射关系<hibernate-mapping><!-- 1 配置类和表对应class标签name属性:实体类全路径table属性:数据库表名称--><class name="er" table="t_user"><!-- 2 配置实体类id和表id对应hibernate要求实体类有⼀个属性唯⼀值hibernate要求表有字段作为唯⼀值--><!-- id标签name属性:实体类⾥⾯id属性名称column属性:⽣成的表字段名称--><id name="uid" column="uid"><!-- 设置数据库表id增长策略native:⽣成表id值就是主键⾃动增长--><generator class="native"></generator></id><!-- 配置其他属性和表字段对应name属性:实体类属性名称column属性:⽣成表字段名称--><property name="username" column="username"></property><property name="password" column="password"></property><property name="address" column="address"></property></class></hibernate-mapping>第四步创建hibernate的核⼼配置⽂件(1)核⼼配置⽂件格式xml,但是核⼼配置⽂件名称和位置固定的- 位置:必须src下⾯- 名称:必须hibernate.cfg.xml(2)引⼊dtd约束(3)hibernate操作过程中,只会加载核⼼配置⽂件,其他配置⽂件不会加载第⼀部分:配置数据库信息必须的第⼆部分:配置hibernate信息可选的第三部分:把映射⽂件放到核⼼配置⽂件中<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 第⼀部分:配置数据库信息必须的 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="ername">root</property><property name="hibernate.connection.password">root</property><!-- 第⼆部分:配置hibernate信息可选的--><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- 输出底层sql语句格式 --><property name="hibernate.format_sql">true</property><!-- hibernate帮创建表,需要配置之后update: 如果已经有表,更新,如果没有,创建--><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置数据库⽅⾔在mysql⾥⾯实现分页关键字 limit,只能使⽤mysql⾥⾯在oracle数据库,实现分页rownum让hibernate框架识别不同数据库的⾃⼰特有的语句--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 第三部分:把映射⽂件放到核⼼配置⽂件中必须的--><mapping resource="cn/itcast/entity/User.hbm.xml"/></session-factory></hibernate-configuration>2.2 实现添加操作第⼀步加载hibernate核⼼配置⽂件第⼆步创建SessionFactory对象第三步使⽤SessionFactory创建session对象第四步开启事务第五步写具体逻辑 crud操作第六步提交事务第七步关闭资源@Testpublic void testAdd() {// 第⼀步加载hibernate核⼼配置⽂件// 到src下⾯找到名称是hibernate.cfg.xml//在hibernate⾥⾯封装对象Configuration cfg = new Configuration();cfg.configure();// 第⼆步创建SessionFactory对象//读取hibernate核⼼配置⽂件内容,创建sessionFactory//在过程中,根据映射关系,在配置数据库⾥⾯把表创建SessionFactory sessionFactory = cfg.buildSessionFactory(); // 第三步使⽤SessionFactory创建session对象// 类似于连接Session session = sessionFactory.openSession();// 第四步开启事务Transaction tx = session.beginTransaction();// 第五步写具体逻辑 crud操作//添加功能User user = new User();user.setUsername("⼩王");user.setPassword("250");user.setAddress("⽇本");//调⽤session的⽅法实现添加session.save(user);// 第六步提交事务mit();// 第七步关闭资源session.close();sessionFactory.close();}3 内容⽬录1 实体类编写规则2 hibernate主键⽣成策略(1)native(2)uuid3 实体类操作(1)crud操作(2)实体类对象状态4 hibernate的⼀级缓存5 hibernate的事务操作(1)事务代码规范写法6 hibernate其他的api(查询)(1)Query(2)Criteria(3)SQLQuery3.1 实体类编写规则1 实体类⾥⾯属性私有的2 私有属性使⽤公开的set和get⽅法操作3 要求实体类有属性作为唯⼀值(⼀般使⽤id值)4 实体类属性建议不使⽤基本数据类型,使⽤基本数据类型对应的包装类(1)⼋个基本数据类型对应的包装类- int – Integer- char—Character、- 其他的都是⾸字母⼤写⽐如 double – Double(2)⽐如表⽰学⽣的分数,假如 int score;- ⽐如学⽣得了0分,int score = 0;- 如果表⽰学⽣没有参加考试,int score = 0;不能准确表⽰学⽣是否参加考试l 解决:使⽤包装类可以了, Integer score = 0,表⽰学⽣得了0分,表⽰学⽣没有参加考试,Integer score = null;3.2 Hibernate主键⽣成策略1 hibernate要求实体类⾥⾯有⼀个属性作为唯⼀值,对应表主键,主键可以不同⽣成策略2 hibernate主键⽣成策略有很多的值3 在class属性⾥⾯有很多值(1)native:根据使⽤的数据库帮选择哪个值(2)uuid:之前web阶段写代码⽣成uuid值,hibernate帮我们⽣成uuid值3.3 实体类操作对实体类crud操作添加操作1 调⽤session⾥⾯的save⽅法实现根据id查询1 调⽤session⾥⾯的get⽅法实现修改操作1 ⾸先查询,修改值(1)根据id查询,返回对象删除操作1 调⽤session⾥⾯delete⽅法实现3.4 实体类对象状态(概念)1 实体类状态有三种(1)瞬时态:对象⾥⾯没有id值,对象与session没有关联(2)持久态:对象⾥⾯有id值,对象与session关联(3)托管态:对象有id值,对象与session没有关联2 演⽰操作实体类对象的⽅法(1)saveOrUpdate⽅法:实现添加、实现修改3.5 Hibernate的⼀级缓存什么是缓存1 数据存到数据库⾥⾯,数据库本⾝是⽂件系统,使⽤流⽅式操作⽂件效率不是很⾼。
hibernate菜鸟教程
hibernate菜鸟教程
Hibernate是一个开源的对象关系映射框架,它提供了将Java
对象映射到关系数据库中的功能,并支持数据库的CRUD操作。
通过Hibernate,开发人员可以摆脱传统的JDBC编程,
简化了数据持久化层的开发工作。
Hibernate的主要特点包括:
1. 对象关系映射:Hibernate的核心功能就是将Java对象和关
系数据库之间进行映射,开发人员不需要编写繁琐的SQL语
句来进行数据的持久化操作,只需要操作Java对象即可。
2. 高度可定制化:Hibernate提供了丰富的配置选项,可以根
据项目的需求进行灵活的配置。
开发人员可以使用XML文件
或者注解来定义映射关系。
3. 数据库无关性:Hibernate可以适用于多种关系数据库,开
发人员不需要关心不同数据库的SQL差异,只需要根据Hibernate的API进行开发即可,从而提高了开发的效率。
4. 缓存机制:Hibernate内置了一级缓存和二级缓存的支持,
可以提高数据的访问效率。
一级缓存是在Session级别的缓存,而二级缓存是在SessionFactory级别的缓存。
5. 延迟加载:Hibernate支持延迟加载机制,可以在需要访问
关联对象时再进行查询,提高了性能。
总之,Hibernate是一个非常强大且灵活的对象关系映射框架,能够极大地简化数据持久化层的开发工作,提高开发效率。
它已经成为了Java开发中非常重要的框架之一。
跟我学Hibernate框架技术——Hibernate框架技术基础
目录1.1 跟我学Hibernate框架技术——Hibernate框架技术基础 (2)1.1.1 O/R Mapping工具----Hibernate技术基础 (2)1.1.2 Hibernate和JDBC在性能上的对比 (9)1.1.3 Hibernate系统介绍 (12)1.1.4 Hibernate系统的应用环境 (18)1.1.5 Hibernate为什么如此成功 (20)1.1跟我学Hibernate框架技术——Hibernate框架技术基础1.1.1O/R Mapping工具----Hibernate技术基础1、Hibernate基本概念(1)Hibernate技术本质上是一个提供数据库服务的中间件●Hibernate 是一个面向Java 环境的对象/ 关系数据库映射工具,把Java类对应到数据库的table中,并且采用了xml技术、Java Reflection技术等。
●Hibernate技术本质上也是遵守的ODMG标准的,它的出色源于不断的升级、不断的维护、修改。
以及完善的文档、人气很旺的论坛。
还有很重要的一点就是它的易学易用性。
●Hibernate它不仅提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制。
可以大幅度减少开发时人工使用SQL 和JDBC 处理数据的时间。
(2)Hibernate是一个开放源代码的对象关系映射框架●以OO的方式来操纵数据库它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
●Hibernate可以应用在任何使用JDBC的场合Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
try{stmt=con.createStatement();rs=stmt.executeQuery("select * from student");metaData = rs.getMetaData();for(int column = 0; column < metaData.getColumnCount(); column++){System.out.print(metaData.getColumnName(column+1)+"\t");}while(rs.next()){for (int i = 1; i <= metaData.getColumnCount(); i++){System.out.print(rs.getObject(i)+"\t");}System.out.println("");}stmt.close(); //must closecon.close();}catch(SQLException e){}(3)主要的特点及与Entity EJB Bean的不同点Hibernate是JDBC的轻量级的对象封装它是一个独立的对象持久层框架,和应用服务器以及和EJB没有什么必然的联系。
Hibernate教程_从入门到精通_第二篇(共四篇)
目标: •Hibernate API简介
Hinernate的体系结构(运行时)
SessionFactory:它保存了对当前数据库配置的所有映射关系,它是将某 个数据库的映射关系经过编译之后全部保存在内存中的。 它还是生成 Session的工厂,它在进行实例化的过程中将会用到ConnectionProvider。 一个SessionFactory对应一个数据库连接,当数据库连接改变时需要修改 SessionFactory Sesion: 是进行持久化操作的基础,所有的持久化操作都是在Session的 基础上进行的。它相当与JDBC中的Connection。它是Hibernate的持 久化 管理器的核心,提供了一系列的持久化操作方法。另外,它还持有一个针 对持久化对象的一级缓存,在遍历持久化对象或者根据持久化标识查找对 象的时候会用 到。 Transation:功能上和数据库中的事务完全一样,通过它实现对数据库中 事务的控制。Transation对象是Session对象产生的,所以他的生命周期比 Session短。一个Session的生命周期中可以有多个Transaction对象。 ConnectonProvider:主要作用是生成与数据库建立了连接的JDBC对象 ,同时他还作为数据库连接的缓冲池。通过ConnectionProvider实现了应 用程序和底层的DataSource和DriverManager的隔离。 TransactionFactory:是生成Transaction对象的工厂,通过 TransactionFactory实现了事务的封装,使其具体的实现方法与应用程序无 关。
判断一个实体对象是否处于瞬态: 该实体对象的<id>属性(如果存在)的值为空 如果在映射文件中为<id>设置了unsaved-value属性,并且 实体对象的id属性的值与unsaved-value属性的值相同 如果这个实体对象配置version属性,并且version属性的 空 在映射文件中为version属性设置了unsaved-value属性,并且 version属性的值与unsaved-value属性的值相同。 如果设置了interceptor,并且interceptor的isUnsaved() 方法的返回值为true
hibernate官方新手教程(转载)
hibernate官⽅新⼿教程(转载)hibernate官⽅新⼿教程第⼀部分-第⼀个Hibernate程序⾸先我们将创建⼀个简单的控制台(console-based)Hibernate程序。
我们使⽤内置数据库(in-memory database) (HSQL DB),所以我们不必安装不论什么数据库server。
让我们如果我们希望有⼀个⼩程序能够保存我们希望关注的事件(Event)和这些事件的信息。
(译者注:在本教程的后⾯部分,我们将直接使⽤Event⽽不是它的中⽂翻译“事件”,以免混淆。
)我们做的第⼀件事是建⽴我们的开发⽂件夹,并把全部须要⽤到的Java库⽂件放进去。
从Hibernate站点的下载页⾯下载Hibernate分发版本号。
解压缩包并把/lib以下的全部库⽂件放到我们新的开发⽂件夹以下的/lib⽂件夹以下。
看起来就像这样:.+libantlr.jarcglib-full.jarasm.jarasm-attrs.jarscommons-collections.jarcommons-logging.jarehcache.jarhibernate3.jarjta.jardom4j.jarlog4j.jarThis is the minimum set of required libraries (note that we also copied hibernate3.jar, the main archive) for Hibernate. See the README.txt file in the lib/ directory of the Hibernate distribution for more information about required and optional third-party libraries. (Actually, Log4j is not required but preferred by many developers.) 这个是Hibernate执⾏所须要的最⼩库⽂件集合(注意我们也拷贝了Hibernate3.jar,这个是最重要的库)。
hibernate完美培训教程课件
hibernate完美培训教程
11
Hibernate核心接口
hibernate完美培训教程
12
Configuration
➢ 概述:Configuration 类负责管理Hibernate 的配置信息。它包括
hibernate.connection.url jdbc:mysql://localhost/hibernate
ername root
hibernate.connection.password ➢ 数据库连接池的配置-DBCP(App Server连接池首选)
如果是集合类型的属性,它的类型必须定义为集合的接口。例如: List、Set。
提供一个标识属性(identifier property)。如果没有该属性,一些 功能不起作用,比如:级联更新(Cascaded updates) Session.saveOrUpdate()。
hibernate完美培训教程
目录
一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践
hibernate完美培训教程
1
一、持久化层-O/R Mapping
primary key (name)
1:n/n:1 n:m
外键 关联表
)
继承
单表继承、具体表继承、
类表继承
hibernate完美培训教程
3
对象—关系数据库的不匹配范式
Hibernate教程讲师用-23页精选文档
Hibernate教程前言1、 java对象持久化技术1.1 、hibernate是什么1.2、软件模型1.2.1、概念模型1.2.2、关系数据模型1.2.3、域模型1.2.4、域对象1.2.5、域对象之间的关系1.2.6、域对象的持久化概念提示:1.3、数据库访问模式1.3.1、ORM模式1.3.2、主动域对象模式1.3.3、JDO模式1.3.4、CMP模式一、数据源层-O/R Mapping主要介绍三层架构,如何分层?(逻辑上的分层,二个原则)数据层技术的选择:直接使用1.1、SQL/JDBC:优点:很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。
此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。
缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL方言时。
这项工作通常会消耗很大一部分的开发努力。
此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。
1.2、序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据库中。
持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。
持久化的另一种用法是在机器集群中跨节点复制应用状态。
缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。
这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。
甚至不可能独立地访问或更新一个单独的对象或子图。
非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。
在特定的环境中它被作为桌面应用的适当的持久化机制。
1.3EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。
EJB规范的设计缺陷阻碍了Bean管理的持续性(BMP)实体Bean有效地执行。
hibernate第一课
第一课Hibernate对象关系映射以及开发步骤一、对象关系映射(O/R Mapping)1、定义:将java类的对象和数据库中表的记录进行关联。
2、Java类映射为库中的表3、Java的类的属性映射为表中的列4、Java类之间的关联关系映射为表的关联关系5、java的类对象和数据库中的记录保持同步状态。
受持久化框架的影响,有事务处理的能力。
二、Hibernate的构成1、实体类(POJO)2、实体映射文件(描述类的属性和表的映射关系)命名规则为:类名.hbm.xml3、hibernate的配置文件(Hibernate.cfg.xml)(1)、描述数据库的访问方式和操作的相关属性。
(2)、包含数据库的驱动和所使用的数据库的类型(mssql oracle、mysql),还包含相关的实体映射文件。
(3)、包含数据库访问的用户名和密码(4)、hibernate运行时首先加载Hibernate.cfg.xml文件,建立与数据库之间的关系三、Hibernate的重要接口(1)Configuration—用于加载hibernate的配置文件,用于与数据库之间建立联系。
使用它可以创建数据库会话工厂(SessionFactory)(2)SessionFactory创建数据库之间的会话对象Session,以单态方式出现(3)Session数据库会话接口,主要用于操作实体对象(4)、事务由Session对象获取,用于保持操作的事务特性(ACID )(5)、查询接口(Query)主要用于对数据库中的数据通过实体对象进行查询。
由Session对象创建.四、Hibernate的操作步骤库和表3、生成实体类和Hibernate映射文件4、在测试类中创建Session对象5、使用Session对象创建事务对象6、给实体对象赋值7、使用session对象操作实体对象8、提交事务9、关闭Session对象五、生成的Admin.hbm.xml文件六、生成的HibernateSessionFactory.java类。
(全)最经典的hibernate教程从入门到精通PPT资料
小结
• 是一个主流的持久化框架 复杂的查询操作稍后介绍
<mapping resource="com/aptech/jb/entity/User.
• 在JDBC基础上进行分装 将程序数据在瞬时状态和持久状态之间转换的机制
<mapping resource="com/aptech/jb/entity/User. 通过映射文件保存映射信息
properties:Hibernate属性文件/Hibernate配置文件
用JDBC 持久数据
DB
Hiberante应用程序的结构
(1〕Application:运用 (2〕Persistent Object:持久化对象 〔3〕hibernate.properties:Hibernate 属性文件/Hibernate配置文件 (4〕XML Mapping:Hibernate映射文 件 (5〕Database:数据库
• 只需要少量代码就可以完成持久化工作 User user = (User)session.
datasource">java:/comp/env/pubs</property> <property name="session_factory_name">hibernate</property>
配置Hibernate关联自动加载区县对应的街道 (4〕XML Mapping:Hibernate映射文件
JDBC与Hibernate的比较
相同点: 两者都是JAVA的数据库操作中间件。 两者对于数据库进行直接操作的对象都不是
线程安全的,都需要及时关闭。 两者都可以对数据库的更新操作进行显式的
第二讲 Hibernate入门
基本概念
• 对象持久化:持久化的目的就是将内存中 的数据存储在关系数据库或磁盘文件和 XML数据文件中。 • O种 主要的持久化技术,需要同时使用面向对 象和关系数据库进行开发。
第一个Hibernate程序-HelloWorld
• 1、建立新的Java项目,名为Hibernate_01_HelloWorld • 2、学习建立User Library——Hibernate3.6,并加入相应 的jar包 • 1)项目右键Build path-》configure build path-》add library • 2)选择user library命名Hibernate3.6 • 3)在该library中加入所需的jar包(hibernate3、 required、jpa、slf4j-nop)
第二讲 Hibernate入门
• 环境准备 • Hibernate3.6.7 • slf4j -1.6 • Apache-log4j-1.2.16 • Junit4.9 • mysql-connector-java-5.1.15 • 学习资源 • • Hibernate zh_CN文档
第一个Hibernate程序-HelloWorld
• 3、引入mysql的jdbc包 • 4、在mysql中建立相对应的数据库和表 • 1)create database hibernate • 2)use hibernate • 3)create table student(id int primary key,name varchar(20),age int)
第一个Hibernate程序-HelloWorld
• 5、建立Hibernate配置文件hibernate.cfg.xml • 1)从参考手册中拷贝 • 2)修改对应的数据库连接 • 3)注释掉暂时用不上的内容 • 6、建立Student类 • 7、建立Student映射文件Student.hbm.xml • 1)参考手册
韩顺平 hibernate第2讲
hibernate 从入门到精通
主讲: 韩顺平
■
Criteria接口
Criteria接口也可用于面向对象方式的查询,关于它的具体用法我们 这里先不做介绍,简单看几个案例. 最简单案例:返回50条记录 Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list(); 限制结果集内容 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();
hibernate 从入门到精通
主讲: 韩顺平
hibernate 从入门到精通
主讲: 韩顺平
■ConfiguraFra bibliotekon类①负责管理hibernate的配置信息 ②读取hibernate.cfg.xml ③加载hibernate.cfg.xml配置文件中 配置的驱动,url,用户名,密码,连接池. ④管理 *.hbm.xml对象关系文件.
hibernate 从入门到精通
主讲: 韩顺平
■
对象关系映射文件(*.hbm.xml) ①该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件. ②一般放在其映射的类同一个目录下,但不是必须的。 ③命名方式一般是 类名.hbm.xml,但不是必须的。 ④示意图:
*.hbm.xml 表
某个类
hibernate 从入门到精通
Hibernate学习过程
Hibernate学习过程第一章hibernate 入门一、jbosstools的安装hibernate是jboss公司的一个项目,所用STS工具并不支持hibernate配置文件的开发,jboss 集成开发包有大量的工具类。
1、导入工具过程:点击Help Install New Software接下来过程如图所示:Jboss工具安装成功如下2、创建一个java项目导入相应的包(hibernate_01中)。
在java项目中与web项目不同导入的jar包通常需要执行这一操作(Build Path->Add Build Path)二、创建hibernate配置文件在src目录下创建相应的hibernate.cfg.xml文件在这个文件中加上相应的数据库配置信息创建实体类User.java三、在实体类的包中创建相应的Use.hbm.xml文件,用来指定实体类和数据库映射关系与User.java 同一文件路径将配置文件User.hbm.xml添加到hibernate的cfg的配置文件中常用对象(Configuration , ServiceRegistry, SessionFactory)六、创建SessionFactory,SessionFactory是线程安全,所以整个SessionFactory应该基于单例的模式来创建(TestFirst.java中)Configuration cfg = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);七、创建sessionSession session = factory.openSession();八、通过session来进行各种操作以下代码完成了对象的添加操作try {session = factory.openSession();//开启事务session.beginTransaction();User u = new User();u.setNickname("张三");u.setPassword("123");u.setUsername("zhangsan");u.setBorn(new Date());session.save(u);//提交事务session.getTransaction().commit();} catch (HibernateException e) {e.printStackTrace();if(session!=null) session.getTransaction().rollback();} finally {if(session!=null) session.close();}体验hibernate的魅力吧请仔细研究关于User对象的增删改查(CRUD)在hibernate_01项目包中。
Hibernate-01-入门
第一章
Hibernate入门
易可导航
预习检查
为什么需要Hibernate? Hibernate是什么? 使用Hibernate的步骤是?
易可导航
本章任务
了解Hibernate基本原理 学会编写实体映射文件 学会使用Hibernate完成数据增、删、改操作 学会在项目中使用Hibernate 一级缓存与二级缓存
i"3mh.t0pt.lpde:tm/d/"e>hnitbserjanvatae.i.os.oSuercrieafloizrageb.lnee{t/hib实er体na类te到-m表ap的pin映g-射 private I<nhtiebgeernrautied-;mapping>
private S<scctrlhiaensmgsa=un"nadmbaeom=""ec;er" table="tbl_user"
}
<property name="upass" type="ng.String">
<column name="upass" length="30" />
</property>
</class> </hibernate-mapping>
属性到字段的映射
易可导航
如何使用Hibernate?
代码精简易读
封装了JDBC操作, 以面向对象的方式
操作数据
开发工作量小,可 以集中精力处理业
务逻辑
Hibernate就是用来 解决这些问题的!
易可导航
1 Hibernate入门
加载并存储对象
public class EventManager { public static void main(String[] args) { EventManager mgr = new EventManager(); mgr.createAndStoreEvent("My Event", new Date()); HibernateUtil.getSessionFactory().close(); } private void createAndStoreEvent(String title, Date theDate) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); session.getTransaction().commit(); } }
– column属性则告诉Hibernate, 我们使用EVENTS表的 哪个字段作为主键。嵌套的generator元素指定了标识 符生成策略,在这里我们指定native,它根据已配置的 数据库(方言)自动选择最佳的标识符生成策略。
映射文件
• 和id元素一样,property元素的name属性告诉 Hibernate使用哪个getter和setter方法。在此例中, Hibernate会寻找getDate()/setDate(), 以及 getTitle()/setTitle()。 • 为什么date属性的映射含有column attribute,而 title却没有?当没有设定column attribute 的时候, Hibernate缺省地使用JavaBean的属性名作为字 段名。对于title,这样工作得很好。然而,date在 多数的数据库里,是一个保留关键字,所以我们 最好把它映射成一个不同的名字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hibernate培训教程作者:钱安川(Moxie)学员要求:熟悉Java、SQL、JDBC,掌握面向对象的开发方法,并有实际的项目开发经验。
培训目标:让学员了解O/R Mapping原理,掌握Hibernate开发的相关知识,并能使用Hibernate 进行实际项目开发。
(让学员理解典型的三次架构,如何用O/R Mapping框架来实现我们的数据层。
这里主要介绍现在非常流程的Hibernate框架,希望通过培训之后,(学员了解Hibernate的架构,掌握Hibernate相关的概念;并教学员如何做对象和关系的映射,如何在应用中使用Hibernate)后面还有一个“Hibernate高级进阶”《两个生活中的案例:一、招聘时对Hibernate的提问;二、一个使用Hibernate的失败项目》数据源层-O/R Mapping主要介绍三层架构,如何分层?(逻辑上的分层,二个原则)数据层技术的选择:直接使用SQL/JDBC:优点:很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。
此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。
缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL 方言时。
这项工作通常会消耗很大一部分的开发努力。
此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。
序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据库中。
持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。
持久化的另一种用法是在机器集群中跨节点复制应用状态。
缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。
这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。
甚至不可能独立地访问或更新一个单独的对象或子图。
非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。
在特定的环境中它被作为桌面应用的适当的持久化机制。
EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。
EJB规范的设计缺陷阻碍了Bean管理的持续性(BMP)实体Bean有效地执行。
在EJB1.1许多明显的缺陷被纠正之后,一个边缘的稍微可接受的解决方案是容器管理的持续性(CMP)。
然而,CMP并不能表示一种对象-关系不匹配的解决方案。
CMP缺点:☐CMP实体Bean的粒度既太粗又太细:CMP Bean与关系模型中的表是按照一对一的方式定义的。
这样,它们的粒度过粗,不能够完全利用Java丰富的类型。
☐虽然EJB可以利用继承实现,但实体Bean并不支持多态的关联和查询☐不管EJB规范所宣称的目标,实体Bean实际上是不可移植的。
CMP引擎的性能因厂商而异,并且映射元数据也是高度特定于厂商的。
☐实体Bean不可序列化。
我们发现当我们需要将数据传输到远程客户层时,我们必须定义额外的数据传输对象(DTO,也被称作值对象)☐实体Bean必须依赖于EJB容器测试困难。
JDO、Object-oriented database systems大多数面向对象的数据库系统对ODMG标准都提供了许多程度的支持,但据我们所知,还没有完全的实现。
此外,在规范发布以后的很多年,甚至到了3.0版,还是感觉不太成熟,并且缺乏很多有用的特征,特别是基于Java环境的。
ODMG也不再活跃。
最近,Java数据对象(JDO)规范(发表于2002年4月)揭开了新的可能性。
JDO由面向对象数据库团体的成员驱动,除了对现有的ODMG的支持之外,面向对象的数据库产品现在还经常将其作为主要的API采用。
JDO 的优点在于它很简单。
开发人员使用Java 语言持久存储对象实例并从存储器检索实例。
处理逻辑、同步和故障转移等均被透明地处理。
开发人员无需使用SQL 或Java 语言提供的不便的序列化机制,只使用POJO(无格式普通Java 对象)即可,利用JDO 接口将对象引用传递到存储器中并从存储器检索对象引用。
O/R Mapping什么是O/R Mapping?它有什么优点?简单地说,对象-关系映射就是Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。
本质上,ORM的工作是将数据从一种表示(双向)转换为另一种。
提高生产率(Productivity)与持久性有关的代码可能是Java应用中最乏味的代码。
Hibernate去掉了很多让人心烦的工作(多于你的期望),让你可以集中更多的精力到业务问题上。
不论你喜欢哪种应用开发策略——自顶向下,从域模型开始;或者自底向上,从一个现有的数据库模式开始——使用Hibernate和适当的工具将会减少大量的开发时间。
可维护性(Maintainability)减少了代码,重构更方便,提高了可维护性。
ORM是对象和关系数据库之间的缓冲区,用来很好的将他们隔离。
更好性能(Performance)ORM软件的实现人员可能有比你更多的时间来研究性能优化问题。
你知道吗,例如,缓存PreparedStatement的实例对DB2的JDBC驱动导致了一个明显的性能增长但却破坏了InterBase的JDBC驱动?你了解吗,对某些数据库只更新一个表中被改变的字段可能会非常快但潜在地对其它的却很慢?在你手工编写的解决方案中,对这些不同策略之间的冲突进行试验是多么不容易呀?厂商独立性(Vendor independence)ORM抽象了你的应用使用下层SQL数据库和SQL方言的方式。
如果工具支持许多不同的数据库(dialect),那么这会给你的应用带来一定程度的可移植性。
你不必期望可以达到“一次编写,到处运行”,因为数据库的性能不同并且达到完全的可移植性需要牺牲更强大的平台的更多的力气。
然而,使用ORM开发跨平台的应用通常更容易。
即使你不需要跨平台操作,ORM依然可以帮你减小被厂商锁定的风险。
另外,数据库独立性对这种开发情景也有帮助:开发者使用一个轻量级的本地数据库进行开发但实际产品需要配置在一台不同的数据库上。
如何做对象-关系数据库映射?(最后引入Hibernate)public class User {private Long id;private String name;private List address;………}create table tbl_user (id bigint not null auto_increment,name varchar(255),primary key (id))1、Java基本类型-表的2、Java类的映射3、关联的映射:例如一个User有多个Address,User和Address管理,User删除时,相应的Address也应该删除。
对象-关系的不匹配范式(paradigm)1、粒度(granularity)的问题。
增加一种新的数据类型,将Java地址对象在我们的数据库中保存为单独的一列,听起来好像是最好的方法。
毕竟,Java中的一个新的地址类与SQL数据类型中的一个新的地址类型可以保证互用性。
然而,如果你检查现在的数据库管理系统对用户定义列类型(UDT)的支持,你将会发现各种各样的问题。
2、子类型(subtypes)的问题。
子类型不匹配是指Java模型中的继承结构必须被持续化到SQL数据库中,而SQL数据库并没有提供一个支持继承的策略。
如何解决多态?3、同一性(identity)的问题Java对象定义了两种不同的相等性的概念:■对象同一性(粗略的等同于内存位置的相等,使用a==b检查)■通过equals()方法的实现来决定的相等性(也被称作值相等)另一方面,数据库行的同一性使用主键值表示。
主键既不必然地等同于“equals()”也不等同于“==”。
它通常是指几个对象(不相同的)同时表示了数据库中相同的行。
而且,为一个持续类正确地实现equals()方法包含许多微妙的难点。
4、与关联(associations)有关的问题面向对象的语言使用对象引用和对象引用的集合表示关联。
在关系世界里,关联被表示为外键列,外键是几个表的键值的拷贝。
这两种表示之间有些微妙的不同。
5、对象结构导航的问题在Java中访问对象的方式与在关系数据库中有根本的不同。
在Java中,访问用户的账单信息时,你调用aUser.getBillingDetails().getAccountNumber()。
这是最自然的面向对象数据的访问方式,通常被形容为遍历对象图。
根据实例间的关联,你从一个对象导航到另一个对象。
不幸地是,这不是从SQL数据库中取出数据的有效方式。
为了提高数据访问代码的性能,唯一重要的事是最小化数据库请求的次数。
最明显的方式是最小化SQL查询的数量(其它方式包括使用存储过程或者JDBC批处理API)。
使用SQL有效地访问关系数据通常需要在有关的表之间使用连接。
在连接中包含的表的数量决定了你可以导航的对象图的深度。
性能:N+1的问题范式不匹配的代价:1、花费很多时间和精力来手工解决对象和关系的不匹配。
2、为了解决不匹配,甚至要扭曲对象模型直到它与下层的关系技术匹配为止4、JDBC API本身的问题。
JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。
至少在三个时刻(Insert,Update,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。
主流持久层框架纵览目前众多厂商和开源社区都提供了持久层框架实现,常见的有:Apache OJB(/ojb/ )Cayenne(/cayenne/ )Jaxor( )Hibernate()iBATIS( )jRelationalFramework()mirage(/en/oss/mirage/toon)SMYLE(http://www.drjava.de/smyle/)TopLink(/products/ias/toplink/index.html )(其中TopLink 是Oracle 的商业产品。
其他均为开源项目)Apache OJB 的优势在于对各种标准的全面支持(不过事实上,我们的系统研发中并不需要同时支持这么多标准,追求多种标准的并行支持本身也成为Apache OJB 项目发展的沉重包袱),且其从属于Apache 基金组织,有着可靠的质量保证和稳定的发展平台。
Hibernate 在2003 年末被JBoss 组织收纳,成为从属于JBoss 组织的子项目之一,从而赢得了良好的发展前景(同时荣获Jolt 2004 大奖)。