挺长,也详细。
如有帮助,欢迎留下足迹哦!
目录
加载配置文件
使用Configuration对象可以创建session工厂对象;根据核心配置文件中数据库的配置、映射文件部分来创建表;创建SessionFactory过程很消耗资源,建议一个项目只创建一个SessionFactory对象,即一个工具类即可。
具体实现:静态代码块,类加载时执行且只执行一次;
类似于JDBC中的Connection。session是单线程对象,即只能自己用,不能共用,每次只能做一次。
两个操作,一个commit(),一个rollback()
事务的四个特性:
原子性:事务要么都成功,要么都失败。
一致性:操作前后总量不变,如转账操作一个人多钱一个人少钱。
隔离性:多个事务同时操作同一个记录,各不影响。
持久性:最终事务要提交,commit到数据库。
1、数据库的信息配置是必须的,配置hibernate信息可有可无,注册映射文件必须的。
2、<hibernate-configuration>
<session-factory>注意位置。
3、必须在src下,且名称固定
1、位置不固定,名称不固定,但不能是中文名
2、<properties name=”” column=””>,name中写的都必须与实体类的属性对应一致,column中写的都是数据库表中的列。class标签的name属性写的是全限定名(由类名右键复制可得到),table属性是将会生成的表名。
3、<properties name=”” column=””>标签中如果不写column属性,那么生成的字段名将会和name属性一致。
4、<properties name=”” column=”” type=””>标签的type属性一般不写,type属性用于设置生成表的字段的类型,自动根据实体类属性的类型转换为数据库所对应类型,不需要手动写。
数据存到数据库中,数据库本身是文件系统。用流的方式操作文件效率不是很高
因此:
将数据存到内存中,此时不使用流的方式,可以直接读取内存中的内容。
把数据放到内存中,提高读取效率。
Hibernate框架中提供了很多优化方式:Hibernate一级缓存就是一个优化机制。
一级缓存:默认就是打开的。使用范围是session的范围(session的创建-关闭之间),即session之外一级缓存是不存在的。
存储的数据必须是一种状态的数据--持久态的数据。
二级缓存:已经不使用了。有一种替代技术,被redis替代。默认不是打开的。使用范围是整个项目的范围(SessionFactory)。
<1>根据userid=1查询,返回对象
<2>再根据userid=1查询,返回对象,此时不会产生sql语句,可以验证一级缓存的存在。
User u1 = session.get(User.class, 14);
执行时,先查询缓存中是否有数据,如果有则返回,如果没有就去查询数据库返回User对象(持久态的对象);同时将该持久态的对象放到一级缓存中(同时将一样的对象放到快照区),此时一级缓存中已有数据。
当第二次查询该目标时,仍然先去查询缓存看是否有数据(根据id值),如果有直接从一级缓存中获取数据;第二次查询时查到的虽然是同样的值但是会组成不同的对象。
不是存储整个对象的形式,而是只存储对象的值,如userid=14,username=多少等;
修改操作:验证一级缓存的特性:持久态会自动更新数据库,不需要调用update()方法
原理:
创建session时,会创建一块一级缓存区,同时创建一块一样的区域--快照区(副本);当执行u1.setPassword("mimmmm");时,会将一级缓存中的user值进行修改,快照区里的user值不变,数据库中也不变;要修改的值没有变化时对数据库不做更改,性能很高。
即,一级缓存在事务提交之前代表用户的操作,快照区中的值代表的是数据库中现在的值,在提交事务时会比较一级缓存中的内容与快照区中的值是否一致,如果一致则不做修改,如果不一致则按一级缓存中的内容来更新数据库,此时快照区的值同时更新。
事务代码的规则写法
- try{
-
- 开启事务
-
- 提交事务
-
- }catch(){
-
- 回滚事务
-
- }finally{
-
- 关闭事务
-
- }