ConnectionProvider
用于生成与数据库连接的JDBC对象,同时做为数据库缓冲池.它是DataSource和DriverManager的高级封装.
SessionFactory
它保存了对应当前数据库配置的所有映射关系.
它生成SQl语句
它初始化过程非常复杂,耗费大量资源.
程序初始化只产生一个SessionFactory实例,它支持并发调用.
它是SessionFactory的工厂类
Session
它是hibernate进行执久化操作(增,删,改,查)主要类.它相当于jdbc中Connection对象起的作用,和Statement命令对象的作用.它是Transaction的工厂类.
Transaction(事务)
它代表执行化过程中事务对象,用它来保证事务的四大特性(隔离性,原子性,一致性,)它主要是由Session对象生成,所以生成,它的生命周期比Session要短.一个Session可以生成多个事务对象.事务对象是可选对象
实体对象在Hibernate中的生命周期.
Transient(瞬态)
表示该对象在内存中是自由的,于数据库没有关系.
例如:User user = new User(); user.setName("bond");
特点:
1.与数据库中的记录没有任何关系,没有相对应的数据库记录
2.与Session对象没有关系,也就是没有通过Session对象对其进行执久化操作
Persistent(持久态)
代表该对象处于Hibernate框架所管理的状态.即session对象相关.
特征:该对象执行任何操作,hibernate都会自动更新数据库
例如:
User user = new User(); user.setName("bond");user.setPwd("123");
Session session = SessionFactory.openSession();
session.save(user);
user.setPwd("456");
session.close();
Datached(游离态)
是它处于Persistent状态的对象,当不再于它所对应的Session对象相关联时,即变成游离态
User user = new User(); user.setName("bond");user.setPwd("123"); //游离态
Session session = SessionFactory.openSession();//此时是游离态的
Transaction tx = session.beginTransaction();
session.save(user);//纳入管理,此时是持久态的
tx.commit();
session.close();//游离态的
特殊
1.游离态由执态转变而来
2.游离态与Session对象相关
3.该对象在数据库中有相应的数据记录
4.由于已经脱离了Session对象管理,因此对该对象的任何修改不会更新到数据库中
瞬态对象和游离对象区分
下面是检查是否是瞬态对象的条件
1.该实体的id属性为null
2.在映射文件是id设置了unsaved-value,并且id的值和unsaved-value相同
3.如果配置了version属性,,并且version属性为空
4.在映射文件中为version属性设置了unsaved-value属性,并且version的属性值与设置值值相同
5.如果设置了Interceptor,并且interceptor的isUnsaved()方法的返回值为true.
Hibernate中的核心类
Configuration类
作用:读取配置文件并创建SessionFactory对象.它只在系统初始化阶段创建,以后操作都于SessionFactory类关联
Configuration config = new Configuration().config();//从classpath中查找hibernate.cfg.xml文件中查找配置文件
SessionFactory类
作用:生成Session对象.通常情况下,一个应用程序只有一个SessionFactory实例.它是线程安全的.
SessionFactory sessionFactory = config.buildSessionFactory();
注意:一个sessionfactory对象只能关联一个数据库
Session类
它是执行执久化操作的关键类,它是有生命的,它不是线程安全的.
Session session = sessionFactory.openSession();
save()方法
User user = new User();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();
update()方法
User user = new User();
user.setId("4455");//必须设置
user.setName("sina");
session.update(user);
saveOrUpdate()方法
如果是瞬时对象则save.如果是游离对象则update.如果是执久对象,不进行操作.
如果对象的id属性在数据库找不到,出异常
delete()方法
User user = new User();
user.setId("44");
session.delete(user);
get()方法
根据传入的标识符得到唯一的对象,如果不存在得到null
load()方法
加载执久化对象,如果不存在发生异常(hibernateException)
get和load区别
1.get没有得到一个null,load出异常
2.load方法返回代理类实例,get返回实体类
3.load方法可利用hibernate内部缓存和二级缓存中现有数据.get仅从内部缓存中进行数据查找,如果没有执行sql语句查询.
contains()方法
看一个实体对象是否与当前的Session对象相关联.看是不是个Persistent状态.
evict()方法
将一个实体对象和一个session对象的关系.将状态从Persistent转到Datached状态.
createQuery();
创建一个Query查询接口对象,利用HQL语句查询
createCriteria()方法
创建一个Criteria查询接口实例
createSQLQuery()方法
创建一个SQLQuery查询,通过标准SQL语句执行
createFilter()方法
通过一个对象的集合及查询HQL语句来生成一个Query对象实例
Query接口=========================
Query query = session.createQuery("from User as u where u.age > :userAge");
query.setInteger("userAge",20);
List list = query.list();//返回集合
Query query = session.createQuery("from User as u where u.age > ?");
query.setInteger(0,20);//参数位置是从0开始
Query query = session.createQuery("from User as u where u.age > " + age );
List list = query.uniqueResult();//返回唯一的一个对象,没有是null
Iterator it = query.iterator();//得到一个指针,按顺序读,不会造成资源浪费,不知道结果集中记录数目.类似.net中的只进游标
HQL语句
select new User(u.name,u.password) form User u;
返回的是非执久的状态的对象.
批量更新
update User set age = age+1;
delete User where age < 10;
Criteria接口=========================
采用qbc查询方法
List cats = session.createCriteria(Cat.class)
.add(Restrictions.like("name","IZ%"))
.add(Restrictions.gt("weight",new Float(100));
.addOrder(Order.asc("age")).list();
生成的sql语句如下
select * from cat where name like 'Iz%' and weight >100 order by age asc.
Criteria接口的典型方法
add();设置查询条件
addOrder();设置顺序规则
createCriteria();创建一个新的Criteria.用于复合条件查询
list();返回结果
scroll();返回scrollableResults类型的查询结果
setFetchSize();设置获取记录的数目
setFirstResult();返回第个记录的位置
setProjection();将聚集函数的结果作为查询条件
uniqueResult();得到唯五的结果
Restrictions类
用于生成Criteria执行查询的查询条件
Order类
设置排顺序规则.Order.asc() Order.desc();
Projections类(Hibernate3新类)
分组查询
List cats = session.createCriteria(Cat.class)
.setprojection(Projections.projectionList()
.add(Projections.rowCount())
.add(Projections.avg("weight"))
.add(Projections.max("weight"));
.add(Projections.min("weight"));
.add(Projections.groupProperty("color"))
)
.addOrder(Order.asc("color")).list()