Hibernate之Hibernate-api详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate之Hibernate-api详解相关的知识,希望对你有一定的参考价值。

一、Hibernate体系结构

  技术分享

二、Hibernate-api详解

  2.1、Configuration配置对象

    Configuration是用来加载配置文件的

   我们Hibernate中主要有两个配置文件,第一个是核心的配置文件,第二个是映射文件。

    技术分享

  2.2、SessionFactory工厂

    SessionFactory 相当于java web连接池,用于管理所有session
    获得方式:config.buildSessionFactory();
    sessionFactory hibernate缓存配置信息 (数据库配置信息、映射文件,预定义HQL语句 等)
    SessionFactory线程安全,可以是成员变量,多个线程同时访问时,不会出现线程并发访问问题。

    技术分享

    SessionFactory与连接池的区别

      技术分享

    getCurrentSession()方法

    技术分享

 

  2.3、session对象

    用来操作数据库的。Sesion相当于JDBC中的Connection。我们通过session操作PO对象实现增删改查。

    2.3.1、增

      技术分享

    2.3.2、改  

      技术分享

    2.3.3、删

      技术分享

    2.3.4、查

      A.使用session中的get方法查询

      技术分享

    结果:技术分享

    B.使用session中的load方法

      load方法.返回一个代理对象,获得其内容时,会查询数据库,是每次访问属性都会查询数据库吗?

        答:不是每次都查.代理对象中有一个标识是否被初始化的boolean型变量. 记录是否被初始化过. 

      代理都是要基于接口的,用load方法返回的代理,就没有实现任何接口? 

        答:java中的动态代理是基于接口. 而 Hibernate 是使用javassist-3.12.0.GA.jar 产生代理对象的.

           该代理与被代理对象之间的关系是继承关系.与我们学的动态代理不是一种.所以不需要接口.

    技术分享

    出现bug:技术分享

    分析:get和load的执行原理

      技术分享

    C.使用HQL语言查询数据库中表的所有记录

    技术分享

    D.使用Criteria查询所有数据库

    技术分享

    E.使用原生的SQL语句查询

    技术分享

    2.3.5、总结

    在增删改查中我们学习的方法有    

     session.save();
     session.update();
     session.delete();
     session.get();
     session.load(); 对比get
     session.createQuery();
     session.createCritieria();
     session.createSqlQuery();

  2.4、Transaction对象

      Transaction封装了事务的操作

       一般事务的操作中有:

          开启事务  beginTransaction()

          获得事务  getTransaction()

          提交事务  commit()

          回滚事务  rollback()

      技术分享

    细节处理

      技术分享

          从这里中我们使用getCurrentSession()方法获得一个事务,当你没有关闭这个事务的时候,

          当你再次获取事务,它们属于同一个事务。

  2.5、Query对象

    Query对象封装了HQL语句对象,且封装了查询的细节

    技术分享

  2.6、Criteria对象(了解)

    技术分享

    使用like查找

      技术分享

    一些基本的查询条件查询

    技术分享

  2.7、工具类

    我们知道在使用hibernate进行增删改查的时候都要获取到session,这导致代码的重用性很强,所以我们可以

    创建一个工具类去解决这个问题。   

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

//完成Hibernate工具类
//封装配置文件读取操作
//封装Sessionfactroy创建操作
//封装session获得操作
public class HibernateUtils {

    private static SessionFactory sf;
    
    static{
        //1加载配置
        Configuration  conf = new Configuration().configure();
        //2 根据Configuration 配置信息创建 SessionFactory
        sf = conf.buildSessionFactory();
        //
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            
            @Override
            public void run() {
                System.out.println("虚拟机关闭!释放资源");
                sf.close();
            }
        }));
        
    }
    
    public static org.hibernate.Session  openSession(){
                
                //3 获得session
                Session session = sf.openSession();
                
                return session;
    }
    
    public static org.hibernate.Session  getCurrentSession(){
        //3 获得session
        Session session = sf.getCurrentSession();
        
        return session;
    }
    
}

 

    

    

 

  

     

        

 

  

 

   

 

        

 











以上是关于Hibernate之Hibernate-api详解的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 表关系映射详解之继承关系

hibernate 表关系映射详解之一对多

JAVAWEB开发之Hibernate详解——Hibernate的框架概述开发流程CURD操作和核心配置与API以及Hibernate日志的使用

hibernate 表关系映射详解之一对一

大家一起撸代码之——Hibernate各种主键生成策略与配置详解

hibernate 表关系映射详解之多对多