Hibernate 框架简介
一、什么是 Hibernate?
Hibernate 是一个基于元数据的轻量级的 ORM 框架:
1、元数据(Meta Data):data about data(数据的数据),也就是说描述一个对象数据,相当于这个对象的上下文环境。
2、轻量级:占用资源少,没有侵入性。(其实我认为这只是相对而言,如果和 Ibatis 相比,它到成重量级的了)。
3、ORM:(Object Relation Mapping)对象关系数据库的映射这是 Hibernate 框架的重点,也就是说将我们程序中的实体(bean,这里也叫 POJO)和数据库中的表进行映射。java 类型和 sql类型映射,面向对象设计和关系型数据库设计的映射,从而我们只需要将更多的精力放到业务中,而不是 sql 数据库方面。
4、POJO:(Plain Ordinary Java Object),无格式的普通 java 对象,也就是上边说的实体,和数据库做映射的简单类。只是在这里提出了一个新的名词而已。
总而言之,Hibernate 就是将我们的数据库表和程序的 POJO 类进行映射,数据的操作进行了封装,使我们不用把数据库弄得非常精通,我们会面向对象编程就可以了,这样大大提高了我们的编程效率,而且对个人的知识要求也降低了。
二、Hibernate 基础 ----- 数据库操作
在 Hibernate 出现之前,对数据库操作是基于 JDBC,这中间经历了操作 JDBC、封装 JDBC、ORM 三个阶段。
1、操作 JDBC 阶段:
本阶段即在调用 JDBC 连接数据库的包时,需要自己进行编写的进行数据库用户登录验证的那段代码。在这段代码中可以执行 SQL 语句进行数据查询、插入、删除等。
2、封装 JDBC 阶段:
由于仅仅只是操作 JDBC,使得在实现不同逻辑功能时,都要重新编写进行数据库用户登陆验证的那段代码,使得代码重复很严重。为此,引入了 JavaBean的技术,书写一个 DBAccess.java 类进行数据库用户登陆验证和数据库操作,并把其中进行数据库操作部分封装成不同的函数,那么实现后续的逻辑功能时只需调用这些函数即可实现。
3、ORM 阶段:
在对 JDBC 进行封装之后,能够方便的实现数据库的操作。但是,在面向对象的编程开发中,数据库的操作与普通的面向对象的 Java 代码,显然是两种不同的开发思路。于是就产生了 ORM 阶段——使原来直接操作数据库变成了直接操作普通的 Java 类来实现相应的数据库操作。
三、Hibernate 理论基础 是ORM 对象关系映射
ORM 是 Object Relational Mapping 的简称,即对象关系映射。它是一种为了解决面向对象与关系数据库存在的互不匹配技术。简单地说,ORM 是通过使用描述对象和数据库之间映射的元数据,将 Java 程序中的对象持久化到关系数据库中。下面请看一个用户实体(建立数据表时,要描述的现实世界中的实现)、数据表(实体建立完后,抽象分析完成数据表建立)、Java 类(此处就是 ORM要完成的任务而抽象生成的 Java 类):
ORM 实现了数据表到 Java 对象的映射,这正是 ORM 的作用
四、持久层概念
ORM 是通过使用描述对象和数据库之间映射的元数据,将 Java 程序中的对象自动持久化到关系数据库中。由此便引入了以下两个新概念:
(1)持久化:就是对数据和程序状态的保持。大多数情况下特别是企业级应用,数据持久化往往也就意味将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
(2)持久层:把数据库实现当做一个独立逻辑拿出来,即数据库程序是在内存中的,为了使程序运行结束后状态得以保存,就要保存到数据库。持久层是在系统逻辑层面上,专致于实现数据持久化的一个相对独立的领域。持久层的目的是通过持久层的框架将数据库存储服务从服务层中分离出来,而 Hibernate 是目前最流行的持久层框架。
五、具体开发步骤:
1、在Eclipse中配置开发环境:
(1)安装Hibernate插件:
A、下载Hibernate插件,采用link方式安装
(2)添加XML约束文件
2、新建Maven工程,导入Hibernate的核心jar包、支持C3P0数据库连接池的jar包:
c3p0-0.9.5.2.jar
hibernate-c3p0-5.2.17.Final.jar
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.17.Final</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
2、创建Hibernate配置文件:
<session-factory>
<!-- 配置C3P0 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<!--1 配置Oracle数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--2、配置驱动 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!--3、配置连接字符串 -->
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!--4、配置用户名、密码 -->
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">root</property>
<!--5、配置是否是否在控制台打印sql语句-->
<property name="hibernate.show_sql">true</property>
<!--6、是否格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!--7、是否自动生成数据表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置POJO类的映射文件 -->
<mapping resource="com/cn/pojo/Product.hbm.xml"/>
</session-factory>
2、创建持久化类:
public class Product {
private Integer p_id;
private String p_name;
private Double p_price;
private String p_phone;
private String p_address;
......//省去set/get方法
}
3、创建对象-关系映射文件:
<hibernate-mapping>
<class name="com.cn.pojo.Product" table="TB_PRODUCT">
<id name="p_id" type="java.lang.Integer">
<column name="P_ID" />
<generator class="sequence">
<param name="sequence">TB_PRODUCT_SEQ</param>
</generator>
</id>
<property name="p_name" type="java.lang.String">
<column name="P_NAME" />
</property>
<property name="p_price" type="java.lang.Double">
<column name="P_PRICE" />
</property>
<property name="p_phone" type="java.lang.String">
<column name="P_PHONE" />
</property>
<property name="p_address" type="java.lang.String">
<column name="P_ADDRESS" />
</property>
</class>
</hibernate-mapping>
4、在Hibernate配置文件中加入映射文件:
<mapping resource="com/pojo/Product.hbm.xml"/>
5、通过Hibernate API 编写访问数据库的代码:
//1.创建Configuration对象,并调用configure()方法从默认路径加载hibernate.cfg.xml文件
Configuration config = new Configuration().configure();
//2.获取SessionFactory类实例(相当于JDBC中的工厂类)
SessionFactory sessionFactory = config.buildSessionFactory();
//3.获取Session实例(相当于JDBC中的Connection对象)
Session session = sessionFactory.openSession();
//4.开启事务
Transaction ts = session.beginTransaction();
//5.封装数据
Product pro = new Product();
pro.setP_name("钢笔");
pro.setP_price(12.55);
pro.setP_phone("02985368888");
pro.setP_address("咸阳");
//6.执行保存操作
session.save(pro);
//7.提交事务
ts.commit();
session.close();
注意:
1)4.0以前的版本使用,现在已经废弃;
sessionFactory = configuration.buildSessionFactory();
2)创建一个ServiceRegistry对象:hibernate4.x以后新添加的对象,hibernate的任何配置对象和服务都必须在该对象中注册了才能使用
//Hibernate4.2之前版本的写法:
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
//Hibernate4.3之后版本的写法:
ServiceRegistry serviceRegistry =
new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);