创建、读取、更新和删除
方法 描 述
save() 将一个对象保存到数据库。对于已经保存到数据库的对象,不应该调用这个方法。
saveOrUpdate() 将一个对象保存到数据库,如果对象已经存在的话,就更新数据库。这个方法的效率比save()方法略微低一点,因为它要执行一个SELECT语句来检查对象是否已经存在;但是,如果对象已经保存过,它就执行更新操作,而不会保存失败。
merge() 将未持久化对象的字段合并进行适当的持久化(由ID决定)。如果数据库中不存在对应的对象,那么就创建对象并保存。
persist() 将一个对象与会话重新关联起来,让对对象的修改持久化。
get() 根据对象的标识符从数据库中获取特定的对象。
getEntityName() 获取实体名(这常常与POJO的类名相同)。
getIdentifier() 判断与会话相关联的一个特定对象的标识符(代表主键的对象)。
load() 根据对象的标识符从数据库加载一个对象(如果不确定这个对象在数据库中是否存在,那么应该使用get()方法)。
refresh() 用数据库中的数据刷新一个相关联对象的状态。
update() 用对对象的修改更新数据库。
delete() 从数据库中删除对象。
createFilter() 创建一个过滤器(查询)来减小数据库操作的范围。
enableFilter() 在查询中启用由createFilter()产生的一个命名过滤器。
disableFilter() 禁用一个命名过滤器。
getEnableFilter() 获取当前启用的过滤器对象。
createQuery() 创建一个应用于数据库的Hibernate查询。
getNamedQuery() 从映射文件获取一个查询。
cancalQuery() 取消当前从另一个线程执行的任何查询。
createCriteria() 创建一个条件对象来减小搜索的范围。
事务和锁
方法 描 述
beginTransaction() 开始一个事务
getTransaction() 获取当前的事务对象。如果当前没有事务,这个方法不会返回null,而是返回对象的active属性是false。
lock() 获得一个对象的数据库锁(如果设置了LockMode.NONE,它的作用与persist方法相似)。
管理资源
方法 描 述
contains() 判断特定的对象是否与数据库关联。
clear() 清空所有加载的实例的会话,并且取消还没有完成的所有保存、更新和删除操作,仅保留正在使用的迭代器。
evict() 解除一个对象与会话的关联,以后对对象的修改将不持久化。
flush() 将所有未保存的修改存储进数据库——执行所有保存、更新和删除操作,这实际上会让会话与数据库同步。
isOpen() 判断会话是否已经关闭。
isDirty 判断会话是否与数据库同步。
getCacheMode() 获取当前使用的缓存模式。
setCacheMode() 改变当前使用的缓存模式。
getCurrentLockMode() 获取当前使用的锁模式。
setFlushMode() 设置当前使用的转储清除方法。可用选项是在每个操作之后转储清除、在需要时转储清除、不转储清除和只在提交时转储清除。
setReadOnly() 将一个持久化对象标为只读(或可写)。将对象标为只读会对性能有些许好处,但直到将它标为可写之前,对它的状态的修改会被忽略。
close() 关闭会话,因此也会关闭底层数据库连接;释放其他资源(比如缓存)。在调用close()方法之后,就不能在Session对象上执行任何操作。
getSessionFactory() 获取创建当前Session实例的SessionFactory对象的引用。
JDBC连接
方法 描 述
connection() 获取底层数据库连接的引用
disconnect() 断开底层数据库连接
reconnect() 重新连接底层数据库
isConnected() 判断是否连接了底层数据库
实例
=============================
HQL(Hibernate Query Language):是面向对象的查询语句,它的语法和SQL语句有些相像,在运行时才得以解析.HQL并不像SQL那样是数据操作语言,它用来取得对象,而不是进行update,delete和insert操作. HQL 是一门对大小写不敏感的的语言,所以SeLect与SELECT和sELeCT是相同的.
----------------
现在有四张表:student,team,course,student_course.
student 表中有五个字段,分别是:id,name,cardId,age,team_id;
team 表中有两个字段,id,teamname;
course 表中有id,name;
student_course 表中有stu_id,course_id; 保存多对多的关系表
----------------
Student 是一个对象,student 是数据库中的一个表.
查询所有的Student对象时,最简单的HQL语句是: from Student,也可以写成 select s from Student (as)s. 注:这的as可以省略
1:简单的查询遍历对象:
遍历Student
Query query=session.createQuery("form Student"); //注: 如果Student对象不是唯一的,那么需要写上包名,如: from test.Student test为包名.
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student stu=(Student)list.get(i);
System.out.println(stu.getName());
}
注意: 如果执行HQL语句"from Student,Course",并不时单单返回两个对象,而是返回两个对象的笛卡尔积,这类似SQL语句中字段的全外连接.实际的应用中,"from Student,Course"这种语句几乎是不回出现的.
2:属性查询:
----单个属性查询:
Query query=session.createQuery("select s.name form Student s");
List list=query.list();
for(int i=0;i<list.size();i++)
{
String name=(String)list.get(i);
System.out.println(name);
}
----多个属性查询:
Query query=session.createQuery("select s.name,s.age form Student s");
List list=query.list();
for(int i=0;i<list.size();i++)
{
Object obj[]=(Object[])list.get(i); //取得list中的第i个对象
System.out.println(obj[0]+"的年龄为: "+obj[1]);
}
3:实例化查询:
实例化查询结果可以说是对属性查询的一重改进.在使用属性查询时由于使用对象数组,操作和理解不太方便,如果将以个Object[]中的成员封装成一个对象就方便多了.
Query query=session.createQuery("select new Student(s.name,s.age) form Student s");
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student stu=(Student)list.get(i);
System.out.println(stu.getName());
}
注:运行这个程序的时候,需要一个new Student(s.name,s.age)构造函数.在Student.java中编写这个构造函数.
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
4:查询链接:
与SQL查询一样,HQL也支持连接查询,如内连接,外连接和交叉连接.支持的链接类型是从ANSI SQL中借鉴来的.
1: inner jion (内连接)
2: left outer join (左外连接)
3: right outer join(右外连接)
4: full join(全连接--不常用)
inner jion 可以简写为join.
正常情况下必须要建关联。
select a.id, b.id from A a, B b where a.id = b.id;
上面每条记录返回的是一个Object[]对象。
你也可以把结果重新封装一下。
String hql = "select a.id, b.id from A a, B b where a.id = b.id";
List result = getHibernateTemplate().find(hql);
if (result.size() > 0) {
for (int i = 0; i < result.size(); i++){
Object[] obj = (Object[]) result.get(i);
//这里就可以重新封装数据
}
}
5:统计函数查询:
1: count() 统计记录的条数
2: min() 求最小值
3: max() 求最大值
4: sum() 求和
4: avg() 求平均值
//取得Student的数量
Query query=session.createQuery("select count(*) from Student")
//avg()取得Student平均年龄
Query query=session.createQuery("select avg(s.age) from Student as s")
//upper()方法将字符串转为大写
Query query=session.createQuery("select upper(s.name) from Student as s")
//去除重复行distinct
Query query=session.createQuery("select distinct s.age from Student as s")
6:子查询:
all 表示所有记录
any 便是所有记录中的任意一条
somy 与any用法一样
in 等价于any
exists 表示子查询至少要返回一条数据.
all:
from Team t where 22<all(select s.age from Student s)
from Team t where all(select s.age from t.student s)>22
7:修改
update()
Student stu=(Student)session.get(Student.class,"id"); //根据id 得到stu对象
stu.setName("123");
session.update(stu);
8:删除:
delete()
Student stu=(Student)session.get(Student.class,"id"); //根据id 得到stu对象
session.delete(stu);