Hibernate 初体验之持久化对象
1. 前言
本节课程让我们一起体验 Hibernate 的魅力!编写第一个基于 Hibernate 的实例程序。
在本节课程中,你将学到 :
- Hibernate 的版本发展史;
- 持久化对象的特点。
为了更好地讲解这个内容,这个初体验案例分上下 2 个章节来讲解。
2. Hibetnate 体系结构
如图可知,应用程序可以通过 Hibernate 为用户提供的接口 API 通知 Hibernate 内部组件对数据库中数据进行一系列操作。
在操作之前,先做些准备工作。
3. 使用 Hibernate 编写第一个程序
3.1 持久化对象
Hibernate 是以 Java 面向对象编程的方式操作数据库。使用之前先要定义一个对象,这个对象叫持久化对象。
为什么叫持久化对象?不急!一步步来,慢慢掀起它神秘面纱。
先一起来看看这个持久化对象的定义。这个所谓的持久化对象长得和普通的 Java 对象没有什么不同:
文章中淡化了对象和类的区别。
public class Student {
//学生编号
private Integer stuId;
//学生姓名
private String stuName;
//此处省略其它属性……
public Student(){
super();
}
public Student(Integer stuId,String stuName){
this.stuId=stuId;
this.stuName=stuName;
//省略代码……
}
//省略各种get set方法
}
关于这个对象定义有几点需要说明:
- 这个类的结构需要对应关系型数据库中某一张表的表结构;
- 可用类中的属性封装表中对应字段数据(数据类型保持一致);
- 所有属性提供 get 和 set 方法,类定义中提供一个无参的构造方法。且不要在这个类中提供任何业务逻辑代码。是的!这是一个符合 JavaBean 规范的普通 Java 类(POJO)。
你定义的,你心里知道。但是,Hibernate 不知道这个类是干嘛用!
所以,你必须通过元数据说明告诉 Hibernate:
- 这个类结构对应那个表结构
- 这个类的属性对应表中的那个字段(还需附加类型说明等 N 多信息)
加上元数据说明,这样,Hibernate 就能够使用这个对象操作数据中的数据了!
智能化是有前提条件的!Hibernate 再聪明也需要指引!
此时这个 POJO (普通 Java 类 POJO : Plain Ordinary Java Object,不包含业务逻辑代码的值对象)对象可换上一个更贴切的名字:持久化对象(PO:persistent object)。
你也应该要小结一下: PO = POJO + 元数据说明
此处稍加提醒下,元数据说明方法有两种:
- XML;
- 注解。
3.2 XML 映射
现在流行使用注解方式告诉 Hibernate 你操作的对象对应数据库中的那张表及更多关联信息。
对 XML 映射大家也需要了解一下,万一你以后工作的企业里有一群怀旧的叔叔呢!
本章节中的案例使用 XML 映射方式,后面的内容讲解还是要跟上潮流,使用注解方式。
命名为 Student.hbm.xml 文件中部分内容如下 (完整的文档结构说明可查看官方文档):
<Hibernate-mapping>
<class name="com.po.Student" table="student" schema="scott" >
<id name="stuId" type="java.lang.Integer">
<column name="stuId" precision="11" scale="0" />
<generator class="increment"></generator>
</id>
<property name="stuName" type="java.lang.String">
<column name="stuName" length="20" unique="true" />
</property>
<!--其它属性映射-->
</class>
</Hibernate-mapping>
上面这个 XML 文件中的内容,语义上非常明确。为了加深理解,再解释一下 Xml 中相应元素:
- class: 类与表的映射关系;
- id: 类中的那个属性对应表中的主键字段,只能有一个。这个属性也可叫做标识属性。
- property: 通过子元素 column 一起说明类中的其它属性分别对应表中的那个字段,可以有多个。
通过 XML 元素属性或子元素所提供的附加信息越多,就可以让 Hibernate 清晰地明白自己的任务,否则某些环节它就要靠猜了!
编码规范提示: 尽可能保持 Java 类中属性命名和表中字段命名相同!
有了前面的工作。已经足够让 Hibernate 在进入数据库系统时生成正确的 SQL 语句,也足够让 Hibernate 把从数据库中带出来的数据映射成正确 Java 对象。
4. 主配置文件
何谓主配置文件?其作用是什么?
一句话概括:为 Hibetnater 的数据库操作工作做行程计划。
如:
- 指定访问的具体数据库,串门可别窜岔了;
- 操作时依赖的映射文件在那里;
- 在操作过程其它一系列设置安排。
也可以说,开发者可以通过此文档和 Hibernate 的内部组件进行互动。 Hibetnate.cfg.xml 是主配置文件的默认命名,当然,你可以改成其它名称!
好吧,现在通过此文件告诉 Hibernate 两个信息:
- 你要远行的地方叫 MySql (本课程选用 MySql 为项目数据库);
- 你要依赖的映射文件叫 Student.hbm.xml。
<hibernate-configuration>
<session-factory>
<!-- 访问MySql数据库的基本连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property : name="connection.url">jdbc:mysql://localhost:3306/myhibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">abc123</property>
<!— 数据库连接池会在后面讲解,这里先给自己一个预习机会-->
<property name="connection.pool_size">1</property>
<!-- SQL 方言 -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- 是否显示Hibetnate自动生成的SQL语句 -->
<property name="show_sql">true</property>
<!—映射文件的位置-->
<mapping resource="com/mk/po/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
文件中的内容一目了然,有几点需要强调说明:
-
数据源的目的是告诉 Hibetnate 去哪家关系数据库中获取数据。配置时一般会涉及到数据库连接池,可先作为自己预习内容,此章节不讲;
-
dialect 方言如同大家都讲普通话,因出生地区域不同,普通话中或多或少都会有本地方言。SQL 是关系数据系统的统一语言,每一种具体的关系数据库产品中的 SQL 语句也有稍许差异性。此处告诉 Hibetnate 在生成 SQL 语句时要入乡随俗,注意语法上的细节差异;
-
其它配置内容可根据开发过程的需求逐一添加。
其实不难,如果你觉得难,对于想让你工作变得简单的 Hibernate 而言就会觉得很伤心!
当然,你也不能指望 Hibetnate 是你心里的蛔虫,在 Hibernate 工作之前与之交流环节是必不可少的。
5. 小结
本节课内容先讲到这里!知识需要消化时间。
本节课程,让大家了解了 Hibernate 进行数据库操作的关键是什么!在心里反复地默念一下:
持久化对象是一个 Java 对象牵手元数据说明信息,目的是帮助 Hibernate 明白进入数据库系统的任务(生成增、删、改、查相应操作的 SQL 语句)、以及正确完成数据(关系型数据)到数据(Java OOP 数据)的映射。