1.Hibernate概述:
Hibernate 是一个高性能的对象关系型持久化存储和查询的服务,不仅关注于从 Java 类到数据库表的映射,也有 Java 数据类型到 SQL 数据类型的映射,另外也提供了数据查询和检索服务,是传统 Java 对象和数据库服务器之间的桥梁,简单理解是对JDBC的进一步封装。
2. Hibernate中持久化的概念:
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。持久化是将程序数据在持久状态和瞬时状态间转换的机制。
Hibernate的完整概念是提取 Java 类属性中的值,并且将它们保存到数据库表单中。映射文件能够帮助 Hibernate 确定如何从该类中提取值,并将它们映射在表格和相关域中。
在 Hibernate 中,其对象或实例将会被存储在数据库表单中的 Java 类被称为持久化类。若该类遵循一些简单的规则或者被大家所熟知的 Plain Old Java Object (POJO) 编程模型,Hibernate 将会处于其最佳运行状态。以下所列就是持久化类的主要规则:
@所有将被持久化的 Java 类都需要一个默认的构造函数。
@为了使对象能够在 Hibernate 和数据库中容易识别,所有类都需要包含一个 ID。此属性映射到数据库表的主键列。
@所有将被持久化的属性都应该声明为 private,并具有由 JavaBean 风格定义的 getXXX 和 setXXX 方法。
@Hibernate 的一个重要特征为代理,它取决于该持久化类是处于非 final 的,还是处于一个所有方法都声明为 public 的接口。
3. Hibernate简介:
从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系,下面将逐个介绍:
Configuration :配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造,它负责配置并启动Hibernate,代表了 Hibernate 所需一个配置或属性文件,通常包含hibernate.properties 和 hibernate.cfg.xml。
SessionFactory :负责初始化Hibernate,配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用,是一个重量级对象。
Session:负责持久化对象的增、删、改、查操作,一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库交互。持久对象通过 Session 对象保存和检索。Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。
Transaction:负责事务,一个事务代表了与数据库工作的一个单元并且大部分关系型数据库持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。
Query:Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。
Criteria:Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。
4. Hibernate映射文件:
一个对象/关系型映射一般定义在 XML 文件中,如下所示:
你需要以格式 <classname>.hbm.xml保存映射文件。我们保存映射文件在 Employee.hbm.xml 中
#映射文件是一个以 <hibernate-mapping> 为根元素的 XML 文件,里面包含所有<class>标签。
#<class> 标签是用来定义从一个 Java 类到数据库表的特定映射。Java 的类名使用 name 属性来表示,数据库表明用 table 属性来表示。
#<meta> 标签是一个可选元素,可以被用来修饰类。
#<id> 标签将类中独一无二的 ID 属性与数据库表中的主键关联起来。id 元素中的 name 属性引用类的性质,column 属性引用数据库表的列。type 属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。
#在 id 元素中的 <generator> 标签用来自动生成主键值。设置 generator 标签中的 class 属性可以设置 native 使 Hibernate 可以使用 identity, sequence 或 hilo 算法根据底层数据库的情况来创建主键。
#<property> 标签用来将 Java 类的属性与数据库表的列匹配。标签中 name 属性引用的是类的性质,column 属性引用的是数据库表的列。type 属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。
4. Hibernate的查询语言:
1)增加:
package myhb; //映射文件中not-null属性要改为false
import org.hibernate.*;
public class Hello {
public static void main(String[] args) {
Customer c=new Customer(); // Customer是自建的表单
c.setUsername("zhang"); //要增加的Username
c.setPassword("aaabbb"); //要增加的Password
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
session.save(c);
ts.commit();
}catch (Exception e) {
ts.rollback();
System.out.println(e);
} finally {
HibernateSessionFactory.closeSession();
}
}
}
2)删除:
package myhb;
import org.hibernate.*;
publicclass Hello {
publicstaticvoid main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
Customer c=(Customer)session.get(Customer.class, 3); //获取第三行
session.delete(c); //删除
ts.commit();
}catch (Exception e) {
ts.rollback();
System.out.println(e);
} finally {
HibernateSessionFactory.closeSession();
}
}
}
3)改:
package myhb;
import org.hibernate.*;
public class Hello {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
Customer c=(Customer)session.get(Customer.class, 2); //获取第二行
ccc
ts.commit();
}catch (Exception e) {
ts.rollback();
System.out.println(e);
} finally {
HibernateSessionFactory.closeSession();
}
}
}
4)查询:
package myhb;
import org.hibernate.*;
public class Hello {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
Customer c=(Customer)session.get(Customer.class, 1); //获取第一样
System.out.println(c.getUsername()+" "+c.getPassword()); //打印第一行的Username和PassWord
ts.commit();
}catch (Exception e) {
ts.rollback();
System.out.println(e);
} finally {
HibernateSessionFactory.closeSession();
}
}
}