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

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

有关PPT来自鲁东大学信息与电气工程学院软件工程系孙丽老师

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

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{
            Teacher teacher = session.load(Teacher.class, 2);//反射机制
            System.out.println(teacher);
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
    @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();
        }
    }
    @Test
    public void testPersist(){
        // 1. 获取session对象
        Session session = HbnUtils.getSession();
        try{
            // 2. 开启事务
            session.beginTransaction();
            // 3. 执行CRUD操作
            Teacher t = new Teacher("taotaotao","学士");
            session.persist(t);
            // 4. 提交事务
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            // 5. 回滚
            session.getTransaction().rollback();
        }
    }
    @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();
        }
    }

}

未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。

依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值