本文介绍在Eclipse Oxygen下创建第一个Hibernate 5.2.13程序。
一、JavaWeb三层架构
JavaWeb三层架构分别为:
Web层:表示层,主要的架构模式为MVC(Model View Controller,模型-视图-控制器),主要框架有:Spring MVC和Struts2(当然也有Struts1);
Service层:业务逻辑层,主要框架有:Spring;
Dao层:数据访问层,即数据持久化层,主要框架有:MyBatis(前身是iBATIS)和Hibernate。
常用的两种框架组合:
SSH:Struts2 + Spring + Hibernate
SSM:Spring MVC + Spring + MyBatis(目前更流行,更推荐学习SSM)
二、Hibernate框架简介
Hibernate是一个开源的对象关系映射(Object Relational Mapping,即ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将Java实体类与数据库表建立映射关系,使用对象编程思维来操纵数据库,完成数据持久化的任务。
所谓对象关系映射,即ORM(Object Relational Mapping),将面向对象编程语言和关系型数据库之间建立起一种映射关系,即让Java实体类和数据库表一一对应,类名和表名对应,类属性和表字段一一对应,然后就可以使用面向对象的思想来通过操纵实体类的对象即可实现对数据库表的操纵。
所谓数据持久化,狭义来说指将数据存入数据库中;广义来说即是将那些内存中数据存储到外存中。持久化技术则提供了一种让数据在瞬时状态和持久状态之间进行转换的机制。
三、准备工作
本文使用的开发工具为Eclipse Oxygen(Eclipse IDE for Java EE Developers),数据库为MySQL 5.7.21,Hibernate框架版本为5.2.13,MySQL JDBC驱动版本为5.1.45。
①、下载Hibernate框架,当前最新版本为Hibernate 5.2.13:
![](https://img.haomeiwen.com/i7213631/360ef379575c26b5.png)
Hibernate
③、下载MySQL JDBC驱动,当前最新版本为MySQL Connector/J 5.1.45:
![](https://img.haomeiwen.com/i7213631/794cc31f32176224.png)
MySQL JDBC
④、安装Hibernate Tools for Eclipse插件,便于Hibernate开发,Hibernate配置文件Hibernate.cfg.xml和实体映射文件Entity.hbm.xml可快速生成,极大提高开发效率。
四、创建项目
本文只介绍Hibernate作为ORM框架如何以面向对象的思想操纵数据库,所以只是建立Java项目;如果将Hibernate应用于Java Web三层结构中Dao层,则需要建立Java Web项目。
新建Java项目,依次选择File > New > Project(若是开发Java Web项目则依次选择File > New > Dynamic Web Project):
![](https://img.haomeiwen.com/i7213631/8fd01793e3966e29.png)
新建Java项目
选择Java Project:
![](https://img.haomeiwen.com/i7213631/008c069972518bde.png)
Java Project
设置项目名:
![](https://img.haomeiwen.com/i7213631/d6a6f110a1bfed15.png)
设置项目名
项目新建完后项目结构:
![](https://img.haomeiwen.com/i7213631/552f87ca089efa77.png)
项目初始结构
项目中需要添加Hibernate框架和MySQL JDBC驱动的jar包,常用的有如下两种方法:
第一种方法:在项目中新建lib文件夹,将Hibernate框架中hibernate-release-5.2.14.Final\lib\required
目录下的所有jar包和MySQL JDBC驱动mysql-connector-java-5.1.45.jar
拷贝到新建的lib文件夹中,然后选择所有jar包右键Build Path > Add to Build Path,之后将自动生成一个Referenced Libraries目录,表示引用这些jar包成功:
![](https://img.haomeiwen.com/i7213631/a74c56af67176cb5.png)
新建文件夹
![](https://img.haomeiwen.com/i7213631/7e174838eec95801.png)
设置为lib
![](https://img.haomeiwen.com/i7213631/4260837c28a47694.png)
拷贝jar到lib文件夹
![](https://img.haomeiwen.com/i7213631/2b6a9aa55c0e7a1b.png)
Build Path
![](https://img.haomeiwen.com/i7213631/03cc6afa45d448c3.png)
Build Path
第二种方法:若是开发Java Web项目,则可以直接将所需jar包拷贝至HibernateStart/WebContent/WEB-INF/lib/下即可,待TomCat服务器启动时会自动加载类库。
![](https://img.haomeiwen.com/i7213631/cfae50da88f22e51.png)
Web中lib
引入Hibernate框架后项目结构如下:
![](https://img.haomeiwen.com/i7213631/775c83baa8353653.png)
项目结构
五、完善项目
Hibernate可以根据Java实体类如Student类映射生成数据库Student表,亦可以根据数据库表Student映射生成Java实体类Student。所以使用Hibernate不需要先在数据库中建表。
通过Hibernate的Java类Configuration对象读取Hibernate配置文件hibernate.cfg.xml,通过其mapping标签读取Hibernate实体类映射文件如Student.hbm.xml,然后根据其class标签找到Java实体类Student,然后就可以根据对Java实体类Student的操作映射到对数据库表Student的CRUD操作。故可以先创建Java实体类,然后创建其Hibernate映射文件,接着创建Hibernate配置文件,最后可以编码测试。
<1>、创建Java实体类
Java实体类,也称为持久化类,是一个POJO(Plain Old Java Object,简单的Java对象,普通JavaBean),可以这么理解,需要创建这么一个Java实体类:公有的类,私有的属性,并提供公有无参构造函数,以及私有属性的公有的Getter/Setter方法。Hibernate推荐为Java实体类设置一个与表对应的主键。
右键src,依次选择New > Package,根据Java包命名规范设置包名(一般来说,与数据库表对应的实体类所在包名习惯上命名为entity、model或者domain),然后依次选择New > Class,创建Student.java文件:
![](https://img.haomeiwen.com/i7213631/0cd8ace15284efb4.png)
Student.java文件
学生实体类Student,其有四个属性:id(学号,主键)、name(姓名)、sex(性别)和birthday(出生日期)。Student.java如下:
package com.rcnjtech.entity;
import java.util.Date;
/**
* 公有的学生实体类Student,将映射到数据库表Student
*
* @author RCNJTECH
*/
public class Student {
/**
* 学生的属性,应为私有的属性,学生实体类主键为id
*/
private int id;
private String name;
private String sex;
//注意使用java.util.Date包下的日期类型
private Date birthday;
/**
* 应提供无参构造函数
*/
public Student() {
}
/**
* 若提供了带有参数的构造函数,则必须显示提供无参构造函数
*/
public Student(int id, String name, String sex, Date birthday) {
this.id = id;
this.name = name;
this.sex = sex;
this.birthday = birthday;
}
// 为属性提供公有的Getter/Setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
'}';
}
}
<2>、创建Java实体类的Hibernate映射文件
如何让Java实体类和数据库表映射呢(Java映射为SQL)?目前有两种方式:XML和Annotation。
XML即Extensible Markup Language,可扩展标记语言,用来传输和存储数据,独立于软件和硬件的信息传输工具,能实现不同应用系统间数据的共享和交互,故XML可以作为媒介,将Java映射为SQL。
Annotation,即注解,在Java类、属性、方法上添加@注解名称的形式。
由于安装了Hibernate Tools for Eclipse,故可以快速生成Student.hbm.xml文件,否则手动创建之。选中Student.java,右键依次选择New > Other,然后选择Hibernate > Hibernate XML Mapping file(hbm.xml),点击Next,正如图所示已选中Student.java,点击Next,默认生成的文件名为Student.hbm.xml,点击Finish:
![](https://img.haomeiwen.com/i7213631/73da62772dab15a8.png)
Hibernate Tools
![](https://img.haomeiwen.com/i7213631/cf5f36c5c467f8ca.png)
Hibernate Tools
![](https://img.haomeiwen.com/i7213631/201f9380c39f793d.png)
Hibernate Tools
默认生成的Student.hbm.xml文件(与Student.java在同一个包下)如下:
![](https://img.haomeiwen.com/i7213631/44b03132fd540b73.png)
Student.hbm.xml
修改学生实体类映射文件Student.hbm.xml,如下:
<?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>
<!-- 将Java实体类Student与数据库Hibernate表Student映射 -->
<class name="com.rcnjtech.entity.Student" table="Student">
<!-- 主键 -->
<id name="id" column="id" type="java.lang.Integer">
<generator class="assigned"/>
</id>
<!-- 非主键属性使用property -->
<property name="name" type="java.lang.String" length="20" not-null="true"/>
<property name="sex" type="java.lang.String" length="2"/>
<property name="birthday" type="java.util.Date"/>
</class>
</hibernate-mapping>
实体类映射文件通过class标签将Java实体类和数据库表映射,通常有如下三个属性:
name:Java实体类的全路径,必须设置此属性;
table:Java实体类映射到数据库中的表名,可省略,默认与Java实体类名一致;
schema:Java实体类映射到数据库名,可省略,因为在hibernate.cfg.xml中的connection.url属性中指定了所要操作的数据库名。
<class name="com.rcnjtech.entity.Student" table="Student">
...
</class>
然后在class标签里配置Java实体类映射到数据库中表的主键(id标签)、属性(property标签)字段等,这两标签常用的属性有:
name:Java实体类的属性(数据成员),必须设置此属性;
column:Java实体类的属性映射到数据库表的字段名,可省略,默认与属性名一致;
type:Java实体类的属性映射到数据库表的字段的数据类型,可以指定为Java数据类型或者Hibernate映射类型(在Java和SQL数据类型之间转换的转换器)。可省略,若未指定此属性,则Hibernate将尝试使用反射机制自动确定类型(Date类型需注意),但会增加资源开销,因此建议指定此属性;
length:映射到数据库表的字段的长度,可省略;
not-null:映射到数据库表的字段能否为空,可省略。
id:主键,generator标签表示主键生成策略,目前先介绍两种主键生成策略分别为native(自动增长)和assigned(手工赋值):
<!-- 主键属性使用id -->
<id name="id" column="id" type="java.lang.Integer">
<!-- 使用手工赋值 -->
<generator class="assigned"/>
</id>
property:非主键属性的字段使用property标签:
<!-- 非主键属性使用property -->
<property name="name" type="java.lang.String" length="20" not-null="true"/>
<property name="sex" type="java.lang.String" length="2"/>
<property name="birthday" type="java.util.Date"/>
故可简化为如下:
<!-- 主键属性使用id -->
<id name="id">
<generator class="assigned"/>
</id>
<!-- 非主键属性使用property -->
<property name="name"/>
<property name="sex"/>
<!-- type指定为Hibernate映射类型,date只含年月日 -->
<property name="birthday" type="date"/>
<3>、创建Hibernate配置文件
Hibernate配置文件即hibernate.cfg.xml定义了Hibernate的配置信息,值得注意的是Hibernate配置文件的名称和位置是约定好的,即名称必须为hibernate.cfg.xml,位置在src根目录下。由于安装了Hibernate Tools for Eclipse,故可以快速生成hibernate.cfg.xml文件,否则手动创建之。右键src,依次选择New > Other,然后选择Hibernate > Hibernate Configuration File(cfg.xml),点击Next,正如图所示,默认文件名为hibernate.cfg.xml,且在src根目录下,点击Next,默认并点击Finish。在src根目录下生成了hibernate.cfg.xml文件:
![](https://img.haomeiwen.com/i7213631/f69052a9473be78c.png)
hibernate.cfg.xml
![](https://img.haomeiwen.com/i7213631/f6bfcce0dc963051.png)
hibernate.cfg.xml
![](https://img.haomeiwen.com/i7213631/fe7949eae4525e77.png)
hibernate.cfg.xml
![](https://img.haomeiwen.com/i7213631/1a2288542b1221fd.png)
hibernate.cfg.xml
修改hibernate.cfg.xml文件,如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 1、数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- useUnicode=true&characterEncoding=UTF-8可避免中文乱码 -->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<!-- 2、数据库操纵信息 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 注意dialect的值,否则会出现奇怪的问题 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hbm2ddl.auto">create</property>
<!-- 3、添加实体类映射文件 -->
<mapping resource="com/rcnjtech/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate.cfg.xml里所有的配置信息都是以<property name="属性名">属性值</property>的形式(即键值对,键名 = 键值),并且所有的属性名可以省略前缀hibernate.(如hibernate.connection.driver_class可以简写为connection.driver_class),配置信息包含了如下三部分内容:
①、数据库连接信息,必须要有下面四个属性,以MySQL数据库为例:
connection.driver_class:数据库驱动器类;
connection.url:数据库URL,至少由三部分组成,如jdbc:mysql://localhost:3306/hibernate
,jdbc:mysql://
为MySQL JDBC,localhost:3306/
为本机数据库,端口号为3306
,hibernate
则为MySQL数据库里的一个名为hibernate的数据库。此外,还可以设置是否使用SSL、设置Timezone以及设置字符编码和字符集等。其还有一种简写形式为jdbc:mysql:///hibernate
,即默认访问的是本机数据库;
connection.username:数据库用户名(MySQL数据库默认用户名root);
connection.password:数据库root用户对应的密码。
<!-- 1、数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- useUnicode=true&characterEncoding=UTF-8可避免中文乱码 -->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
其配置信息对应于使用JDBC时注册驱动器类和获得数据库连接对象Connection:
// JDBC代码
// 注册驱动器类
Class.forName(driver_class);
// 获得数据库连接对象
Connection conn = DriverManager.getConnection(url, username, password);
②、数据库操纵信息,目前常用的有如下几个,还有一些设置以后会补充的:
show_sql:控制台输出SQL语句;
format_sql:对控制台输出SQL语句进行排版格式化;
dialect:数据库方言,针对不同的数据库不同的版本的语法特征。MySQL5Dialect适用于MySQL 5.x版本 ,MySQLDialect适用于MySQL 5之前的版本。此外针对MySQL不同引擎也可以进一步设置,如MySQL5InnoDBDialect使用的是InnoDB引擎,提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,提供了行级锁和外键约束;
hbm2ddl.auto:DDL表结构策略,如每次生成表结构是删除以前的表重新创建(create),还是更新表结构(update)等等。
<!-- 2、数据库操纵信息 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 注意dialect的值,否则会出现奇怪的问题 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hbm2ddl.auto">create</property>
③、Java实体类映射文件配置信息:将实体类映射文件路径添加到<mapping/>标签中(注意实体类映射文件路径的写法),Hibernate会根据映射文件使用java.lang.ClassLoader加载实体类。
<!-- 3、添加实体类映射文件 -->
<mapping resource="com/rcnjtech/entity/Student.hbm.xml"/>
<4>、编写测试程序
新建一个测试包,创建StudentTest.java,代码如下:
![](https://img.haomeiwen.com/i7213631/52e30d0dc3901e76.png)
测试类
import com.rcnjtech.entity.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import java.util.Date;
/**
* 测试类
*
* @author RCNJTECH
*/
public class StudentTest {
private static final SessionFactory sessionFactory;
static {
Configuration configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
}
public static Session getSession() {
return sessionFactory.openSession();
}
public static void main(String[] args) {
final Session session = getSession();
Transaction transaction = session.beginTransaction();
try {
Student student = new Student(10001, "张三", "男", new Date());
session.save(student);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
} finally {
session.close();
sessionFactory.close();
}
}
}
运行StudentTest.java,观察控制台Console输出。首先判断数据库中是否已有表Student,否则删表。根据根据Hibernate映射文件生成表Student,然后插入一条数据:
![](https://img.haomeiwen.com/i7213631/42570dac5192a8ca.png)
运行结果
打开MySQL数据库,成功创建Student表并插入数据10001 | 张三 | 男 | 2018-03-04 15:05:06
:
![](https://img.haomeiwen.com/i7213631/6fcb6c65ada705e7.png)
MySQL
项目源码,提取密码:d6d2
至此,在Eclipse Oxygen上成功创建并运行了第一个Hibernate 5程序。
网友评论