Hibernate执行流程分析及配置文详解

目录

1、Hibernate执行流程分析及配置文件详解

1)Configuration对象

2)ServiceRegistry对象(hibernate4的新特性)

3)SessionFactory对象

4)Session对象

5)Transaction对象

6)hibernate.cfg.xml配置详解

7)Student.hbm.xml配置详解

2、抽取HibernateUtils工具类

3、Session的常用方法详解(CRUD案例)


1、Hibernate执行流程分析及配置文件详解

Hibernate核心的API详解:

1)Configuration对象

Configuration类负责管理Hibernate的配置信息。包括如下内容:

    1)Hibernate运行的底层信息:

       数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。

    2)持久化类与数据表的映射关系(*.hbm.xml 文件)

创建Configuration 的两种方式:

    属性文件(hibernate.properties):

        Configuration cfg = new Configuration();

    Xml文件(hibernate.cfg.xml)(推荐使用)

         Configuration cfg = new Configuration().configure();

2)ServiceRegistry对象(hibernate4的新特性)

ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制.

3)SessionFactory对象

1)Configuration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。

      Configuration cfg = new Configuration().configure();

      SessionFactory sf = cfg.buildSessionFactory();

2SessionFactory是线程安全的。

3)SessionFactory是生成Session的工厂:

       Session session = sf.openSession();

4)构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象

4)Session对象

1)Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。

2)持久化类与 Session 关联起来后就具有了持久化的能力。

3)是线程不安全的

4Session 类的方法:

     取得持久化对象的方法: get() load()

     持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()

     开启事务: beginTransaction().

     管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()

5)Transaction对象

1)代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。

   Transaction tx = session.beginTransaction();

2)常用方法:

commit():提交相关联的session实例

rollback():撤销事务操作

6)hibernate.cfg.xml配置详解

<hibernate-configuration>

<session-factory>

   <!-- 数据库连接配置 -->

   <property name="hibernate.connection.driver_class">

      com.mysql.jdbc.Driver

   </property>

   <property name="hibernate.connection.url">

      jdbc:mysql://localhost:3306/day14?useUnicode=true&amp;characterEncoding=utf-8

   </property>

   <property name="hibernate.connection.username">root</property>

   <property name="hibernate.connection.password">root</property>

   <!-- 数据库方言 -->

   <property name="hibernate.dialect">

      org.hibernate.dialect.MySQL5InnoDBDialect

   </property>

   <!-- 显示执行的sql语句 -->

   <property name="hibernate.show_sql">true</property>

   <!-- 格式化sql语句 -->

   <property name="hibernate.format_sql">true</property>

   <!-- hibernate自动维护表 -->

   <property name="hibernate.hbm2ddl.auto">update</property>

   <!-- 对象关系映射的配置 -->

   <mapping resource="gz/itcast/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

7)Student.hbm.xml配置详解

       

2、抽取HibernateUtils工具类

public class HibernateUtils {

   private static SessionFactory sessionFactory = null;

  

   static{

      Configuration config =

             new Configuration().configure();

      StandardServiceRegistry serviceRegistry

                = new StandardServiceRegistryBuilder()

             .applySettings(config.getProperties())

             .build();

      sessionFactory = config.buildSessionFactory(serviceRegistry);

   }

  

   public static Session getSession(){

      return sessionFactory.openSession();

   }

}

3、Session的常用方法详解(CRUD案例)

//演示CURD

public class Demo {

   //添加

   @Test

   public void testInsert(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

          Student s = new Student();

          s.setId(3);

          s.setName("王五");

          s.setGender("");

          s.setAge(18);

         

          session.save(s);

        

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

          session.close();

      }

   }

   //更新

   @Test

   public void testUpdate(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

         

          Student s = new Student();

          s.setId(3);

          s.setName("陈六");

          s.setGender("");

          s.setAge(28);

         

          session.update(s);

         

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

         session.close();

      }

   }

   //删除

   @Test

   public void testDelete(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

         

          Student s = new Student();

          s.setId(3);

         

          session.delete(s);

         

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

          session.close();

      }

   }

   //查询

   @Test

   public void testQuery(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

         

          Student s = (Student)session.get(Student.class, 2);

          System.out.println(s);

         

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

          session.close();

      }

   }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/592182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

缓冲流,BufferReader,BufferWriter,案例

IO流的体系 字节缓冲流的作用 提高字节流读取数据的性能 *原理&#xff1a;字节缓冲输入流自带了8Kb的缓冲池&#xff0c;字节缓冲输出流也自带了8kb的缓冲池 构造器说明public BufferedInputStream(InputStream is)把低级的字节输入流包装成一个高级的缓冲字节输入流&#…

对链表进行插入排序(详细解析)

对链表进行插入排序&#xff08;详解&#xff09; 题目&#xff1a; 对链表进行插入排序 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&a…

特斯拉FSD落地分析

再续前缘 媒体的神经从马斯克的湾流私人飞机起飞那一刻开始,就开始被牵动着。28/4 号的突然访华,在大多数人看来其实已经早已是计划之中,从摆在台面上的消息来看,主要目的是为了在大陆推广FSD的落地,也为8月份FSD 的正式版本做预热,和中国上海的第一次联姻造就了特斯拉m…

17 内核开发-内核内部内联汇编学习

​ 17 内核开发-内核内部内联汇编学习 课程简介&#xff1a; Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础&#xff0c;让他们能够理解和参与到Linux内核的开发过程中…

【Linux】进程exec函数族以及守护进程

一.exec函数族 1.exec函数族的应用 在shell下敲shell的命令都是在创建shell的子进程。而我们之前学的创建父进程和子进程代码内容以及通过pid与0的关系来让父子进程执行不同的代码内容都是在一个代码文件里面&#xff0c;而shell是如何做到不在一个文件里面写代码使之成为子进…

06|LangChain | 从入门到实战 -六大组件之Agent

点点赞~ 注意&#xff1a;langchain的版本迭代比较快&#xff0c;社区维护&#xff0c;代码当中或许部分方法在某个版本不再支持 01&#xff5c;LangChain | 从入门到实战-介绍 02&#xff5c;LangChain | 从入门到实战 -六大组件之Models IO 03&#xff5c;LangChain | 从入…

asp.net结课作业中遇到的问题解决2

目录 1、如何实现评论交流的界面 2、如果想要将文字添加到数据库中&#xff0c;而不是乱码&#xff0c;该怎么修改 3、如果想要添加的数据已经存在于数据库&#xff0c;就不允许添加了&#xff0c;该如何实现 4、想要实现某个模块下有好几个小的功能该如何实现 5、想要实现…

代码随想录算法训练营第25天 | 216.组合总和III、17.电话号码的字母组合

代码随想录算法训练营第25天 | 216.组合总和III、17.电话号码的字母组合 自己看到题目的第一想法看完代码随想录之后的想法 链接: 216.组合总和III 链接: 17.电话号码的字母组合 自己看到题目的第一想法 216.组合总和III&#xff1a;递归函数终止条件为搜索得到的数相加为n&…

【架构系列】RabbitMQ应用场景及在实际项目中如何搭建可靠的RabbitMQ架构体系

作者:后端小肥肠 创作不易&#xff0c;未经允许禁止转载。 1. 前言 RabbitMQ&#xff0c;作为一款高性能、可靠的消息队列软件&#xff0c;已经成为许多企业和开发团队的首选之一。它的灵活性和可扩展性使得它适用于各种应用场景&#xff0c;从简单的任务队列到复杂的分布式系统…

阿里低代码引擎学习记录

官网 一、关于设计器 1、从设计器入手进行低代码开发 设计器就是我们用拖拉拽的方法&#xff0c;配合少量代码进行页面或者应用开发的在线工具。 阿里官方提供了以下八个不同类型的设计器Demo&#xff1a; 综合场景Demo&#xff08;各项能力相对完整&#xff0c;使用Fusion…

【前端项目——分页器】手写分页器实现(JS / React)

组件介绍 用了两种方式实现&#xff0c;注释详细~ 可能代码写的不够简洁&#xff0c;见谅&#x1f641; 1. 包含内容显示的分页器 网上看了很多实现&#xff0c;很多只有分页器部分&#xff0c;没和内容显示联动。 因此我增加了模拟content的显示&#xff0c;这里模拟了32条数…

Python数据分析案例44——基于模态分解和深度学习的电负荷量预测(VMD+BiGRU+注意力)

案例背景 承接之前的案例&#xff0c;说要做模态分解加神经网络的模型的&#xff0c;前面纯神经网络的缝合模型参考数据分析案例41和数据分析案例42。 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领域过来的小白来问…

Monorepo(单体仓库)与MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

&#x1f31f; 引言 在软件开发的浩瀚宇宙里&#xff0c;选择合适的代码管理方式是构建高效开发环境的关键一步。今天&#xff0c;我们将深入探讨两大策略——Monorepo&#xff08;单体仓库&#xff09;与MultiRepo&#xff08;多仓库&#xff09;&#xff0c;并通过使用现代化…

Vue3 + Vite + TypeScript + Element-Plus创建管理系统项目

官方文档 Vue3官网 Vite官方中文文档 创建项目 使用npm命令创建项目&#xff1a; npm create vitelatest输入项目名称&#xff1a; ? Project name:项目名选择vue&#xff1a; ? Select a framework: - Use arrow-keys. Return to submit.Vanilla > VueReactPrea…

【网站项目】木里风景文化管理平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

CSS精灵图、字体图标、HTML5新增属性、界面样式和网站 favicon 图标

精灵图 为什么要使用精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度,因此&#xff0c;为了有效地减少服务…

JAVA基础|常用API-JDK8之前传统的日期,时间

一. Date &#xff08;一&#xff09;说明 代表的是日期和时间 &#xff08;二&#xff09;常用的用法 构造器说明public Date()创建一个Date对象&#xff0c;代表的是系统当前此刻日期时间public Date(long time)把时间毫秒值转换成Date日期对象 常见方法说明public long …

算法提高之潜水员

算法提高之潜水员 核心思想&#xff1a;二维01背包 两个容量v1v2注意状态计算时j和p可以<各自的v #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1010,M 80,K 22;int f[K][M];int k,V1,V2;int main(){ci…

FloodFill-----洪水灌溉算法(DFS例题详解)

目录 一.图像渲染&#xff1a; 代码详解&#xff1a; 二.岛屿数量&#xff1a; 代码详解&#xff1a; 三.岛屿的最大面积&#xff1a; 代码详解&#xff1a; 四.被围绕的区域&#xff1a; 代码详解&#xff1a; 五.太平洋大西洋水流问题&#xff1a; 代码详解&#x…

锂电池充放电方式曲线

作为一种“化学能-电能”相互转换的能量装置&#xff0c;锂电池在使用过程中必然会进行充电和放电&#xff0c;合理的充放电方式既能减轻锂电池的损伤程度&#xff0c;又能充分发挥锂电池的性能&#xff0c;具有重要的应用价值。 如《GB/T 31484-2015&#xff1a;电动汽车用动…