小白的Hibernate初学之路(基础篇)

来源:互联网 发布:linux命令行测试网速 编辑:程序博客网 时间:2024/05/18 09:02

1. ORM:
对象关系映射,思想是将关系数据库中表的数据映射为对象,以对象的形式展现,目的是为了方便以面向对象的思想来实现随数据库的操作
ORM封装底层数据访问代码、还对sql进行了进一步的封装。
2.Hibernate框架
优点:1).是JDBC的轻量级框架,是一个独立对象持久层框架,可以用在任何JDBC可以使用的场合
2).Hibernate是一个和JDBC密切相关的框架,其兼容性与JDBC驱动,都和数据库有一定的关系
3)具有扩展性,API开放
3.Hibernate核心接口
(1)Session:负责执行被持久化对象的CRUD(完成与数据库的交互)操作,注意,Session是非线程安全的,同时,不同于JSP中的HttpSession
(2)SessionFactory:负责初始化Hibernate,它充当数据存储源的代理,并负责创建Session对象
从xml文件读取配置信息构建SessionFactory

    //指定要读取配置文件的路径private static String CONFIG_FILE_LOCATION="/hibernate.cfg.xml";    //定义ConfigFile属性并赋值private static String configFile = CONFIG_FILE_LOCATION;    //实例化Configuration类private static Configuration configuration = new Configuration();//读取默认配置文件configuration.configure(configFile);//构建SessionFactory实例对象sessionFactory = configuration.buildSessionFactory();
从java属性文件读取配置信息构建SessionFactory
    // 创建一个AnnotationConfiguration对象,此时Hibernate会默认加载classpath中的hibernate.properties配置文件    AnnotationConfiguration configuration=new AnnotationConfiguration();    //从java持久类获取映射信息    configuration.addAnnotatedClass(对象.类名.class);    //通过AnnotationConfiguration实例的buildSessionFactory()方法构造唯一的SessionFactory实例    SessionFactory sessionFactory = configuration.buildSessionFactory();
(3)Transaction:负责事务相关的操作,他是可选的(4)Query和Criteria:负责执行各种数据库查询(5)Configuration:负责并启动Hibernate,创建SessionFactory对象**五个接口关系图**

这里写图片描述
Hibernate配置文件
(1)hibernate.cfg.xml:封装了对各种关系数据库的访问操作,使用hibernate.cfg.xml作为配置文件,需要将其保存到当前项目或者应用的classpath路径下,这样Configuration对象调用configure()方法加载Hibernate配置选项是会自动加载该文件,如果Hibernate的配置文件没有使用默认的文件名或者保存在classpath路径下,则需要在Configuration对象的configure()方法中指定文件路径和文件名
(2)hibernate.properties:属性配置格式的编码比较简单,只是“键=值”,容易掌握和理解,该文件需要保存在项目类路径的跟目录下。
Hibernate映射文件
主要配置实体类与数据库表之间的映射关系,在这个配置文件中需指定类/表映射配置、主键映射配置和属性/字段配置等,命名方式为:className.hbm.xml ,映射文件与实体类放在一起,在相同的包中
①.hibernate-mapping元素:它是每一个hibernate的映射文件的根元 素,包含了一些可选的属性,如、schema,catalog、default-lazy、package等
②class元素:是根元素的子元素:用于定义一个持久化与数据表的映射关系,常用属性有:name,table,schema,proxy等
③id元素:用于定义主键,大多数的POJO类都有一个属性可以为每一个作为唯一的标识,id元素定义了该属性到数据库表主键字段的映射,常用属性:name,type,column,access,length等
④generator元素:指定主键的生成器,通过一个class属性指定生成器对应的类,hibernate提供的内置生成器有:
increment:适用于逻辑主键,由Hibernate自动以增长方式生成
identity:适用于逻辑主键,由底层数据库生成标识符
还有sequence,hilo,seqhilo,uuid,guid,native,assigned,select,foreign
⑤property元素:该元素用于持久化类的属性与数据库表字段之间的映射,常用属性有:
name(必须的):取值 类中的属性名
coloum:取值 表字段名字,默认为属性名字
type: 数据类型
update 默认为true
insert:默认为true
lazy:默认为false
unique:默认为false
not-null:默认为false
generator:默认为never,其他取值有,insert,always

Session操作对象
a.获取对象:两个方法 :get() 和load()
b.保存对象 save()方法 和persist()
c.删除对象:delete()
注意:当事务提交后或者刷新缓存后,记录才被真正的删除
d.更新对象:update()
注意:在提交事务是会自动检测缓存中的对象进行脏数据检测,发生检测变化的对象属性会自动更新到数据库
Session管理连接
a.connection();获取这个Session的JDBC连接
b.close():关闭Session,通过中断JDBC连接并且清空它
c.disconnect():断开Session与当前JDBC的连接
d.isConnected():检查Session是否处于连接状态
e.idDirty():当前Session是否包含需要与数据库同步的变化,如果提交这个Session是否会有SQL执行
f.isOpen():检查当前Session是否仍然打开
g.reconnect(Connection connection):重新连接到给定的JDBC连接。

状态转换图
这里写图片描述

悲观锁与乐观锁
悲观锁是指当数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改时保持原状态,因此,在整个数据处理过程中,将数据处于锁定状态。
例: select * fromstudent where name=”Lily” for update;
Hibernate显式指定锁模式:
(1).调用Session.load()
(2).调用Session.lock()
(2)调用Query.setLockMode()

乐观锁的两种实现:version 和 timestamp
Hibernate缓存
一级缓存:是Session内置的,不能被卸载,也不能进行任何配置,一级缓存采用的是key-value的Map来实现的,Session缓存存放的是私有数据
两个管理缓存的方法:
(1)evict(Object obj):将某个对象从Session的一级缓存中清除;适用于以下两种情况:
①不需要该对象进行同步的数据更新
②在批量进行更新和删除时,当更新每一个对象后,要释放对象所占用的空间
(2)clear():用于将一级缓存中所有的对象全部清除
总结:一级缓存提供了一个临时存放对象的一个内存结构,当hibernate对对象进行操作的时候,仅仅改变的是对象的属性,改变的是一级缓存中的对象的属性,在session.flush之前的代码可以任意写,因为这个时候,并没有和数据库交互。当执行session.flush的时候,hibernate会检查一级缓存中的对象的情况,发出insert或者update语句。
二级缓存:
策略;(1)条件查询时,总是发出一条select * from table_name where….(选择所有字段)这样的SQL语句查询数据表,一次获得所有的数据对象
(2)把获得的所有数据对象根据ID放入到二级缓存中
(3)当Hibernate根据ID访问数据对象是,首先从Session一级缓存中查,查不到,如果配置了二级缓存,那么冲二级缓存中查,查不到,再查询数据库,把结果按照ID放入到缓存中
(4)删除,更新,增加数据时,同时更新缓存

待续。。。。。。。

0 0
原创粉丝点击