7.31

2022-07-18

7.31

Hibernate

什么是Hibernate

Hibernate框架简化了java应用程序与数据库交互的开发。 Hibernate是一个开源,轻量级的ORM(对象关系映射)工具。

hibernate的优点

  1. 开源和轻量级: Hibernate框架是根据LGPL许可证和轻量级的开源工具。
  2. 快速性能: Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。
  3. 数据库独立查询: HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。
  4. 自动创建表: Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。
  5. 简化复杂连接: 在hibernate框架中可轻松获取多个表中的数据。
  6. 提供查询统计和数据库状态: 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程序

  1. 原理分析

    hibernate基本和mybatis类似,也是需要两个配置文件,一个是hibernate.cfg.xml,用来配置session-factory参数,一个是XX.xml用来配置sql语句和对应的实体类

  2. hibernate.cfg.xml配置文件内容

    com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test root mhn939510 org.hibernate.dialect.MySQLDialect true
  3. XX.xml的配置文件内容

  4. 依赖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
  5. 编写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;
    }

    }

  6. 编写测试类

    @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");
    }

使用注解创建hibernate程序