1、
对象的状态
<1>瞬时对象是new出来的,与Session和数据库都无关;
<2>持久对象是放入Session中,与Session有关的,Hibernate可以检测到,更新对象的值,可以影响到数据库中的值;
<3>脱管对象是在存入数据库,session关闭的时候由持久对象变换过来的,因此它只与数据库有关,因此Hibernate检测不到,数据库要更新需要更新语句update。
<4>Hibernate只能检测到Session中的对象变化情况。
<5>当不知道对象是瞬时的还是脱管的,如果要保存或更新数据库中的值,这个时候就需要用到saveOrUpdate(),让Hibernate去判断该对象是什么状态。
2、
HQL和Criteria
<1>、HQL查询(官方推荐):
String hql = "from User as user where user.name=?";
Query query = session.createQuery(hql);
query.setString(0, name);
List<User> list = query.list(); //如果有多条记录,用list
User u = (User)query.uniqueResult();//确定查到结果集只有一条记录录时使用
对于上面的hql语句,我们可以这样写(为name取别名):
String hql =
"from User as user where user.name=:n";
query.setString(“n”, name);
Hibernate中的分页可以用以下语句:
query.setFirstResult(100); //从哪一条开始查询
query.setMaxResults(20); //每页显示多少条
<2>、Criteria条件查询(比较常用,功能有限):
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq(“name”,name)); //从数据库中查出等于name数据
c.add(Restrictions.lt(“birthday”,new Date());//查出小于birthday数据
分页语句:
c.setFirstResult(0); //从哪一条开始查询
c.setMaxResults(10); //每页显示多少条
List<User> list = c.list(); //如果有多条记录,用list
User u = (User)c.uniqueResult();//确定查到的结果集只有一条记录时使用
<3>、外置命名查询(很少用)
在实体映射文件的<class>标签后加上如下配置:
<!-- 外置命名查询(例子:TestOutName) -->
<!--
<query name="queryUser">
<![CDATA[from User u where u.id>?]]>
</query>
调用时如下:
Session session = HibernateUtil.getSession();
Query query = null;
session.beginTransaction();
query = session.getNamedQuery("queryUser");
List<User> urs = query.setParameter(0, 5).list();
for(User u : urs) {
System.out.println("id:"+u.getId()+"
name:"+u.getName()+"
createTime:"+u.getCreateTime());
session.getTransaction().commit();
|
<4>、过滤器(很少用)
过滤器配置如下:
在<class>标签中加入如下代码:
<filter
name="idFilter"
condition="id >:uid"></filter>
在<class>标签外加入如下代码:
<filter-def
name="idFilter">
<filter-param
name="uid"
type="integer"/>
</filter-def>
|
例子代码:
session.beginTransaction();
session.enableFilter("idFilter").setParameter("uid",
4);
query = session.createQuery(“from User”);
List<User> urs = query.list();
for(User u : urs) {
System.out.println("id:"+u.getId()+"
name:"+u.getName()+"
createTime:"+u.getCreateTime());
}
session.getTransaction().commit();
|
<5>内、外连接问题
l 内连接
内连接就是满足Document中的uid等于User的id时,将两个表的数据连接成类似一张表信息的过程。
from Document d inner join d.user on d.uid=d.user.id
l 外连接
外连接分为左外连、右外连和全外连。
外连接是将两个表的信息都一一对应后进行连接,得到结果行数可能是两表行数的乘积。下面两个HQL语句功能相同。
select * from User u,Document d where u.id=d.user.id
select * from User u outter join Document d on u.id = d.user.id
<6>、聚合函数和子查询
在HQL中*只能出现在count(*)中。
select d.user.name, count(*) from Document d group by d.user having count(*)>1 order by d.user.id";
<7>、Iterator查询与N+1问题
Session session = HibernateUtil.getSession();
Query query = null;
try {
session.beginTransaction();
query = session.createQuery("from User u where u.id>=4 and u.id<=6");
List<User> urs = query.list();
for(User u : urs) {
System.out.println("id:"+u.getId()+"
name:"+u.getName()+"
createTime:"+u.getCreateTime());
}
//上面通过List查询过的那些User将会在缓存中存在,当下面的Iterator再查询的时候,它会先从数据库查出所有User的ID,然后再用ID从缓存中找,如果缓存中有的话,就从缓存中取,不用向数据库发select语句。
System.out.println("======================================");
query = session.createQuery("from User");
Iterator<User> iter =
query.iterate();
while(iter.hasNext()) {
User u = iter.next();
System.out.println("id:"+u.getId()+"
name:"+u.getName()+"
createTime:"+u.getCreateTime());
}
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
e.printStackTrace();
} finally {
HibernateUtil.closeSession();
}
|
<8>、导航查询
给个例子如下:(利用本对象中另外对象的属性条件来查询本对象的信息)
String hql = "from Document d where d.user.name=?";
Session session = HibernateUtil.getSession();
Query query = null;
session.beginTransaction();
query = session.createQuery(hql);
query.setParameter(0,
"user5");
List<Document> ds = query.list();
for(Document d : ds) {
System.out.println("id:"+d.getId()+"
title:"+d.getTitle()+"
content:"+d.getContent()+"
createTime:"+d.getCreateTime());
|
<9>、HQL中的DML(很少用)
hql的DML语句不受缓存管理,所以很少使用
示例代码:
3、
Hibernate中CURD的模板代码如下:
4、
Hibernate中对象状态图
flush()可以清除临时缓存,以保证执行的顺序。
evict()可以将对象从缓存中剔除,使其从持久态变为脱管态。
clear()可以将缓存中的所有对象剔除。
lock()可以为某对象加锁机制。
分享到:
相关推荐
StrutsSpringHibernate基本知识,清楚易懂
hibernate基本知识点,里面有关于hibernate的配置说明,hibernate的讲解
文档阐述了hibernate基本架构的使用,可以作为hibernate学习的基础知识
hibernate4基本知识点,常见问题解决方案,基本配置注意事项
同时使用了Struts2、Spring4、Hibernate4、log4j、slf4j、junit4、ehcache等库或框架,搭建一个最基本的项目原型。 三、 三大框架最新版本下载:截止2014-10-01 Struts2.3.6:发布于2014-05-03,目前的最新版本。...
详细讲解了S2SH框架技术的基本知识和使用方法,从Eclipse开发平台、JSP、Servlet等基础知识讲起,由浅入深,重点介绍了当前流行的三个轻量级开源框架:Struts2、Spring和Hibemate.
介绍很全的 Hibernate PPT,基本上知识点涉及很全
系统学习Hibernate3的开发知识,循序渐进 第一章:Hibernate入门 包括:是什么、ORMapping原理、能干什么、有什么、怎么做(做什么) ... 包括:分增删改查的操作说明Hibernate基本的实现原理 第八章:最佳实践
《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...
本文并不想介绍Struts,Spring,Hibernate的原理系统架构等,本文地目的是通过一...以及那些已经了解Struts,Spring,Hibernate的基本概念,但是还没有亲身在较复杂的项目中体验Struts+Spring+Hibernate的开发人员。
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.20 + Spring4.1.6 + Hibernate4.3.9。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
《疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发》是《基于J2EE的Ajax...第9章以后的内容则需要掌握Spring、Hibernate等Java EE知识,建议先认真阅读疯狂Java体系的《轻量级Java EE企业应用实战》一书。
第三部分 会话对象处理 第9章 使用对象 9.1 持久化生命周期 9.1.1 对象状态 9.1.2 持久化上下文 9.2 对象同一性和等同性 9.2.1 引入对话 9.2.2 对象同一性的范围 9.2.3 脱管对象的同...
是很好的教材,案例写的很详细,基本知识要点都在上面,hibernate基本都够用了
Hibernate的环境搭建及使用Hibernate时必须掌握的基本技术等基础知识;在Hibernate中映射关联关系、事务应用、检索策略、映射值类型集合等高级应用;小型网站或应用程序的开发思路、方法和过程;基于Struts+...
从此,你就会用hibernate进行基本操作了。并且程序中不再有sql语句,实现了很好的封装. 里面还有个文档: 讲解hibernate基础的 1. 什么是hibernate? 2. hibernate的知识内容 3. 什么是对象持久化?对象持久化有...
《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...
Struts Hibernate Spring集成开发宝典》中文pdf版 计算机电子书下载,《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成...
Struts Hibernate Spring集成开发宝典》中文pdf版 计算机电子书下载,《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成...
《Struts Hibernate Spring集成开发宝典》中文pdf版 计算机电子书下载,《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列...