1 Session常用接口
1:save/persist 保存对象 save返回主键值,persist不返回任何值。
2:Load/Get
相同点:根据主键来获取主键所对应的对象。
Load/Get的区别:
1:Load 使用代理机制,而GET没有使用代理对象。
使用代理对象主要是为了使用延迟加载机制。
2:加载不到对象时,Load报对象找不到异常,而GET是空指针异常。
项目大部分采用GET方法加载数据。(使用延迟加载会产生比较多的问题)
3:update/merge 更新对象
4:delete 删除对象
update/delete方法都是根据主键来操作对象。如果要通过其它属性操作对象,都必须使用HQL语句。
5:clear 清空缓存(清空Session缓存(对象缓存),清空一级缓存,不清空二级缓存)
2 语法结构:
单对象查询: From 类名 where 条件
group by 属性
order by 排序属性desc|asc
多对象关联。使用别名可以简化HQL的编写
Select 别名 From 类名别名 where 条件
group by 属性
order by 排序属性desc|asc
A:获取所有的对象的数据
query.list(); //获取所有的数据放到List集合中,数据量大时,比较慢,要进行数据的分页。
query.iterator();//使用迭代器的方式获取对象的数据,因此每读取一条数据都会产生一条SQL语句。
(产生的SQL语句是根据各对象的主键号来产生的)
B:获取单个属性
session.createQuery(querySQL.toString()).uniqueResult();
结果:属性的数据类型。
C:获取多个属性|获取所有属性
结果:每一元素是对象数组。
D:执行DDL语句
不能执行
create/drop/alter/truncatetable这些DDL语句。
E:执行DML语句
update/delete:批量更新和批量删除。
select
insertinto into是HQL语句是非法字符。
Query.executeUpdate();
G:执行聚合函数count,max,min,sum,avg
query.uniqueResult();//只能是一行的数据
longcount = list.get(0);
longcount2 = Long.parseLong(String.valueOf(query.uniqueResult()));
I:执行分页语句
Hibernate分页接口
query.setFirstResult(10); // startIndex
query.setMaxResults(10); // pageSize
J:执行预编译语句
(1):参数?设置
setParameter(索引,值)/或者setXXX(索引,值)
hql= "Select u fromUserBean u where truename like ? order by userid desc";
session= HibernateUtil.getSession();
query= session.createQuery(hql);
/**
* 下标从0开始。jdbc的下标从1开始。
*/
query.setParameter(0,"%王%");
// query.setParameter(1, 16);
(2):参数名称设置
setXXXX("名称",值)
hql= "Select u fromUserBean u where truename like :truename and userage >= :begin_age anduserage<= :end_age order by userid desc";
session= HibernateUtil.getSession();
query= session.createQuery(hql);
query.setString("truename", "%王%");
query.setString("begin_age", "20");
query.setString("end_age", "50");
(3):参数属性设置
setProperties(Bean或者Map)
hql= "Select u fromUserBean u where truename like :truename and usersex = :usersex order by useriddesc";
session= HibernateUtil.getSession();
query= session.createQuery(hql);
/**
* 使用Map的方式。Map中的key = 参数名称
*/
// Map<String,String>paramMap = new HashMap<String, String>();
// paramMap.put("truename","%王%");
// paramMap.put("usersex","0");
// query.setProperties(paramMap);
/**
* 使用Bean的方式。Bean中属性的名称 == 参数名称
*/
UserBeanparam_userBean = new UserBean();
param_userBean.setTruename("%王%");
param_userBean.setUsersex("0");
query.setProperties(param_userBean);
SessionFactory.getSession与SessionFactory.getCurrentSession的区别
1. 如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,也就是不用再session.close()了(自动关闭session)。但是如果使用的是openSession方法创建的session的话,那么必须显示的关闭session,也就是调用session.close()方法。这样commit后,session并没有关闭(手动关闭session,推荐)