Session对象
1.简介
- session对象是与数据库会话的对象,提供了与数据库交互的方法.
- session对象是线程不安全的,所以不能做为全局变量.
2,Session对象的获取和关闭
获取/创建和关闭的方法:
//获取新的session对象(不常用)
Session session = sessionFactory.openSession();
//获取当前的session对象(常用)
Session session = sessionFactory.getCurrentSession();
//关闭session(不常用)
session.close();
创建和关闭的位置:
- 为了防止延迟加载导致没实例化对象的问题(报错 no session),应该在请求时候创建session,响应时,关闭session.
- pring框架提供了这个监听器 OpenSessionInViewInterceptor
在web.xml中
<filter>
<filter-name>opensessioninview</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>opensessioninview</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.Session方法
1.增删改(o表示一个对象)
//删除对象
session.delete(o);
//保存对象
session.save(o);//返回对象的id值.立刻执行,不需要事务
//更新对象;必须在事务之内
session.update(o);
//有id就更新,没id保存
session.saveOrUpdate(o);
//JPA的标准,为保存,要在事务内
session.persist(o);
//更新
session.merge(o);
2.查
查单个对象
session.get(对象.getClass,id); //立刻执行
session.load(对象.getClass,id); //延迟加载(返回代理对象,永不为null;使用非主键属性时候才会实例化)
查多个对象
- 使用hql方式
//Employee代表类
String hql="select e from Employee e";
//生成查询对象
Query query = session.createQuery(hql);
//进行查询
List<Employee> list = query.list();//直接返回封装好的对象
- 使用sql方式
//Employee代表表名
String sql="select * from Employee e";
//生成查询对象
Query query = session.createSQLQuery(sql);
//进行查询
List<Object[]> list = query.list(); //Object[],自己要重新封装成对象
- 使用criteria方式(无需hql和sql语句)
//生成查询对象
Criteria criteria = session.createCriteria(Employee.class);
//进行查询
List<Employee> list = criteria.list();
- 使用NamedQuery方式
//在映射文件中声明hql语句,在`<class>`之后,于`<class>`同级
<query name="SELECT_ALL_EMPLOYEE">
select e from Employee
</query>
session.getNamedQuery("SELECT_ALL_EMPLOYEE").list();
Query对象和HQL
Query对象
Query对象可以预先对查询结果进行处理,Criteria对象也一样
query.list(); //获取查询结果
query.uniqueResult(); //获取唯一的结果
query.setFirstResult(0).setMaxResults(10);//从第一个开始,选十个对象;
query.setParamter("0","1L");//设置参数
Query结合HQL的使用
- 查询总数.
//HQL=select count(e) from Employee e;
int count =query.uniqueResult();
- 设置参数
//方式1,用索引
//HQL= select e from Employee e where e.name like ?;
List<Employee> list = query.setParameter(0,"%Armo%").list();
//方式2,用名称占位符
//hql=select e from Employee e where e.name like :name;
query.setParameter("name","%Armo%").list();
//hql=select e from Employee e where e.id in (:ids);
query.setParameter("ids",new Long[]{1L,2L,3L}).list();
//hql=select e from Employee e where e.dept =:dept;
query.setParameter("dept",部门对象).list();
- 结果集的处理
//用list<Object>接收
//HQL=select (e.name) from Employee e
List<String> list=query.list();
//HQL=select new List(e.name,e.id,e.dept) from Employee e;
List<List<Object>> list=query.list();
//用List<Map<Stirng,Object>>来接收
//HQL=select new Map(e.name as name,e.id as id,e.dept as dept) from Employee e;
list<Map<Stirng,Object>> = query.list
//用list<实例对象>来接收
//HQL=select new Employee2 (e.id,e.name,e.dept) from Employee1 e;
List<Employee2> list=query.list();
Employee1 :映射文件对应的类
Employee2 :另外一个类,这儿可以用全限名,要么用别名.
<!--设置别名在映射文件中-->
<hibernate-mapping package="domain" auto-import="false">//取消自动生成别名
<import class="类全限名" rename="别名"/>
</hibernate-mapping>