对象的持久化
- 开始 hibernate 的学习之前,我们先来理解一下什么是对象的持久化
- 从狭义上来说,对象的持久化就是把数据永久的保存到数据库
- 从广义来说,持久化其实就是包括了关于数据库的各种操作
- 保存:将数据永久的保存到数据库
- 更新:更新数据库记录的状态
- 删除:从数据库删除一条记录
- 查询:根据特定的条件,把符合查询条件的一个或者多个对象对应的记录从数据库中加载到内存中
- 加载:根据特定的 OID 把一个对象从数据库加载到内存中
- 关于 OID :为了可以在数据库中找到一条确定的数据,需要为每一个对象分配一个唯一的标识号,在关系型数据库中称之为主键,而在对象术语中,叫做对象标识符(Object identifier-OID)
ORM
- ORM(Object/Relarion Mapping):对象/关系映射
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 表的行(记录) |
属性 | 表的列(字段) |
- ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
- ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.
关于创建持久化类需要注意的地方
- 提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
- 提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
- 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。
- 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理.
- 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法
第一个 hibernate 程序
1.创建持久化类
public class News {
private Integer id;
private String title;
private String author;
private Date date;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public News(Integer id, String title, String author, Date date) {
super();
this.id = id;
this.title = title;
this.author = author;
this.date = date;
}
public News(String title, String author, Date date) {
super();
this.title = title;
this.author = author;
this.date = date;
}
public News() {
super();
}
@Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", author=" + author + ", date=" + date + "]";
}
}
2.创建持久化类对应的映射文件
> News.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.zc.cris.hebernate.pojo.News" table="NEWS">
<id name="id" type="java.lang.Integer" access="field">
<column name="ID" />
<!-- 制定主键的生成方式,native:使用数据库的本地方式 -->
<generator class="native" />
</id>
<property name="title" type="java.lang.String">
<column name="TITLE" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" />
</property>
<property name="date" type="java.sql.Date">
<column name="DATE" />
</property>
</class>
</hibernate-mapping>
3.配置 hibernate 核心配置文件(src 目录下创建 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>
<!-- 配置连接数据库的基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate5</property>
<!-- 配置hibernat的基本信息 -->
<!-- hibernate 所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 执行操作时,是否在控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- 是否对sql语句进行格式化显示 -->
<property name="format_sql">true</property>
<!-- 制定自动生成数据表的策略,即程序运行可以在数据库自动生成数据表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 导入关联的.hbm.xml 文件 -->
<mapping resource="com/zc/cris/hebernate/pojo/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4.创建测试类
class HibernateTest {
@Test
void test() {
//1. 创建一个SessionFactory对象
SessionFactory sessionFactory = null;
//1.1 创建configuration对象:解析hibernate 的基本配置信息和对象映射关系
//Configuration configuration = new Configuration().configure();
//4.0 之前这么创建
// sessionFactory = configuration.buildSessionFactory();
//4.x 需要创建一个 ServiceRegistry 对象:hibernate的任何配置和服务都需要在该对象中注册后才能有效
// ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
// .buildServiceRegistry();
//创建我们的数据库访问会话工厂
// SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//但在5.1.0版本汇总,hibernate则采用如下新方式获取:
//1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
//在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("/hibernate.cfg.xml").build();
//2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成该应用唯一(一般情况下)的一个session工厂
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
//2. 创建一个Session对象
Session session = sessionFactory.openSession();
//3. 开启事务
Transaction transaction = session.beginTransaction();
//4. 执行保存操作
// News news = new News("java", "zc", new Date(new java.util.Date().getTime()));
// session.save(news);
// 查询数据操作
News news = session.get(News.class, 1);
System.out.println(news);
//5. 提交事务
transaction.commit();
//6. 关闭session
session.close();
//7. 关闭sessionFactory对象
sessionFactory.close();
//控制台打印的sql语句
/*
Hibernate:
create table NEWS (
ID integer not null auto_increment,
TITLE varchar(255),
AUTHOR varchar(255),
DATE date,
primary key (ID)
) engine=MyISAM
Hibernate:
insert
into
NEWS
(TITLE, AUTHOR, DATE)
values
(?, ?, ?)
*/
}
}
至此,我们的第一个 hibernate程序就建立好了,其中需要注意的是:
1.在 eclipse 的 market 下载 hibernatetools 插件方便创建 hibernate 的配置文件
2.如需获取源代码可以点击我