一、Hibernate:ORM(Object Relation Mapping)对象关系映射框架
常用的ORM框架有:Hibernate、TopLink、OJB。
Hibernate 框架完全是进行对象的操作,不再会有对字段、属性的操作。如Hibernate 删除则是删除一个对象,更新则是对某一个对象状态进行更新
小贴士:应用Hibernate开发时,可与JDBC相联想
二、开发流程:
1.由Domain Object ----》mapping -----》db(官方推荐)
2.由DB开始,用工具生成mapping和Domain Object(使用较多)
3.由映射文件开始
Domain Object 限制:
1.默认的构造方法(必须的)
2.有无意义的标示符id(主键)(可选)
3.非final,对懒加载有影响
三、需要一个工具类,只加载一次 hibernate.cfg.xml 文件
package cn.itcast.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
publicfinalclass HibernateUtil {
private HibernateUtil() {}
privatestatic SessionFactory sf = null;
static {
Configuration cfg = new Configuration();
cfg.configure();
//cfg.configure(new File("filename")); //指定配置文件的路径,不指定则默认
sf = cfg.buildSessionFactory();
}
publicstatic SessionFactory getSessionFactory() {
returnsf;
}
publicstatic Session getSession() {
returnsf.openSession();
}
}
小贴士:将java类与hibernate源码绑定
四、Mysql 有多种引擎:
MyISAM:5.0以前的缺省引擎,效率高但不支持事务。
InnoDB:支持事务,则Hibernate操作时需要开启事务,进行操作后提交事务,这样才能将数据持久化:
Transaction tx = s.beginTransaction();//开启事务
User user = new User();
user.setName("name");
user.setBirthday(new Date());
s.save(user);
tx.commit(); //事务提交
五、Hibernate 核心接口概述:
Configuration:
负责管理Hibernate的配置信息,这些信息由配置文件提供,包括如下内容:
1.Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类等,数据库Dialect,数据库连接池等。
2.Hibernate映射文件(*.hbm.xml)
调用代码:
1.属性文件(hibernate.properties)
Configuration cfg = new Configuration();
cfg.addClass(XXX.class);//该方法加载XXX.hbm.xml
cfg.addResource();
2.XML文件(hibernate.cfg.xml)
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory:
1.应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂---例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要每个数据库使用一个会话工厂。
2.会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
3.调用代码:
privatestatic SessionFactory sf = null;
static {
Configuration cfg = new Configuration();
cfg.configure();
sf = cfg.buildSessionFactory();
}
Session:
1.Session不是线程安全的,它代表与数据库之间的一次操作会话
2.Session也称为持久化管理器,因为它是与持久化有关的操作接口
3.Session通过SessionFactory打开,在所有的工作完成后,需要关闭
4.Session缓存其管理的持久化对象
5.调用代码:
Session session sessionFactory.openSession();
Transaction:
1.它将应用代码从底层的事务实现中抽象出来---这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代码结构(CORBA)---允许应用通过一组一致的API控制事务边界
2.这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性
3.Hibernate提供的事务提交模式默认为非自动提交模式(默认:autoCommit=false),因此使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction的API
4.调用代码:
Transaction tx = session.beginTransction();
Tx.commit()/rollback();
Query/Criteria:
1.Query接口封装了Hibernate强大的对象查询能力,同时也支持数据库的更新操作
2.提供了动态查询的参数绑定功能
3.提供list(),iterator(),scroll()等对象导航方法
4.提供uiqueResult()方法获取单独的对象
5.提供executeUpdate()方法来执行DML语句
6.提供了可移植的分页查询方法
Session:
1、save,presist保存数据,persist在事务外不会产生insert语句。
2、delete,删除对象
3、update,更新对象,如果数据库中没有记录,会出现异常,脱管对象如属性改变需要保存,则调用update方法
4、get,根据ID查,会立刻访问数据库
5、load,根据ID查,(返回的是代理,不会立即访问数据库)
6、saveOrUpdate,merge(根据ID和version的值来确定是否是save或update),调用merge你的对象还是托管的。当不知该对象的状态时可调用该方法
小贴士:瞬时对象id无值,脱管对象有值,hibernate通过该方式判断对象的状态
7、lock(把对象变成持久对象,但不会同步对象的状态)
六、Hibernate中对象的状态:
状态的参考:数据库中是否有记录;是否有session关联
1、瞬时(transient):数据库中没有数据与之对应,超过作用域被JVM垃圾回收器回收,一般是new出来且session没有关联的对象
2、持久(persistent):数据库中有数据与之对应,当前session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)
3、脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到
对象在的状态转化: