2021-5-14hibernate核心开发接口(API)

Posted PushyTao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-5-14hibernate核心开发接口(API)相关的知识,希望对你有一定的参考价值。

有关hibernate核心开发接口API的内容将在本篇博客中详细更新

项目结构:
在这里插入图片描述

0. hibernate应用程序体系结构视图

在这里插入图片描述

1. Hibernate 核心接口API

hibernate核心接口有:

  1. Configuration
  2. SessionFactory
  3. Session
  4. Transaction
  5. Query
  6. Criteria

再导入包之后:
在这里插入图片描述
大致的用法如下:
在这里插入图片描述

① Configuration接口

Configuration 接口负责管理Hibernate 的配置信息。它包括如下内容:
※ Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。
※ Hibernate映射文件(*.hbm.xml)。
Hibernate配置的两种方法:
※ 方法1:属性文件(Hibernate.properties)。
调用代码:Configuration config = new Configuration();
※ 方法2:Xml文件(Hibernate.cfg.xml)。
调用代码:Configuration config = new Configuration().configure();
总结:
ppt截图

② SessionFactory接口

※ 创建SessionFactory

Configuration config=new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();

※ SessionFactory接口
• 重量级对象,系统开销大。
• 用来产生和管理Session:应用程序从SessionFactory(会话工厂)里获得
Session(会话)实例。
• 通常情况下每个应用只需要一个SessionFactory(单例)
• 除非要访问多个数据库的情况
• 关注两个方法即:openSessiongetCurrentsession

  • openSession 每次都是新的,需要close
  • getCurrentsession 从上下文找,如果有,用旧的,如果没有,建新的

③ Session接口

概述

SessionHibernate持久化操作的基础,与Web层的HttpSession没什么关系。
Hibernate Session相当于JDBC Connection
Session接口是应用程序与hibernate连接的核心API
Session 对象是轻量级的,每次实例化都需要与数据库交互。
• 管理一个数据库的任务单元(增 删 改 查

session对象的获取

a. 获取方式(两种):

方法1:

Session session = sessionFactory.openSession();//创建一个新的session对象

方法2:

Session session = sessionFactory.getCurrentSession();//获取当前线程中的session对象

对于getCurrentSession() :
在这里插入图片描述

b. 两种方法的比较

在这里插入图片描述
SessionFactory() 是单例模式,即每次只有一个实例

session中的常用方法

CURD(增删查改)

CURD即:
C = create, U = update,R = retrieve检索数据,D = delete
使用到的方法如下:
save()/persist():添加对象
delete():删除对象
update():修改对象
saveOrUpdate():添加或修改对象
load()/get():根据主键查询
clear()
flush()

CURD-定义工具类
提取共享代码

在这里插入图片描述
在这里插入图片描述
代码:

import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class CoreAPITest {

    public void testTeacherSave(){
        Teacher t = new Teacher();
        t.setName("wuyt");
        t.setTitle("student");
        //1 读取hibernate配置文件hibernate.cfg.xml
        Configuration cfg = new Configuration().configure();
        //2 创建session工厂,session不是会话,而是一个数据库连接对象conn
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //3 获取一个链接session
        Session currentSession = sessionFactory.getCurrentSession();
        //4 事务处理
        Transaction transaction = currentSession.beginTransaction();
        //5 插入数据
        currentSession.save(t);
        //6 提交
        transaction.commit();
    }
}

创建HbnUtils工具类

在这里插入图片描述

package cn.edu.ldu.Utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HbnUtils {
    static SessionFactory sessionFactory = null;
    /*public static void main(String[] args) {
        Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
        SessionFactory sf = cfg.buildSessionFactory();
        Session session = sf.openSession();

        ///事务处理
        Transaction trans = session.beginTransaction();
    }*/
    //单例模式SessionFactory,每次只有一个实例
    //静态方法,一加载就执行
    public static SessionFactory getSessionFactory(){
        if(sessionFactory == null || sessionFactory.isClosed())
        {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        }
        return sessionFactory;
    }

    public static Session getSession(){
        Session currentSession = getSessionFactory().getCurrentSession();
        return currentSession;
    }
    /*
    静态方法,静态变量

     */
}

类、表结构

数据库中 teacher表:
在这里插入图片描述
teacher类:

package cn.edu.ldu.entity;

import javax.persistence.*;

@Entity // 实体类,类和表有映射关系的类
@Table // 说明类和表的名称是相同的(name="my_teacher")
public class Teacher {
    private int id;
    ///private String id;
    private String name;
    private String title;
    public Teacher(){}
    public Teacher(String n,String t){
        this.name = n;
        this.title = t;
    }
    /*    主键的生成方式*/
    @Id  /*定义主键*/
    @GeneratedValue(strategy=GenerationType.IDENTITY)// AUTO
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    //@Column(name = "name",length = 255)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", title='" + title + '\\'' +
                '}';
    }
}

CURD增删改的实现
save()
  1. 原始写法
    在这里插入图片描述
    代码大致为:
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class CoreAPITest {

    public void testTeacherSave(){
        Teacher t = new Teacher();
        t.setName("wuyt");
        t.setTitle("student");
        //1. 读取hibernate配置文件hibernate.cfg.xml
        Configuration cfg = new Configuration().configure();
        //2. 创建session工厂,session不是会话,而是一个数据库连接对象conn
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //3. 获取一个链接session
        Session currentSession = sessionFactory.getCurrentSession();
        //4. 事务处理
        Transaction transaction = currentSession.beginTransaction();
        //5. 插入数据
        currentSession.save(t);
        //6. 提交
        transaction.commit();
    }
}

  1. 提取工具类写法
    在这里插入图片描述
    代码:
import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;

public class CRUDTest {
    @Test
    public void testSave(){
        // 1. 获取session对象
        Session session = HbnUtils.getSession();
        try{
            // 2. 开启事务
            session.beginTransaction();
            // 3. 执行CRUD操作
            Teacher t = new Teacher("wuyt","学生");
            session.save(t);
            // 4. 提交事务
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            // 5. 回滚
            session.getTransaction().rollback();
        }
    }
}

初始时:
在这里插入图片描述
在执行完代码后:

在这里插入图片描述
类对象保存成功!

persist()

persist()JPA的接口,不是 hibernate提供的方法
该方法可以用来插入
在这里插入图片描述
在这里插入图片描述
插入之后的结果:
在这里插入图片描述

delete()

在这里插入图片描述
答案是不能删除一条记录
在根据主键的值来进行删除的情况下,从内存中申请了一个Teacher对象并指定nametitle,该写法并没有指定id 所以说是不能够进行删除的

session.delete() 根据主键id删除。
t.setId(9) 确定删除id=9的记录,且此记录存在。
id 若不存在,程序无法删除!(删除的前提基础就是该对象要存在)
下面来进行正确的删除操作

(以删除id为8的为例)
删除之后的结果:
在这里插入图片描述
代码:

import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;

public class CRUDTest {
    @Test
    public void testDelete(){
        // 1. 获取session对象
        Session session = HbnUtils.getSession();
        try{
            // 2. 开启事务
            session.beginTransaction();
            // 3. 执行CRUD操作
            Teacher t = new Teacher();
            t.setId(8);
            session.delete(t);
            // 4. 提交事务
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            // 5. 回滚
            session.getTransaction().rollback();
        }
    }

}

update()

为了更新指定的一条记录,记录要保证唯一,那么就根据主键来进行确定
所以和删除操作类似,一定要指定记录的 id
假如以更新id 为1的记录为例:

代码:

import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;

public class CRUDTest {
    @Test
   public void testUpdate(){
        Session session = HbnUtils.getSession();
        try{
            session.beginTransaction();
            Teacher t = new Teacher("徐攀","啥也不是");
            t.setId(1);
            session.update(t);//之前那开启事务处理
            session.getTransaction().commit();
        }catch (Exception  e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
}

在这里插入图片描述
就这样,一号记录徐攀普林斯顿大学博士变成了啥也不是

根据id 查询get()

在这里插入图片描述
重写 toString() 的代码已经在前面贴过了,这里再cv一发

@Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", title='" + title + '\\'' +
                '}';
    }

要注意,get()返回的是一个 Teacher 对象,在使用的过程中,第二个参数是id
执行结果:
在这里插入图片描述
代码:

import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;

public class CRUDTest {
    @Test
    public void testGet(){
        Session session = HbnUtils.getSession();
        session.beginTransaction();
        // 通过id查询一条记录
        try{
            Teacher teacher = session.get(Teacher.class, 2);//反射机制
            System.out.println(teacher);
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
}

根据id查询 load()

我们按照同样的方式将get改成load 之后可以发现:
在这里插入图片描述
结果是一样的

get()load() 区别

load 是一种延迟加载
注释掉输出语句之后可以发现
get() :
在这里插入图片描述

load() :
在这里插入图片描述
get()hibernate 输出,但是load 没有
这说明:
get() 直接从数据库加载,立即执行,不会延迟;
load() 等到真正用到对象的内容时才发出sql语句,称之延迟加载。

在这里插入图片描述
截至目前,CURDTest类的全部内容如下:

import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;

public class CRUDTest {
    @Test
   public void testUpdate(){
        Session session = HbnUtils.getSession();
        try{
            session.beginTransaction();
            Teacher t = new Teacher("徐攀","啥也不是");
            t.setId(1);
            session.update(t);//之前那开启事务处理
            session.getTransaction().commit();
        }catch (Exception  e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
    @Test
    public void testGet(){
        Session session = HbnUtils.getSession();
        session.beginTransaction();
        // 通过id查询一条记录
        try{
            Teacher teacher = session.get(Teacher.class, 2);//反射机制
            System.out.println(teacher);
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
    @Test
    public void testLoad(){
        Session session = HbnUtils.getSession();
        session.beginTransaction();
        // 通过id查询一条记录
        try{以上是关于2021-5-14hibernate核心开发接口(API)的主要内容,如果未能解决你的问题,请参考以下文章

核心开发接口介绍

SSHHibernate:核心类和接口

Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration

Hibernate的核心接口

Hibernate的核心接口

Hibernate 核心接口和工作机制