Hibernate学习笔记-入门

Hibernate学习笔记
Hibernate是一种使用java实现的数据库到数据模型的ORM框架, 并且自带了缓存,抓取策略等优化方式.

安装:

首先需要引用jdbc包, 因为Hibernate依赖与jdbc.
官网下载zip包后直接解压, 项目中引用解压后文件夹中request中的jar包就好, request文件夹下的jar包为Hibernate的必须包, 其他文件夹的为可选包.

基本配置:

hibernate配置文档
hibernate配置有两种配置方式 一种是xml, 一种是properties
以下介绍就是使用的xml
首先在src下创建 hibernate.cfg.xml文件
在第二行加入xml配置规范dtd


下面是基本配置xml样式

<hibernate-configuration>
    <session-factory>
    	
        <property name="connection.url">jdbc:mysql://localhost:3306/database?serverTimezone=UTCproperty>
        
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driverproperty>
        
        <property name="connection.username">rootproperty>
        
        <property name="connection.password">rootproperty>
        
        
        <property name="dialect">org.hibernate.dialect.MySQL8Dialectproperty>
		
		
        <property name="hibernate.hbm2ddl.auto">updateproperty>
		
        <property name="hibernate.show_sql">trueproperty>
    session-factory>
hibernate-configuration>

另外, 许多可选配置都能使用编程式配置

数据模型(实体类)映射配置

映射配置文档

配置好hibernate后, 接下来就可以映射数据库表了
hibernate中实体类有两种配置方式,一种是通过xml配置, 一种是使用注解配置, 以下例子中就使用注解方式配置了.

例如当前数据库有一个Student表

create table Student(
	id int primary key,
	name varchar(20)
)

那么我们需要在创建一个对应的实体类

许多IDE都支持自动创建实体类, 大家可以根据自己的IDE查询相关文档

package com.lliyy.entity;

import javax.persistence.*;

//使用Entity表示这个类为实体类
@Entity
//table指定对应数据库中映射的表
@Table(name = "student")
public class StudentEntity {
     
    //ID表示主键
    @Id
    //Column表示列  如果这个实体类的属性名和数据表中的列名相同  那么可以不用指定name=id
    @Column(name = "id")
    private int id;
    @Column(name = "name")
    private String name;

    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;
    }
}

然后再hibernate.cfg.xml中注册这个实体类
在session-factory项尾部(内)插入

<mapping class="com.lliyy.entity.StudentEntity"/>

这样就成功注册了这个实体类 就可以使用hibernate的api以面向对象的形式操作这个Student数据表了

//这里使用的hibernate配置方式是xml方式,所以获取Configuration对象后还需要调用以下configure方法, 
//如果是properties方式则不需要
Configuration configuration = new Configuration().configure();
SessionFactorysessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
StudentEntity studentEntity = new StudentEntity();
studentEntity.setName("张三");
session.save(studentEntity);
transaction.commit();
session.close();

运行完这个demo后可以发现数据库中多出了一条name为张三的Student数据

抽取Hibernate SessionFactory工具类

SessionFactory是一个重量级单位, 并且是线程安全的, 所以一般项目中都会使用单例设计模式使用.

public class SessionFactoryUtil {
     
    static {
     
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
    }

    private static SessionFactory sessionFactory;
    
    public static Session openSession(){
     
        return sessionFactory.openSession();
    }
}

主键生成策略

已经有前辈写好非常详细的了!

Session

session是与数据库进行交互的对象
与SessionFactory的关系就像线程和线程池的关系, 是线程不安全的,所以一般是在某个线程需要进行数据库交互时才开启.
session有专门的缓存区与快照区
只要是session的api处理过的实体类对象,都会进入缓存中,并在这时储存一份副本在快照区. 在它交互期间如果查询已经存在被缓存过的对象, 那么在对这个对象下次查询时不会真正的与数据库进行交互(类似浏览器缓存)
例如从数据库中查询id为1的Student, 然后在这个Session再次查询Student中id为1的数据,那么将直接返回缓存中id为1的Student.
在对缓存中的对象进行保存操作时, 会把这个对象对比快照区的初始副本, 如果数据一致,那么不会对数据库进行交互,如果不一致, 才会发送更新语句
Hibernate提供了线程绑定Session
大家应该都了解数据库的事务
当我们在hibernate中进行事务操作时, 肯定是需要在同一个Session中进行交互的
所以可以通过sessionFactory.getCurrentSession()获取当前线程的Session,保证在同一线程中,不同代码块下获取到同一个Session对象, 就避免了通过设置全局Session对象或者多层传递Session对象的操作了.
该api的基本实现原理

实体类对象的状态:瞬时态,持久态,托管态的概念

理解这些概念会对许多hibernate的api的操作中理解更加透彻, 而且这个概念也很简单易懂
瞬时态: new 某个实体类(); 这个时候就是还没有被hibernate管理注册过的对象
持久态: 使用hibernate的api调用过的实体类对象, 例如查询到的, new出来后使用session操作过的.
持久态对象(也就是在session中有缓存的对象)会在session close或flush(清除缓存)时自动保存数据到数据库
托管态: 当注册这个对象的Session Close或者flush(清除缓存)后, 那么就会从持久态进入到托管态

表之间的依赖(外键)关系: 一对多, 多对一, 多对多

等待补充…

级联操作

等待补充…

你可能感兴趣的:(Hibernate,Java)