Session对象
1.简介
- session对象是与数据库会话的对象,提供了与数据库交互的方法.
- session对象是线程不安全的,所以不能做为全局变量.
2,Session对象的获取和关闭
获取/创建和关闭的方法:
Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
session.close();
创建和关闭的位置:
- 为了防止延迟加载导致没实例化对象的问题(报错 no session),应该在请求时候创建session,响应时,关闭session.
- pring框架提供了这个监听器 ContextLoaderListener
在web.xml中
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3.Session方法
1.增删改(o表示一个对象)
session.delete(o);
session.save(o);
session.update(o);
session.saveOrUpdate(o);
session.persist(o);
session.merge(o);
2.查
查单个对象
session.get(对象.getClass,id);
session.load(对象.getClass,id);
查多个对象
String hql="select e from Employee e";
Query query = session.createQuery(hql);
List<Employee> list = query.list();
String sql="select * from Employee e";
Query query = session.createSQLQuery(sql);
List<Object[]> list = query.list();
- 使用criteria方式(无需hql和sql语句)
Criteria criteria = session.createCriteria(Employee.class);
List<Employee> list = criteria.list();
//在映射文件中声明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();
List<Employee> list = query.setParameter(0,"%Armo%").list();
query.setParameter("name","%Armo%").list();
query.setParameter("ids",new Long[]{1L,2L,3L}).list();
query.setParameter("dept",部门对象).list();
List<String> list=query.list();
List<List<Object>> list=query.list();
list<Map<Stirng,Object>> = query.list
List<Employee2> list=query.list();
Employee1 :映射文件对应的类
Employee2 :另外一个类,这儿可以用全限名,要么用别名.
<hibernate-mapping package="domain" auto-import="false">//取消自动生成别名
<import class="类全限名" rename="别名"/>
</hibernate-mapping>