大家好,我是IT修真院郑州分院第8期学员,一枚正直善良的java程序员。今天给大家分享一下,修真院官网 java任务中可能会使用到的知识点:
浅谈hibernate
width="640" height="498" src="https://v.qq.com/iframe/player.html?vid=i07281zfbnl&tiny=0&auto=0" allowfullscreen="">
【修真院java小课堂】浅谈hibernate20180719
1.背景介绍
- 2001年,澳大利亚墨尔本一位名为Gavin King的27岁的程序员,上街买了一本SQL编程的书,他厌倦了实体bean,认为自己可以开发出一个符合 对象关系映射 理论,并且真正好用的Java持久化层框架,因此他需要先学习一下SQL。这一年的11月,Hibernate的第一个版本发布了.
- 持久化层框架
2.知识剖析
2.1 Hibernate是什么?能做什么?
- Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
2.2 核心API
Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
Session:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
- SessionFactory:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
- Transaction:Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
- Query:Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
- Criteria:Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
- Configuration:Configuration 类的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
3.常见问题
3.1 缓存
- 一级缓存(session级别),缓存只停留在这个session中,如果session关闭或者其他session需要这些数据,都是不能从缓存中取出来的
- 二级缓存(sessionFactory级别),就算某个session(第一次需要去数据库查数据的session)关闭了,仍旧不影响缓存中数据的取用
- 一级缓存默认开启,二级缓存需要配置以及第三方支持
3.2 Session
Hibernate有两种方式获得session,分别是:openSession和getCurrentSession
- 获取的是否是同一个session对象
- 事务提交的必要性
获取的是否是同一个session对象
- openSession每次都会得到一个新的Session对象
- getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象
事务提交的必要性
- openSession只有在增加,删除,修改的时候需要事务,查询时不需要的
- getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭
4.编码实战
- 缓存对比
- Session对比
- 语句对比
- 具体见视频
5.扩展思考
5.1 应用场景
- 对于数据量大,性能要求高系统,不太使用hiberante。主要用于事务操作比较多的项目OA/某个行业软件(石油、税务、crm, 财务系统。)
6.参考文献
https://baike.baidu.com/item/Hibernate/206989?fr=aladdin
http://how2j.cn/k/hibernate/hibernate-tutorial/31.html
7.更多讨论
Q:Hibernate可以用的二级缓存有哪些?
A:目前了解到的有encache、redis、memcache
Q:HQL与SQL区别?
A:HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句。HQL 查询语句中的主体是域模型中的类及类的属性。
SQL 查询语句是与关系数据库绑定在一起的。SQL 查询语句中的主体是数据库表及表的字段。
Q:事务有什么特性?
A:比较关键的一个是原子性,是指事务包含的所有操作要么全部成功,要么全部失败回滚