在了解Hibernate框架之前,我们应该先要了解对象-关系映射(ORM)和关系型数据库这两个概念。
对象-关系映射(ORM)主要是实现程序对象到关系数据库数据的映射。
为什么这么说呢?
关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
回顾我们以前开发的项目,我们在操作数据库过程中,都是在做一些映射的东西。例如,有一个User对象,我们需要做的就是把这个对象存到数据库里的哪个表,这个对象的属性对应数据库表的哪些字段,而要完成这些就需要映射。以往这些映射关系都是由我们自己来完成的。现在有了Hibernate框架,这些关系就可以由它来维护了。
Hibernate提供了几种映射方式:
Hibernate 基本组件:
- Hibernate 核心配置文件:Hibernate.cfg.xml文件,完成基本的配置
- 实体类(*.java):即映射类,描述对象名和属性,对应表中的表名和字段
- 映射文件(*.hbm.xml):指定映射类和数据库表的关系
基本映射
<!--声明Hibernate配置文件的开始-->
<hibernate-configuration>
<!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作-->
<session-factory>
<!--配置数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 设置数据库的连接url;Localhost 表示mysql服务器名称,hibernate_basemapping表示数据库名 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_basemapping</property>
<!--连接数据库的用户名-->
<property name="hibernate.connection.username">root</property>
<!--连接数据库的密码-->
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否在后台显示Hibernate用到的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 根据映射文件和数据库中的表对应起来,如果不一致,就更新表的结构 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.实体类
package com.blackfox.hibernate;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
实体类的设计原则:
- 实现无参的默认的构造函数
- 提供一个标识
- 建议不要使用fianl修饰实体类
- 建议为实体类生成getter和setter方法
实体类中的普通属性(不包括集合、自定义和数组)映射成表字段,采用
<property>
标签映射
<!-- 可在根元素声明包名 -->
<hibernate-mapping package="com.blackfox.hibernate">
<!-- 使用class元素定义一个持久化类,name持久化类名,table对应数据库表名 -->
<class name="User" table="t_user">
<!-- id 定义该属性到数据库表主键字段的映射 ,name 标识属性的名字,column表主键字段的名字,不写默认一样-->
<id name="id" column="user_id" length="32" access="field">
<!-- <generator>:指定主键由什么生成,推荐使用uuid,assigned指用户手工填入 -->
<generator class="uuid"/>
</id>
<!-- 为类定义一个持久化的javaBean风格的属性,name 属性的名字 -->
<property name="name" length="30" unique="true" not-null="true"/>
<property name="password"/>
</class>
</hibernate-mapping>
注意:如果实体类的名称或实体类中属性的名称和数据库关键字重复,将会出现问题可以考虑采用table属性和column对其进行重新命名。
Hibernate 处于持久层,是我们程序跟数据库打交道的桥梁,让我们以面向对象的方式来跟数据库打交道。好处:彻底封装了JDBC隐藏细节,带来移植性。缺点:封装的太彻底,不灵活,对大数据量的更新操作还有问题。
Hibernate 的基本映射只是冰山一角,下面还将为大家介绍Hibernate的几种关联映射。