1、什么是Hibernate?
Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servlet或JSP的Web应用中。
总之,可以简单的理解为Hibernate是基于JDBC技术基础上衍生而来,并在此基础上使得由原来直接操纵数据库变成直接操作映射数据表后生成的Java类,从而实现对象编程思维来操纵数据库。
2、Hibernate理论基础概要
Hibernate是一个JDO(Java Data Object,Java对象持久化)工具。它的工作原理是通过文件把值对象和数据库表之间建立起一个映射关系,这样我们就只需要操作这些值对象和Hibernate提供的一些基本类,就可以达到使用数据库的目的。例如,使用Hibernate的查询,可以直接返回包含某个值对象的列表(List),而不必像传统的JDBC访问方式一样把结果集的数据逐个装载到一个值对象中,为我们的 编码工作节省了大量的劳动。Hibernate提供的HQL是一个类SQL语言,它和EJBQL(HQL的一个子集)一样都提供对象化的数据库查询方式,但HQL在功能和使用方式上都非常接近于标准的SQL。
Hibernate的作用是介于Java与JDBC之间的一个持久层,它通过建立与数据库表之间的映射来操纵数据库。Hibernate是基于JDBC基础之上的,在深入了解Hibernate理论技术的基础上,要先了解以下三点基础:数据库操作的三个阶段、ORM对象关系映射、持久层概念。
3、Hibernate理论基础之数据库操作
在Hibernate出现之前,对数据库操作是基于JDBC,这中间经历了操作JDBC、封装JDBC、ORM三个阶段。
(1)操作JDBC阶段
本阶段即在调用JDBC连接数据库的包时,需要自己进行编写的进行数据库用户登录验证的那段代码。在这段代码中可以执行SQL语句进行数据查询、插入、删除等。
(2) 封装JDBC阶段
由于仅仅只是操作JDBC,使得在实现不同逻辑功能时,都要重新编写进行数据库用户登陆验证的那段代码,使得代码重复很严重。为此,引入了JavaBean的技术,书写一个DBAccess.java类进行数据库用户登陆验证和数据库操作,并把其中进行数据库操作部分封装成不同的函数,那么实现后续的逻辑功能时只需调用这些函数即可实现。
(3)ORM阶段
在对JDBC进行封装之后,能够方便的实现数据库的操作。但是,在面向对象的编程开发中,数据库的操作与普通的面向对象的Java代码,显然是两种不同的开发思路。于是就产生了ORM阶段——使原来直接操作数据库变成了直接操作普通的Java类来实现相应的数据库操作。
4、Hibernate的配置之XML配置
Jar包
因为不能添加附件,那么这里附上百度云的连接点击下载
总体目录结构
1)、设置实体类
package entity;
import java.util.Date;
public class Student {
private long id;
private String name;
private Date birthDay;
private Class c;
public Class getC() {
return c;
}
public void setC(Class c) {
this.c = c;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", birthDay=" + birthDay + "]";
}
}
2)、在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="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 连接数据库的url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/tb_test</property>
<!-- 数据库用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 其他配置 -->
<!-- 在控制台中输出sql -->
<property name="show_sql">true</property>
<!-- 格式化控制台中的sql -->
<property name="format_sql">true</property>
<!--
hbm2ddl.auto的作用为:自动创建/更新/验证数据库表结构
有以下值:
create: 表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
-->
<property name="hbm2ddl.auto">create</property>
<!-- 用来关联hbm配置文件 -->
<mapping resource="entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3)写user的配置文件user.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package是指我们配置的类的包所在的位置 -->
<hibernate-mapping package="entity">
<!--
class是指我们配置的包下的类与表的对应关系,在同一个entity包下我们可以 配置多个class
name代表类名,table为实体类与表的映射关系的建立
-->
<class name="User" table="t_user">
<!-- id为主键,数据库需要维护数据库的主键,
所以我们需要建立一个主键的生成策略gennerator,大多数情况下值为native,当我们的数据库为Oracle和db2的时候我们可以尝试squence
-->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" type="string" column="name"></property>
<property name="birthDay" type="date" column="birthDay"></property>
</class>
</hibernate-mapping>
4)编写 test
package test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import entity.User;
public class UserTest {
public static void main(String[] args) {
Configuration configuration=new Configuration().configure(); // 实例化配置文件
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); // 实例化服务登记
SessionFactory sessionFactory=configuration.buildSessionFactory(serviceRegistry); // 获取Session工厂
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
User user = new User();
user.setName("张三");
user.setBirthDay(new Date(System.currentTimeMillis()));
session.save(user);
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
sessionFactory.close(); // 关闭session工厂
}
}
5)测试结果
控制台结果,打印出了格式化的Sql语句

数据库的结果,表中插入了一条数据,hibernate会自动建立表。

5、Hibernate的配置之注解配置
Jar包不变即可
目录结构

1.实体类
package entity;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="t_user2")
public class User {
private int id;
private String name;
private Date birthDay;
@Id
@GeneratedValue(generator="native") //这里的native是下面的GenericGenerator的name的值
@GenericGenerator(name = "native", strategy = "native") //主键生成策略为native,为自动选择
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 Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
}
2.在srcc下的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="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 连接数据库的url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 数据库用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 其他配置 -->
<!-- 在控制台中输出sql -->
<property name="show_sql">true</property>
<!-- 格式化控制台中的sql -->
<property name="format_sql">true</property>
<!--
hbm2ddl.auto的作用为:自动创建/更新/验证数据库表结构
有以下值:
create: 表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
-->
<property name="hbm2ddl.auto">create</property>
<!-- 用来关联hbm配置文件 -->
<mapping class="entity.User"/>
</session-factory>
</hibernate-configuration>
3)、编写测试类
这里和上面的测试类没有任何的变化。
package test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import entity.User;
public class UserTest {
public static void main(String[] args) {
Configuration configuration=new Configuration().configure(); // 实例化配置文件
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); // 实例化服务登记
SessionFactory sessionFactory=configuration.buildSessionFactory(serviceRegistry); // 获取Session工厂
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
User user = new User();
user.setName("张三");
user.setBirthDay(new Date(System.currentTimeMillis()));
session.save(user);
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
sessionFactory.close(); // 关闭session工厂
}
}
4)测试结果
数据库测试
6、XML配置与注解配置的区别
1.XML配置需要一个实体类对应一个mapping中的class,但是注解配置的方式,需要一个实体类对应一个表,添加相应的
@table(name=”tableName”),
@Entity,
@Id,
@column(name=”columnName”),
@GeneratedValue(generator=”generatorName”)
@GenericGenerator(name = “generatorName”, strategy = “native”)
2.hibernate.cfg.xml的区别
//实体类的地址
//实体类配置的地址