Hibernate快速了解

news/2023/12/1 8:25:00

ORM

全称Object/Relationship Mapping(对象/关系映射)

为何引入ORM

Java、C++等许多语言是面向对象的编程思想,但是底层数据库往往是关系型数据库,为了往数据库中插入数据,需要编写相应的sql语句。比如向一张学生表中插入一条数据(包含学生的基本信息:姓名、年龄、家庭住址等)

insert into students values(1,"张三丰","16","男","1977-4-3","武当山屠龙馆")

timg?image&quality=80&size=b9999_10000&sec=1516013550680&di=7b04427e816e4ba501edaac01d86d6dd&imgtype=0&src=http%3A%2F%2Fimages2015.cnblogs.com%2Fblog%2F760530%2F201510%2F760530-20151007143147018-1799743061.png
这种在程序中大量插入SQL语句的方式有很多弊病,因为对于SQL语句来说,存在以下问题:

  1. 不同数据库使用的SQL语句不同,比如mysql、SQL Server(微软的产品)
  2. 同样的功能,在不同数据库中实现方式不同。因为不同数据库产品封装的不一样

因此,如果程序中写入大量SQL语句,将对程序的移植、维护带来很多麻烦。ORM就是这样诞生的,其目的是让程序员抛弃在程序中直接书写SQL的思想,完全使用面向对象的思想来开发软件。Hibernate就是一种ORM框架

关系数据库:可以简单的理解为二维数据库。复杂来说,是指采用了关系模型来组织数据的数据库(关系模型是1970年由IBM研究员E.F.Codd博士首先提出的,并逐渐发展为数据库架构的主流模型),一般而言,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表格和它们之间的联系组成的一个数据组织

题外话: 经常看到除了关系型数据库,还有一种非关系型数据库,其实这是一种误解。其英文为:NoSQL(全称:Not Only SQL),所以叫它不仅仅是SQL或者超关系型数据库都行,不知道为什么就翻译成了非关系型数据库。毕竟这个“非”字导致了很多理解困难

Hibernate

Hibernate是Java领域的一款开源ORM框架技术,对JDBC进行了轻量级的对象封装
timg?image&quality=80&size=b9999_10000&sec=1516013653575&di=2ebf9c9780b60ceb14be0bde3f43f21f&imgtype=jpg&src=http%3A%2F%2Fimg2.imgtn.bdimg.com%2Fit%2Fu%3D3627080182%2C4064784388%26fm%3D214%26gp%3D0.jpg

执行流程

timg?image&quality=80&size=b9999_10000&sec=1516014572802&di=84e22c87720d63175ef3a9fc229df03e&imgtype=0&src=http%3A%2F%2Fstatic9.photo.sina.com.cn%2Fbmiddle%2F51721d974511e2bdb3378

Session(会话)

不建议直接使用jdbc的connection来操作数据库,而是使用session,可以简单认为,session就是操作数据库的对象。
要想把数据保存在关系型数据库中,需要调用session的各种方法,如:save()、update()等

如何获取session对象

通常有两种方法,这两种方法都是sessionFactory中的
1) openSession
2) getCurrentSession
如果使用getCurrentSession,需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<propertyname = "hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<propertyname = "hibernate.current_session_context_class">jta</property>

openSession和getCurrentSession

  1. getCurrentSession在事务提交或者回滚之后会自动关闭;而openSession需要手动关闭,如果未进行手动关闭,多次之后会导致连接池溢出
  2. openSession每次都会创建新的session对象,getCurrentSession则使用先用的session对象

session操作

hibernate会把符合条件的数据寄存到内存上,那么也就存在一个对内存的管理,而session是有一级缓存(强制默认开启),其目的是为了减少查询数据库的时间,提高效率,一级缓存的生命周期和session是一样的。session.flush()和session.clear()就是针对session的一级缓存的处理。
简单来说:

  • session.flush()的作用就是将session缓存(在内存里)中的数据与数据库同步。
  • session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)
  • session.evict(obj)的作用就是将指定的obj缓存对象进行清除

Flush方法

可以通过flush方法强制进行从内存到数据库的同步,主要分为了两步:清理缓存,执行SQL。例如:

public void testFlush(){  
    Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
    session.beginTransaction();  
    Teacher t = (Teacher) session.get(Teacher.class, 3);  
    t.setName("yyy");  
    session.flush();//有flush会执行2次UPDAE,没有会只执行一次  
    t.setName("yyyyy");  
    session.getTransaction().commit();  
}  

Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的,在session.beginTransaction 代码前设置 FlushMode

session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL);

这里 FlushMode 有 5 个值可选:

  1. Always: 任何代码都会 Flush
  2. AUTO: 默认方式 – 自动
  3. Commit: COMMIT 时
  4. Never: 始终不
  5. MANUAL: 手动方式

设置 FlushMode 有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。

注意:执行完session.flush()时,并不意味着数据就肯定持久化到数据库中的,因为事务控制着数据库,如果事务提交失败了,缓存中的数据还是照样会被回滚的。

transaction(事务)

hibernate对数据的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以对session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
如果想让hibernate像JDBC那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置为自动提交事务模式(注意:通常不推荐这么做)


http://www.niftyadmin.cn/n/3268828.html

相关文章

1月15日学习内容整理:存储库MongoDB之基本的增删改查操作

一、数据库操作 注意&#xff1a;show dbs时空数据库是不会显示在数据库列表中的&#xff0c;只要插入数据就会显示出来 #1、增 use config #如果数据库不存在&#xff0c;则创建数据库&#xff0c;否则切换到指定数据库。#2、查 show dbs #查看所有 可以看到&#xff0c;我们刚…

phalcon 一些简单的记录

为什么80%的码农都做不了架构师&#xff1f;>>> 查询活动表中有 sid 记录的用户有多少个 $onlineUser PrizeLogs::count("sid ".$sid);查询单个对象 Users::findFirst(["conditions">user_id .$userId]);不可添加 ->toArray(),否则会…

re.S、 re.M

re.S是代表.可以匹配\n以及“ re.M是多行codeimport re a asdfsafhellopass:234455worldafdsf b re.findall(hello(.*?)world,a) c re.findall(hello(.*?)world,a,re.S | re.M) print b is , b print c is , c打印结果b is []c is [pass:\n 234455"\n aaa\n aawaw…

数据结构与算法之复杂度三步走

1、大O记法 计算机怎么判断程序性能&#xff1f; 我们都知道&#xff0c;编程基本上是在和数据打交道&#xff0c;大多数程序基本都在处理获取数据、查询数据、操作数据、返回数据相关的逻辑 因此出现了数据结构和算法&#xff0c;这两者出现本质为了解决如何能够更快、更省…

整理Java基础知识--Calendar 类

Java Calendar类Calendar 类是 abstract 类 实际使用时实现特定的子类对象 创建一个代表当前日期的Calendar 对象Calendar ss Calendar.getInstance();Calendar 类对象字段类型 常量描述Calendar.YEAR年Calendar.MONTH月Calendar.DATE日Calendar.DAY_OF_MONTH日期Calendar.HOU…

算法性能优化之二分法与二次问题

性能优化小案例 1、二分法查找 有序数组查找 有序数组是什么&#xff1f; 如果一个数组中的值是按一定顺序排列的&#xff0c;我们就称为有序数组 例如&#xff1a;数组 [2, 8, 15, 24, 66, 88, 100] 现在希望完成一个函数来实现&#xff1a;查找某个数字是否存在数组中。例…

dig(域信息搜索器)命令

dig命令 dig命令是常用的域名查询工具&#xff0c;可以用来测试域名系统工作是否正常。 语法 dig(选项)(参数) 选项 <服务器地址>&#xff1a;指定进行域名解析的域名服务器&#xff1b; -b<ip地址>&#xff1a;当主机具有多个IP地址&#xff0c;指定使用本机的哪个…

软件测试工程师进阶之路|分析测试现状、测试知识、测试思想

注&#xff1a;本文来源&#xff1a; 方水泉 《 软件测试工程师进阶之路&#xff5c;分析测试现状、测试知识、测试思想 》目前&#xff0c;很多机构天天吹嘘测试多么好&#xff0c;工资多么高&#xff0c;但从我多年的从业经历来看&#xff0c;测试这条路的瓶颈非常大&…

四步轻松掌握数组基本操作

小橘子学数组1、计算机内存管理2、数组的存储和读取3、数组的插入和删除4、总结1、计算机内存管理 我们每天都在面对着如电脑、手机等电子产品&#xff0c;每一台电子设备都有自己的内存大小&#xff0c;如&#xff1a;64G、256G、512G甚至更多 内存到底有什么作用呢&#xf…

Linux批量管理工具Ansible

Ansible-批量linux管理工具&#xff1a;https://github.com/ansible/ansible Ansible有如下优点&#xff1a; 1、轻量级&#xff0c;他不需要去客户端安装agent&#xff0c;更新时&#xff0c;只需要在操作机上进行一次更新即可 2、批量任务执行可以写成脚本&#xff0c;而且不…

轻松拿下冒泡排序与选择排序

轻松拿下冒泡排序与选择排序&#xff01;&#xff01;&#xff01;1、冒泡排序2、选择排序1、冒泡排序 一个数组如何编程有序数组呢&#xff1f; 需要排序算法 冒泡排序是最基础&#xff0c;最经典的排序算法&#xff0c;为什么叫作冒泡呢&#xff1f; 冒泡&#xff1a;水里有…

[译]Pandas常用命令对照清单

我们在内容中使用以下简写&#xff1a;df pandas的DataFrame对象s pandas的Series对象导入以下包开始import pandas as pdimport numpy as np导入数据 pd.read_csv(filename) 从csv导入 pd.read_table(filename) 从分隔的文本文件导入 pd.read_excel(filename) 从excel文件导入…

轻松拿下插入排序

轻松拿下插入排序&#xff01;&#xff01;&#xff01;1、插入排序2、优化插入排序 - 二分插入排序1、插入排序 什么是插入排序&#xff1f; 重点在插入&#xff0c;每次抽离一个元素当作临时元素&#xff0c;依次比较和移动之后 核心规则&#xff1a; 在第一轮&#xff0c;…

利用 Django admin 完成更多任务(转)

利用 Django admin 完成更多任务 Django admin Django 为未来的开发人员提供了许多功能&#xff1a;一个成熟的标准库&#xff0c;一个活跃的用户社区&#xff0c;以及 Python 语言的所有好处。虽然其他 Web 框架也声称能提供同样的内容&#xff0c;但 Django 的独特之处在于它…

轻松理解递归的基本思想

轻松理解递归思想&#xff01;&#xff01;&#xff01;1、递归相关概念2、递归的实现1、递归相关概念 我们先来看一个耳熟能详的故事&#xff1a; 从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事&#xff0c;故事的内容是&#…

轻松拿下快速排序

快速排序&#xff01;拿下&#xff01;&#xff01;&#xff01;快速排序是现在编程语言自带排序函数中&#xff0c;使用的最多的算法 例如常见的&#xff1a;List.sort() 同时&#xff0c;也是面试最喜欢面试的排序算法&#xff0c;没有之一 实现的原理、复杂度都有一定的难度…
最新文章