Hibernate是一种ORM框架,全称为Object Relative-Database Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象。
关于映射Java对象和关系数据库之间的联系的话,传统上在MVC中的数据持久层->编写程序中的DAO层实现:
1. 在DAO层操作XML,将数据封装到XML文件上,读写XML文件数据实现CRUD
2. 在DAO层使用原生JDBC连接数据库,实现CRUD
3. 使用DbUtils组件封装JDBC
当插入数据的时候,将JavaBean对象拆分,拼装成SQL对象
当查询数据的时候,用SQL把数据库表中的列组合,拼装成JavaBean对象
也就是说,JavaBean对象和数据表中的列存在映射关系。如果程序能自动生成SQL语句,就会很大程度简化开发。
一些概念:
DAO层:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此
XML:可扩展标记语言(英语:Extensible Markup Language,简称:XML),是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
CRUD: crud是指在做计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)几个单词的首字母简写。
JavaBean:JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去。
具体操作:
引入JAR包,配置相关的XML文件
编写对象映射->.hbm.xml,一般和JavaBean对象放在同一目录下
熟悉API :session/Query/Session Factory/
SessionFactory-->Session的工厂
Session是Hibernate最重要的对象,Session维护了一个连接(Connection),只要使用Hibernate操作数据库,都需要用到Session对象,执行很多CRUD操作。
Hibernate工作原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
Ⅰ Hibernate的查询方式:
对象导航查询(object composition)
HQL查询
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
QBC查询
SQLQuery本地SQL查询
其中HQL查询是hibernate提供的面向对象的查询语言,用来查询对象以及属性,和SQL的区别:
1.可以查询对象以及属性 2. 区分大小写 3. 跨平台 4.简略
QBC查询:完全的面向对象查询
Ⅱ Hibernate的缓存机制:
一级缓存:
Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!
只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中!
Session的缓存由hibernate维护,用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
二级缓存:
二级缓存是基于应用程序的缓存,所有的Session都可以使用,生命周期和SessionFactory一致
Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。
如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。
Hibernate二级缓存:存储的是常用的类
查询缓存:
Hibernate为查询提供缓存,用来提高查询速度,优化HQL性能。
?JDBC hibernate 和 mybatis 的区别:
jdbc:手动
手动写sql
JDBC只管连接到数据库,然后创建SQL语句,查询并返回结果
mybatis的特点:半自动化
sql要手动写
delete、insert、update:直接传入一个对象
select:直接返回一个对象
hibernate:全自动
不写sql,自动封装,
delete、insert、update:直接传入一个对象
select:直接返回一个对象
hibernate完全可以通过对象关系模型实现对DB的操作,而MyBatis仅有字段映射,仅要手写SQL来实现和管理。不过Mybatis上手性更强,它的sql写在xml里,优化sql要方便的多,简单直接。
参考:https://segmentfault.com/a/1190000013568216#articleHeader18