Hibernate基础之(一)初识Hibernate
一、Hibernate是什么
Hibernate是一个面向Java环境的对象/关系数据库映射工具,用于将对象模型表示的对象,映射到基于SQL的关系模型数据结构中。使面向对象的Java语言编写的程序在操作关系型数据库时,仅仅通过对实体Bean对象的访问,就可以完成对数据库的CRUD操作。
目前流行的程序设计语言,例如:Java、C#等,是面向对象的编程语言,而常用的数据库产品,例如:Oracle、SQL Server、MySQL等,是关系型数据库,而不是面向对象的数据库。目前,若使用Java语言开发一套系统,从需求设计到系统设计都是按照面向对象方式进行的,但到了数据库访问操作的详细设计阶段,由于数据持久化需要保存到关系型数据库,于是,常常通过JDBC技术与SQL语句,实现数据的CRUD操作,这是一种按照过程进行编程的思想,所以,数据访问层的设计与实现回到了“面向过程编程的老路”上来了。
若希望整套系统的设计与开发,“自上而下”都采用面向对象的设计与开发思想,特别是最底层(数据访问层DAO)的开发,也可以采用面向对象的方式操作关系型数据库,就需要有一个面向对象程序设计语言与关系型数据库之间的桥梁,通过ORM(Object Relation Mapping,对象/关系映射)技术,实现面向对象程序设计语言到关系型数据库的映射。Hibernate框架就提供了这个桥梁作用。
Hibernate是采用ORM技术(也可以将ORM理解为一种规范)设计的一套用于解决面向对象程序设计语言与关系型数据库之间不协调问题的框架。通过这个框架,维持了面向对象程序设计语言与关系型数据库并存的局面。
在Hibernate框架中,对数据库CRUD操作的JDBC代码进行了封装,封装在一个称为Session的对象中,于是,Java程序通过持久化对象JavaBean与Session对象访问数据库,而无需直接操作数据表,也无需写SQL命令。
Hibernate框架的作用:把Java程序对持久化对象的操作转换成对数据库的操作。对Java程序而言,以面向对象的方式操作持久化JavaBean对象,而无需直接与数据库中的数据表交互,也不会涉及到具体的SQL命令,Hibernate框架负责将持久化对象的操作转换成与之对应的SQL操作,于是,对于Java程序而言,它主要关注实体Bean的开发,操作的仅仅是实体Bean对象,无需关心数据库底层的具体SQL命令和数据库结构。
Hibernate框架不仅管理实体Bean到数据库表的映射,还提供数据查询和获取数据的方法,可以减少程序员编写SQL命令和JDBC代码的时间,使程序开发更高效。
二、使用Hibernate框架
1、下载Hibernate
Hibernate框架目前最新的版本是6.0,JDK8支持的版本是5.2,下载地址:
http://hibernate.org/orm/releases/
进入Hibernate5.2下载页面:
下载的Hibernate框架压缩文件包:hibernate-release-5.2.17.Final.zip
在压缩文件包中,包含documentation、lib、project三个文件夹,documentation是文档,project是代码,lib中是Hibernate框架的jar文件包。
project/etc目录中,包含hibernate框架的配置文件,例如:hibernate.cfg.xml,hibernate.properties。
lib/required目录中,包含Hibernate框架所需要的的核心jar包。
2、在Eclipse中搭建Hibernate环境
(1)创建一个java project工程
(2)在java project中,创建一个lib目录,将Hibernate框架核心jar包和MySQL驱动程序包copy到lib目录中
(3)将lib下的jar包加载到java Project中
选中lib目录下的所有jar包,鼠标右键“Add to Build Path”,将lib下的jar包加载到java Project中
加载后的Referenced Libraries
3、创建实体Bean
在使用Hibernate之前,首先了解一个概念PO(Persistent Object)持久化对象。持久化对象的作用是完成持久化操作,即:通过持久化对象,以面向对象的方式,实现数据库的CRUD操作。
Hibernate是一个ORM框架,通过Hibernate的支持,程序开发者只需要管理持久化对象的状态,无需关注底层数据库细节。相对于传统的JDBC持久层方案,需要手工管理SQL语句,Hibernate采用了完全面向对象的方法操作数据库,于是,程序开发者只需要关注实体Bean对象和属性,而不再有数据表和字段等概念。
Hibernate操纵的持久化对象,也称为实体Bean对象。Hibernate框架对持久化类的要求如下:
(1)一个实体Bean对应数据库中的一张数据表
(2)实体Bean中的一个属性对应数据表中的一个字段
(3)属性被定义为private私有的,并为每个属性提供一对setter()和getter()方法访问属性值
(4)实体Bean中,包含一个无参构造器
(5)一个实体Bean样例
Public Class 类名(==》表名){
Private 属性(==》字段名);
生成一个默认无参构造器;【必选项】
可以生成一个带参构造器; 【可选择项】
为每一个属性,生成一对setter()和getter()方法;
}
代码示例:
public class Customer {
private String cid;
private String cname;
private String cpassword;
private String mobile;
private String sex;
private String hobby;
public Customer() {
super();
// TODO Auto-generated constructor stub
}
public Customer(String cid, String cname, String cpassword, String mobile, String sex, String hobby) {
super();
this.cid = cid;
this.cname = cname;
this.cpassword = cpassword;
this.mobile = mobile;
this.sex = sex;
this.hobby = hobby;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCpassword() {
return cpassword;
}
public void setCpassword(String cpassword) {
this.cpassword = cpassword;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
4、配置实体Bean与数据表之间的映射关系文件 *.hbm.xml
Hibernate框架选择POJO(普通的java对象)类作为持久化对象使用。
一个普通的POJO类是不具备持久化操作能力的,为了使其具备持久化操作能力,Hibernate采用xml映射文件建立POJO类与数据表、字段之间的对应关系,使普通的POJO类具备了持久化对象的能力。
PO(持久化对象)=POJO(普通java对象)+映射文件
在Hibernate框架中,持久化类与数据表、字段之间的对应关系,由xml映射文件配置,每个映射文件的基本结构都是相同的。
<hibernate-mapping>是根元素
每个<class>子元素对应一个持久化类的映射,一个映射文件中,可以拥有多个<class>子元素
<id>定义持久化类的标识属性(对应数据表的主键)
<property>定义持久化类的属性,type属性指定“字段的数据类型”,column属性指定“字段名”,这两个属性都可以省略,默认:字段名称 == 属性名称,字段类型==属性类型
<hibernate-mapping>
<class name="实体Bean的全路径名" table="数据表名">
<id name="属性名" column="主键名"></id>
<property name="属性名" type=”属性的数据类型” column="字段名"></property>
......
</class>
</hibernate-mapping>
(1)使用映射文件实现“实体Bean与数据表之间的映射关系”
映射文件放在与实体Bean文件相同的包路径下,文件名称为:类名.hbm.xml
(2)在*.hbm.xml映射文件中,引入dtd约束
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
(3)配置映射关系
<hibernate-mapping> 根标签
定义实体类与数据表之间的映射
<class name="com.offcn.bean.Goods" table="t_goods">
定义主键
<id name="goodsID" column="goodsID"></id>
定义属性与字段之间的映射,column的是值可以不定义,默认字段名与属性名相同
<property name="gname" column="gname"></property>
</class>
</hibernate-mapping>
(4)一个完整的“实体Bean与数据表映射文件”实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 定义实体Bean与table的映射关系 -->
<class name="com.offcn.bean.Customer" table="t_customer">
<!-- 定义主键 -->
<id name="cid" column="cid"></id>
<!-- 定义属性与字段之间的映射关系 -->
<property name="cname" column="cname"></property>
<property name="cpassword" column="cpassword"></property>
<property name="mobile" column="mobile"></property>
<property name="sex" column="sex"></property>
<property name="hobby" column="hobby"></property>
</class>
</hibernate-mapping>
5、创建Hibernate核心配置文件hibernate.cfg.xml
Hibernate框架通过持久化类操作数据库,需要知道连接的是哪个数据库,使用哪个数据库连接池,数据库的用户名、密码等信息,这些信息对于所有持久化类都是通用的,于是,将通用信息称之为“Hibernate配置信息”,使用核心配置文件hibernate.cfg.xml进行配置。
Hibernate在操作过程中,只会加载hibernate.cfg.xml核心配置文件,其他配置文件不会被加载,所以,要将映射文件配置在核心配置文件中。
(1)核心配置文件的名称、文件位置是固定的
位置:放在src目录下
名称:hibernate.cfg.xml
(2)引入dtd约束
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
(3)Hibernate.cfg.xml核心配置文件中包含的内容
数据库/数据库连接池信息【必须的】
<hibernate-configuration>
<!-- 数据库配置 -->
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/20190527java?serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
</session-factory>
</hibernate-configuration>
Hibernate信息【可选的】
<!-- 在控制台输出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 对控制台输出的sql语句进行格式化 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate会自动创建数据表,若数据表已存在,则不再创建,只做更新;若数据表不存在,则创建数据表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言
让hibernate识别数据库中,每一个数据库特有的语句,例如:MySQL数据库的分页limit语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>