一、对象持久化:把对象的信息保存到数据库或者文件。
二、orm是什么?
对象关系映射(Object Relation Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
对象关系映射(Object Relation Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
示意图:
三、hibernate框架图
四、Configuration类
1、负责管理hibernate的配置信息;
2、读取hibernate.cfg.xml;
3、加载hibernate.cfg.xml配置文件中配置的驱动,url,用户名,密码,连接池;
4、管理*.hbm.xml对象关系文件。
1、负责管理hibernate的配置信息;
2、读取hibernate.cfg.xml;
3、加载hibernate.cfg.xml配置文件中配置的驱动,url,用户名,密码,连接池;
4、管理*.hbm.xml对象关系文件。
示意代码:
Configuration cf = new Configuration().configure();
Configuration cf = new Configuration().configure();
五、对象关系映射文件(*.hbm.xml):
1、该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件。
2、一般放在其映射的类的同一个目录下,但不是必须的。
3、命名方式一般是“类名.hbm.xml”,但不是必须的。
1、该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件。
2、一般放在其映射的类的同一个目录下,但不是必须的。
3、命名方式一般是“类名.hbm.xml”,但不是必须的。
示意图:
六、SessionFactory(会话工厂)接口
1、缓存sql语句和某些数据;
2、在应用程序初始化的时候创建,是一个重要级的类(吃内存),一般用单列模式保证一个应用中只需要一个SessionFactory
1、缓存sql语句和某些数据;
2、在应用程序初始化的时候创建,是一个重要级的类(吃内存),一般用单列模式保证一个应用中只需要一个SessionFactory
实例;
3、如果某个应用访问多个数据库,则要创建多个会话工厂实例,一般是一个数据库一个会话工厂实例;
4、通过SessionFactory接口可以获得Session(会话)实例。
3、如果某个应用访问多个数据库,则要创建多个会话工厂实例,一般是一个数据库一个会话工厂实例;
4、通过SessionFactory接口可以获得Session(会话)实例。
注意:在使用hibernate开发项目时一定要保证只有一个SessionFactory(一种数据库对应一个SessionFactory)。
示意代码:
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
讨论SessionFactory获取Session的两个方法openSession()和getCurrentSession():
1、openSession()是获取一个新的session;
2、getCurrentSession()是获取和当前线程绑定的session,换言之,在同一个线程中,我们获得的session是同一session,
1、openSession()是获取一个新的session;
2、getCurrentSession()是获取和当前线程绑定的session,换言之,在同一个线程中,我们获得的session是同一session,
这样可以利于事务控制。如果希望使用getCurrentSession需要配置hibernate.cfg.xml,配置如下:
<property name="current_session_context_class">thread</property>
3、通过getCurrentSession()获取的session在事务提交后会自动关闭,通过openSession()获取的session则必须手动关闭,
<property name="current_session_context_class">thread</property>
3、通过getCurrentSession()获取的session在事务提交后会自动关闭,通过openSession()获取的session则必须手动关闭,
但是我们建议不管什么形式获取的session都要手动关闭;
4、如果是通过getCurrentSession()获取session进行查询需要事务提交(本地事务:针对一个数据库的事务;全局事务:跨
4、如果是通过getCurrentSession()获取session进行查询需要事务提交(本地事务:针对一个数据库的事务;全局事务:跨
数据库的事务(jta))。
何为同一个线程(示意图)?
如何选择:
1、如果需要在同一个线程中保证使用同一个Session,则使用getCurrentSession;
2、如果在一个线程中需要使用不同的Session,则使用openSession()。
1、如果需要在同一个线程中保证使用同一个Session,则使用getCurrentSession;
2、如果在一个线程中需要使用不同的Session,则使用openSession()。
七、Session(会话)接口:
1、Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合);
2、Session实例通过SessionFactory获取,用完需要关闭;
3、Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSession()获取;
4、Session可以看做是持久化管理器,它是与持久化操作相关的接口。
1、Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合);
2、Session实例通过SessionFactory获取,用完需要关闭;
3、Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSession()获取;
4、Session可以看做是持久化管理器,它是与持久化操作相关的接口。
示意代码:
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
Session s = sf.getCurrentSession(); //或者是:Session s = sf.openSession();
Configuration cf = new Configuration().configure();
SessionFactory sf = cf.buildSessionFactory();
Session s = sf.getCurrentSession(); //或者是:Session s = sf.openSession();
Session的几个重要方法:
保存一个对象(记录)--save方法
删除一个对象(记录)--delete方法
查询一个对象(记录)--get/load方法
修改一个对象(记录)--update方法
保存一个对象(记录)--save方法
删除一个对象(记录)--delete方法
查询一个对象(记录)--get/load方法
修改一个对象(记录)--update方法
Session和SessionFactory的关系图:
get()和load()的区别:
1、如果查询不到数据,get()会返回null,但是不会报错,load()如果查询不到数据,则报错ObjectNotFoundException。
2、使用get去查询数据,会立即向db发出查询请求(select ...),如果使用的是load()查询数据,即使查询到对象,返回的是
1、如果查询不到数据,get()会返回null,但是不会报错,load()如果查询不到数据,则报错ObjectNotFoundException。
2、使用get去查询数据,会立即向db发出查询请求(select ...),如果使用的是load()查询数据,即使查询到对象,返回的是
一个代理对象,如果后面没有使用查询结果,它不会真的向db发出select,当程序员使用查询结果的时候才真的发出select,这
个现象我们称之为懒加载(lazy),通过修改配置文件,我们可以取消懒加载:
<class name="Employee" lazy="false" table="employee">
<class name="Employee" lazy="false" table="employee">
使用原则:如果确定db中有这个对象就用load(),不确定就用get()(这样效率高)。
八、HQL详解:
1、HQL中查询的是对象而不是表;
2、hibernate设计者推荐我们在设计表的时候应当每张表有一个主键,而且该主键最好不含业务逻辑;
3、在讲解jdbc我们增加说过,要查询什么字段就查询什么字段,不要select * from ...,但是在hibernate我们其实不遵循这个规则,建议我们把整个对象的属性都查询。
九、hibernate对象的三张状态:
瞬时态(Transient):没有session管理,同时数据库没有对应记录。
持久态(Persistent):有session管理,同时数据库没有对应记录。
托管/游离态(Detached):没有session管理,但是在数据库中有记录。
示意图:
作用:只有当hibernate对象处于持久态(Persistent)时对其操作,数据库中的数据才会被更新。
------------------------------------纸上得来终觉浅,绝知此事要躬行。