【Hibernate】【Session对象】【Query对象和HQL】

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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值