第6课 第一个示例HibernateHelloWorld 7
第7课 建立Annotation版本的HellWorld 9
第9课Hibernate的重点学习:Hibernate的对象关系映射. 12
三、 Hibernate.cfg.xml:hbm2ddl.auto 16
六、 ehibernate.cfg.xml : show_sql 17
七、 hibernate.cfg.xml :format_sql 17
十一、 不需要(持久化)psersistence的字段. 18
第12课 使用hibernate工具类将对象模型生成关系模型. 19
一、 Configuration(AnnotationConfiguration) 29
二、 持久化对象(PersistentObject):. 35
(一) 唯一外键关联-单向(unilateralism) 37
(七) 多对一 存储(先存储group(对象持久化状态后,再保存user)):. 50
(七) 导出至数据库(hbmàddl)生成的SQL语句:. 53
八、 关联关系中的CRUD_Cascade_Fetch 63
第19课Hibernate查询(Query Language) 80
四、 工具类Projections提供对查询结果进行统计与分组操作. 91
第22课Query.list与query.iterate(不太重要) 93
第1课 课程内容
1、 HelloWorld
a) Xml
b) Annotction
2、 hibernate原理模拟-什么是O/RMapping以及为什么要有O/RMapping
3、 常风的O/R框架
4、 Hibernate基础配置
5、 Hibernate核心接口介绍
6、 对象的三种状态
7、 ID生成策略
8、 关系映射
9、 Hibernate查询(HQL)
10、 在Struts基础上继续完美BBS2009
11、 性能优化
12、 补充话题
第2课 Hibernate UML图
![](http://hi.csdn.net/attachment/201111/18/0_1321583034NCwN.gif)
第3课 风格
1、 先脉络,后细节
2、 先操作、后原理
3、 重Annotation,轻xml配置文件
a) JPA (可以认为EJB3的一部分)
b) Hibernate– extension
第4课 资源
a) hibernate-distribution-3.3.2.GA-dist.zip
b) hibernate-annotations-3.4.0.GA.zip
c) slf4j-1.5.10.zip (hibernate内部日志用)
2、 hibernatezh_CN文档
3、 hibernateannotateon references
第5课 环境准备
1、 下载hibernate3.3.2
2、 下载hibernate-annotations-3.4.0
3、 注意阅读hibernate compatibility matrix
4、 下载slf4j 1.5.8
第6课 第一个示例Hibernate HelloWorld
1、 建立新的Java项目,名为hibernate_0100_HelloWorld
2、 学习建立User-liberary-hibernate,并加入相应的jar包
a) 项目右键-build path-configure build path-add library
b) 选择User-library ,在其中新建library,命名为hibernate
c) 在该library中加入hibernate所需的jar名
i. Hibernatecore
ii. /lib/required
iii. Slf-nopjar
3、 引入MySQL的JDBC驱动名
4、 在mysql中建立对应的数据库以及表
a) Create databasehibernate;
b) Usehibernate;
c) Createtable Student (id int primary key, name varchar(20),age int);
5、 建立hibernate配置文件hibernate.cfg.xml
a) 从参考文档中copy
b) 修改对应的数据库连接
c) 注释提暂时不需要的内容
6、 建立Student类
7、 建立Student映射文件Student.hbm.xml
a) 参考文档
8、 将映射文件加入到hibernate.cfg.xml
a) 参考文档
9、 写测试类Main,在Main中对Student对象进行直接的存储测试
- public static void main(String[] args) {
- Configuration cfg = null;
- SessionFactory sf = null;
- Session session = null;
- Student s = new Student();
- s.setId(2);
- s.setName("s1");
- s.setAge(1);
- /*
- * org.hibernate.cfg.Configuration类的作用:
- * 读取hibernate配置文件(hibernate.cfg.xml或hiberante.properties)的.
- * new Configuration()默认是读取hibernate.properties
- * 所以使用new Configuration().configure();来读取hibernate.cfg.xml配置文件
- */
- cfg = new Configuration().configure();
- /*
- * 创建SessionFactory
- * 一个数据库对应一个SessionFactory
- * SessionFactory是线线程安全的。
- */
- sf = cfg.buildSessionFactory();
- try {
- //创建session
- //此处的session并不是web中的session
- //session只有在用时,才建立concation,session还管理缓存。
- //session用完后,必须关闭。
- //session是非线程安全,一般是一个请求一个session.
- session = sf.openSession();
- //手动开启事务(可以在hibernate.cfg.xml配置文件中配置自动开启事务)
- session.beginTransaction();
- /*
- * 保存数据,此处的数据是保存对象,这就是hibernate操作对象的好处,
- * 我们不用写那么多的JDBC代码,只要利用session操作对象,至于hibernat如何存在对象,这不需要我们去关心它,
- * 这些都有hibernate来完成。我们只要将对象创建完后,交给hibernate就可以了。
- */
- session.save(s);
- session.getTransaction().commit();
- } catch (HibernateException e) {
- e.printStackTrace();
- //回滚事务
- session.getTransaction().rollback();
- } finally {
- //关闭session
- session.close();
- sf.close();
- }
- }
1、 FAQ:
a) 要调用newConfiguration().configure().buildSessionFactory(),而不是省略
* org.hibernate.cfg.Configuration类的作用:
*读取hibernate配置文件(hibernate.cfg.xml或hiberante.properties)的.
*new Configuration()默认是读取hibernate.properties
* 所以使用new Configuration().configure();来读取hibernate.cfg.xml配置文件
注意:在hibernate里的操作都应该放在事务里
第7课 建立Annotation版本的HellWorld
注意:要求hibernate3.0版本以后支持
1、 创建teacher表,create table teacher(id int primary key,namevarchar(20),title varchar(10));
2、 创建Teacher类
- public class Teacher {
- private int id;
- private String name;
- private String title;
- //设置主键使用@Id
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- }
1、 在hibernate library中加入annotation的jar包
a) Hibernateannotations jar
b) Ejb3persistence jar
c) Hibernatecommon annotations jar
d) 注意文档中没有提到hibernate-common-annotations.jar文件
2、 参考Annotation文档建立对应的注解
- import javax.persistence.Entity;
- import javax.persistence.Id;
- /** @Entity 表示下面的这个Teacher是一个实体类
- * @Id 表示主键Id*/
- @Entity //***
- public class Teacher {
- private int id;
- private String name;
- private String title;
- //设置主键使用@Id
- @Id //***
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }}
1、 在hibernate.cfg.xml中建立映射<maping class=…/>
<mapping class="com.wjt276.hibernate.model.Teacher"/>
注意:<mapping>标签中使用的是class属性,而不是resource属性,并且使用小数点(.)导航,而不是”/”
2、 参考文档进行测试
- public static void main(String[] args) {
- Teacher t = new Teacher();
- t.setId(1);
- t.setName("s1");
- t.setTitle("中级");
- //注此处并不是使用org.hibernate.cfg.Configuration来创建Configuration
- //而使用org.hibernate.cfg.AnnotationConfiguration来创建Configuration,这样就可以使用Annotation功能
- Configuration cfg = new AnnotationConfiguration();
- SessionFactory sf = cfg.configure().buildSessionFactory();
- Session session = sf.openSession();
- session.beginTransaction();
- session.save(t);
- session.getTransaction().commit();
- session.close();
- sf.close();
- }
1、 FAQ:@ 后不给提示
解决方法:windows→Proferences→seach “Content Assist”设置Auto-Activation如下:
![](http://hi.csdn.net/attachment/201111/18/0_1321583267W767.gif)
——————————————————————————————————————————————————————————————————————————————————————————————
第8课 什么是O/R Mapping
一、 定义:
ORM(ObjectRelational Mapping)---是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。简单说:ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据中。本质上就是将数据从一种形式转换到另外一种形式。
![](http://hi.csdn.net/attachment/201111/18/0_1321583530e46g.gif)
分层后,上层不需要知道下层是如何做了。
分层后,不可以循环依赖,一般是单向依赖。
一、 Hibernate的创始人:
Gavin King
二、 Hibernate做什么:
1、 就是将对象模型(实体类)的东西存入关系模型中,
2、 实体中类对应关系型库中的一个表,
3、 实体类中的一个属性会对应关系型数据库表中的一个列
4、 实体类的一个实例会对应关系型数据库表中的一条记录。
%%将对象数据保存到数据库、将数据库数据读入到对象中%%
OOA---面向对象的分析、面向对象的设计
OOD---设计对象化
OOP---面向对象的开发
阻抗不匹配---例JAVA类中有继承关系,但关系型数据库中不存在这个概念这就是阻抗不匹配。Hibernate可以解决这个问题
三、 Hibernate存在的原因:
1、 解决阻抗不匹配的问题;
2、 目前不存在完整的面向对象的数据库(目前都是关系型数据库);
3、 JDBC操作数据库很繁琐
4、 SQL语句编写并不是面向对象
5、 可以在对象和关系表之间建立关联来简化编程
6、 O/RMapping简化编程
7、 O/RMapping跨越数据库平台
8、 hibernate_0200_OR_Mapping_Simulation
四、 Hibernate的优缺点:
1、 不需要编写的SQL语句(不需要编辑JDBC),只需要操作相应的对象就可以了,就可以能够存储、更新、删除、加载对象,可以提高生产效;
2、 因为使用Hibernate只需要操作对象就可以了,所以我们的开发更对象化了;
3、 使用Hibernate,移植性好(只要使用Hibernate标准开发,更换数据库时,只需要配置相应的配置文件就可以了,不需要做其它任务的操作);
4、 Hibernate实现了透明持久化:当保存一个对象时,这个对象不需要继承Hibernate中的任何类、实现任何接口,只是个纯粹的单纯对象—称为POJO对象(最纯粹的对象—这个对象没有继承第三方框架的任何类和实现它的任何接口)
5、 Hibernate是一个没有侵入性的框架,没有侵入性的框架我们一般称为轻量级框架
6、 Hibernate代码测试方便。
五、 Hibernate使用范围:
1. 针对某一个对象,简单的将它加载、编辑、修改,且修改只是对单个对象(而不是批量的进行修改),这种情况比较适用;
2. 对象之间有着很清晰的关系(例:多个用户属于一个组(多对一)、一个组有多个用户(一对多));
3. 聚集性操作:批量性添加、修改时,不适合使用Hibernate(O/映射框架都不适合使用);
4. 要求使用数据库中特定的功能时不适合使用,因为Hibernate不使用SQL语句;
第9课 Hibernate的重点学习:Hibernate的对象关系映射
一、对象---关系映射模式
l 属性映射;
l 类映射:
l 关联映射:
n 一对一;
n 一对多;
n 多对多。
二、常用的O/R映射框架:
1、 Hibernate
2、 ApacheOJB
3、 JDO(是SUN提出的一套标准—Java数据对象)
4、 Toplink(Orocle公司的)
5、 EJB(2.0X中有CMP;3.0X提出了一套“Java持久化API”---JPA)
6、 IBatis(非常的轻量级,对JDBC做了一个非常非常轻量级的包装,严格说不是O/R映射框架,而是基于SQL的映射(提供了一套配置文件,把SQL语句配置到文件中,再配置一个对象进去,只要访问配置文件时,就可得到对象))
7、 JAP(是SUN公司的一套标准)
a) 意愿统一天下
第10课 模拟Hibernate原理(OR模拟)
我们使用一个项目来完成
功能:有一个配置文件,文件中完成表名与类名对象,字段与类属性对应起来。
测试驱动开发
一、 项目名称
hibernate_0200_OR_Mapping_Simulation
二、 原代码
- Test类:
- public static void main(String[] args) throws Exception{
- Student s = new Student();
- s.setId(10);
- s.setName("s1");
- s.setAge(1);
- Session session = new Session();//此Session是我们自己定义的Session
- session.save(s);
- }
- Session类
- import java.lang.reflect.Method;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.util.HashMap;
- import java.util.Map;
- import com.wjt276.hibernate.model.Student;
- public class Session {
- String tableName = "_Student";
- Map<String,String> cfs = new HashMap<String,String>();
- String[] methodNames;//用于存入实体类中的get方法数组
- public Session(){
- cfs.put("_id", "id");
- cfs.put("_name", "name");
- cfs.put("_age", "age");
- methodNames = new String[cfs.size()];
- }
- public void save(Student s) throws Exception{
- String sql = createSQL();//创建SQL串
- Class.forName("com.mysql.jdbc.Driver");
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hibernate","root","root");
- PreparedStatement ps = conn.prepareStatement(sql);
- //
- for(int i = 0; i < methodNames.length; i++){
- Method m = s.getClass().getMethod(methodNames[i]);//返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
- Class r = m.getReturnType();//返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型
- if(r.getName().equals("java.lang.String")) {
- //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
- //个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换
- String returnValue = (String)m.invoke(s);
- ps.setString(i + 1, returnValue);
- }
- if(r.getName().equals("int")) {
- Integer returnValue = (Integer)m.invoke(s);
- ps.setInt(i + 1, returnValue);
- }
- if(r.getName().equals("java.lang.String")) {
- String returnValue = (String)m.invoke(s);
- ps.setString(i + 1, returnValue);
- }
- System.out.println(m.getName() + "|" + r.getName());
- }
- ps.executeUpdate();
- ps.close();
- conn.close();
- }
- private String createSQL() {
- String str1 = "";
- int index = 0;
- for(String s : cfs.keySet()){
- String v = cfs.get(s);//取出实体类成员属性
- v = Character.toUpperCase(v.charAt(0)) + v.substring(1);//将成员属性第一个字符大写
- methodNames[index] = "get" + v;//拼实体类成员属性的getter方法
- str1 += s + ",";//根据表中字段名拼成字段串
- index ++;
- }
- str1 = str1.substring(0,str1.length() -1);
- String str2 = "";
- //根据表中字段数,拼成?串
- for (int i = 0; i < cfs.size(); i++){ str2 += "?,";}
- str2 = str2.substring(0,str2.length() -1);
- String sql = "insert into " + tableName + "(" + str1 + ")" + " values (" + str2 + ")";
- System.out.println(sql);
- return sql;
- }}