7.31
7.31
Hibernate
什么是Hibernate
Hibernate框架简化了java应用程序与数据库交互的开发。 Hibernate是一个开源,轻量级的ORM(对象关系映射)工具。
hibernate的优点
- 开源和轻量级: Hibernate框架是根据LGPL许可证和轻量级的开源工具。
- 快速性能: Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。
- 数据库独立查询: HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。
- 自动创建表: Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。
- 简化复杂连接: 在hibernate框架中可轻松获取多个表中的数据。
- 提供查询统计和数据库状态: Hibernate支持查询缓存,并提供有关查询和数据库状态的统计信息。
dialect(方言)
Dialect是一个使用Hibernate的方式将数据库的数据类型转换为Java的数据类型,反之亦然。此外,它用于定义将HSQL(Hibernate SQL)的函数转换为数据中的函数的方式
hibernate生命周期
短暂(Transient)
持久(Persistent)
Removed
Detached
1.当从一个实体创建一个新的Java对象时,该对象处于“短暂”状态。 Hibernate不知道它的存在,因为它独立于Hibernate的管理。
2.如果使用方法:get,load或find获取实体对象,则将获得一个等同于数据库中的1条记录的对象。 此对象处于Persistent状态。 它由Hibernate管理。
3.会话调用方法:save,saveOrUpdate和persist。 合并将短暂(Transient)对象置于Hibernate的管理之下,此对象转为持久化(Persistent)状态。 在使用的具体情况下,它向数据库插入或更新数据。
4.Session调用evict(..)或clear(),以便从处于Hibernate管理状态的对象处于关闭状态,并且这些对象处于分离(Detached)的状态。
5.使用update(..),saveOrUpdate(..),merge(..)将有助于重新连接分离对象。 在具体情况下,它会向数据库中创建更新或插入数据。 对象转回持久化(Persistent)状态。
6.Session调用方法:remove(..),delete(..)删除除记录并持久化对象。
编写一个简单的hibernate程序
-
原理分析
hibernate基本和mybatis类似,也是需要两个配置文件,一个是hibernate.cfg.xml,用来配置session-factory参数,一个是XX.xml用来配置sql语句和对应的实体类
-
hibernate.cfg.xml配置文件内容
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test root mhn939510 org.hibernate.dialect.MySQLDialect true -
XX.xml的配置文件内容
-
依赖jar包
org.hibernate hibernate-core 5.2.9.Final mysql mysql-connector-java 5.1.46 commons-dbcp commons-dbcp 1.4 junit junit 4.12 cglib cglib 2.1_3 c3p0 c3p0 0.9.1 org.ehcache ehcache 3.5.2 org.hibernate ejb3-persistence 3.3.2.Beta1 javax.xml.bind jaxb-api 2.3.0 com.sun.xml.bind jaxb-impl 2.3.0 com.sun.xml.bind jaxb-core 2.3.0 javax.activation activation 1.1 -
编写bean类
package com.mahaonan.bean;
import java.io.Serializable;
public class Employee implements Serializable{
/**
*
*/
private static final long serialVersionUID = 6689041094307015985L;
private int id;
private String firstName;
private String lastName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}@Override
public String toString() {
return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + id;
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (id != other.id)
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}}
-
编写测试类
@Test
public void testEemployee() {
//创建configuration对象加载配置文件
Configuration cfg = new Configuration();
cfg.configure();
//获取工厂对象
SessionFactory factory = cfg.buildSessionFactory();
//创建session对象
Session session = factory.openSession();
//创建事务对象
Transaction t=session.beginTransaction();
//实体类对象
Employee e1 = new Employee();
e1.setFirstName("Max");
e1.setLastName("Su");
//执行实体类对象
session.persist(e1);
//提交事务
t.commit();
session.close();
System.out.println("successfully saved");
}