1. Hibernate是什么?
hibernate是 轻量级的 ORM 框架。
ORM全称object/relationmapping [对象/关系映射]。
Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供数据查询和获取数据的方法。能够大幅度降低开发时人工使用SQL和JDBC处理数据的时间。
Hibernate的目标是对于开发人员通常的数据持久化相关的编程任务,解放当中的95%。对于以数据为中心的程序来说,它们往往仅仅在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方式;对于那些在基于Java的中间层应用中。它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最实用的。
Hibernate能够帮助你消除或者包装那些针对特定厂商的SQL代码,而且帮你把结果集从表格式的表示形式转换到一系列的对象去。
1.1. orm是什么?
对象关系映射(ObjectRelation Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说。ORM是通过使用描写叙述对象和数据库之间映射的元数据。将java程序中的对象自己主动持久化到关系数据库中。本质上就是将数据从一种形式转换到第二种形式。使用orm技术(hibernate是当中最为流行的)能够在java程序以类和对象的方式去操控数据库表和记录。
1.2. pojo是什么?
在使用hibernate时。要求和数据库的某张表相互映射的那个java类,是一个POJO类,一般放在com.xxx.domain包下,POJO类翻译过来就是:简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来。
一个POJO类应当具有:
1) 有一个主键属性,用于唯一标识该对象。(这就是为什么hibernate设计者建议要映射的表须要一个主键)
2) 有其他的属性
3) 有对各个属性操作的get/set方法
4) 属性通常是private修饰
5) 一定有一个无參的构造函数(用于hibernate框架反射用.)
在POJO有一些private的參数作为对象的属性。然后针对每一个參数定义了get和set方法作为訪问的接口。比如:
public class User { private long id; private String name; public void setId(long id) { this.id = id; } public void setName(String name) { this.name=name; } public long getId() { return id; } public String getName() { return name; } } |
POJO对象有时也被称为Data对象,大量应用于表现现实中的对象。
2. 为什么要用Hibernate?
1) 引入hibernate能够使工作人员角色细化,让程序猿更关心业务流程。
让数据库人员关注数据库相关的各种操作。
2) 分层更清晰,耦合性更小。
3) 通用性强:能够更轻松的从一个数据库平台转移到别的平台。
4) 对象化:把关系数据库变成了Java的对象。更加方便操作。
5) 性能保证:hibernate可能按不同的数据库,处理不同的操作是用最优化的SQL语句,不用我们去想,对于分等算法。在hibernate中会显得更简单,可靠。
6) 添加了程序的鲁棒性!
3. hibernate体系结构
一个很简要的hibernate体系结构的概要图:
从这个图能够看出hibernate使用配置信息和数据向应用程序提供持久化服务。
“Hibernate执行时体系结构最小”的体系结构方案。要求应用程序提供自己的 JDBC 连接并管理自己的事务。这样的方案使用了Hibernate API 的最小子集。
“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate来处理这些细节。
Ø SessionFactory (org.hibernate.SessionFactory)针对单个数据库映射关系经过编译后的内存镜像。是线程安全的(不可变)。它是生成Session的工厂,本身要用到ConnectionProvider。
Ø Session (org.hibernate.Session)表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期非常短。隐藏了JDBC连接,也是Transaction的工厂。
Ø Transaction (org.hibernate.Transaction)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期非常短。它通过抽象将应用从底层详细的JDBC、JTA以及CORBA事务隔离开。
Ø ConnectionProvider (org.hibernate.connection.ConnectionProvider)生成JDBC连接的工厂(有连接池的作用)。
它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发人员扩展/实现用,并不暴露给应用程序使用。
Ø TransactionFactory (org.hibernate.TransactionFactory)生成Transaction对象实例的工厂。
仅供开发人员扩展/实现用。并不暴露给应用程序使用。
4. Hibernate入门案例
开发环境:
1) eclipse Luna Release (4.4.0)
2) mysql 5.0
3) hibernate 4.3
开发过程例如以下:
1) 使用eclipse新建java webproject。命名为hello_hbm
2) 引入hibernate所必须的jar(从官网下载后,取其文件夹下/lib/required下全部jar文件)
3) 引入mysql驱动jar包
4) 在src下新建hibernate配置文件:hibernate.cfg.xml,代码例如以下:
<? xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <!-- 驱动名 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 指定jdbc连接池的个数 --> <property name="connection.pool_size">1</property> <!-- 指定用什么数据库 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 是否显示sql语句 --> <property name="show_sql">true</property> <!-- 自己主动创建表 --> <property name="hibernate.hbm2ddl.auto">create</property> <mapping resource="com/morris/model/UserModel.hbm.xml" /> </session-factory> </hibernate-configuration> |
5) 在com.morris.model下新建pojo类UserModel,该类有三个属性。其它方法为geter,seter两个构造函数,还有重写了父类object的equals和hashCode方法:
package com.morris.model; public class UserModel { private String userId; private String userName; private Integer age; public UserModel() { super(); // TODO Auto-generated constructor stub } public UserModel(String userId, String userName, Integer age) { super(); this.userId = userId; this.userName = userName; this.age = age; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((age == null) ? 0 : age.hashCode()); result = prime * result + ((userId == null) ? 0 : userId.hashCode()); result = prime * result + ((userName == null) ? 0 : userName.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; UserModel other = (UserModel) obj; if (age == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (userId == null) { if (other.userId != null) return false; } else if (!userId.equals(other.userId)) return false; if (userName == null) { if (other.userName != null) return false; } else if (!userName.equals(other.userName)) return false; return true; } @Override public String toString() { return "UserModel [userId=" + userId + ", userName=" + userName + ", age=" + age + "]"; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } |
6) 在com.morris.model下新建配置文件UserModel.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.morris.model"> <!-- class name=类名 table=数据库的表名 id name=类的属性 column=表的主键列名 generator=自己指定 --> <class name="UserModel" table="user"> <id name="userId" column="userId"> <generator class="assigned" /> </id> <property name="userName" column="userName" /> <property name="age" column="age" /> </class> </hibernate-mapping> |
7) 编写測试类Test.java
package com.morris.model; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class Test { public static void main(String[] args) { // 读取配置文件,得到Configuration对象 Configuration config = new Configuration().configure(); // 获得会话工厂 SessionFactory sf = config.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = null; try { // 開始事务 tx = session.beginTransaction(); UserModel userModel = new UserModel("002", "morris", 22); // 保存对象 session.save(userModel); // 提交事务 tx.commit(); } catch (Exception e) { e.printStackTrace(); if (tx != null) { tx.rollback(); } } finally { session.close(); } } } |
执行结果例如以下图所看到的。
后台打印sql:
Hibernate:create table user (userId varchar(255) not null, userName varchar(255), ageinteger, primary key (userId))
Hibernate:insert into user (userName, age, userId) values (?, ?, ?
)