hibernate.docx

上传人:b****6 文档编号:2975601 上传时间:2022-11-16 格式:DOCX 页数:31 大小:31.32KB
下载 相关 举报
hibernate.docx_第1页
第1页 / 共31页
hibernate.docx_第2页
第2页 / 共31页
hibernate.docx_第3页
第3页 / 共31页
hibernate.docx_第4页
第4页 / 共31页
hibernate.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

hibernate.docx

《hibernate.docx》由会员分享,可在线阅读,更多相关《hibernate.docx(31页珍藏版)》请在冰豆网上搜索。

hibernate.docx

hibernate

1什么是Hibernate

  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合

  ,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任

 

   2Hibernate的核心类和接口:

  <1>Configuration

负责管理Hibernate的配置信息,这些配置信息都是从配置文件hibernate.cfg.xml或者

Hibernate.properties读取的,当然也可以自定义文件名称,只要在实例化Configuration

的时候指定具体的路径就可以了

  <2>SessionFactory

Configuration的实例会根据当前的配置信息,构造SessionFactory实例。

SessionFactory是线程安全的,一般情况下一个应用中一个数据库共享一个SessionFactory实例。

  <3>Session

一般的持久化方法(CRUD)都是通过Session来调用的,Session是非线程安全的

  <4>Transaction

事务管理

  <5>Query

查询的接口

 

  3Hibernate的原理及步骤

 

1.读取并解析配置文件 

//采用默认的hibernate.cfg.xml来启动一个Configuration的实例

例:

Configurationconfiguration=newConfiguration().configure();

//如要修改默认配置文件名当然你可以选择不修改

Configurationconfiguration=newConfiguration().configure(newFile("src/xxx.xml"));

2.读取并解析映射信息,创建SessionFactory

例:

SessionFactory sessionFactory=configuration.buildSessionFactory();

3.打开Session实例(它是线程不安全的,是共享同一个session,所以要ThreadLocal模式来控制)

例:

Sessionsession=sessionFactory.openSession();

4.创建事务Transaction

例:

Transactiontransaction=(Transaction)session.beginTransaction();

5.CRUD操作(执行数据操作CRUD增删查改)

例:

增加

  session.save(pojo对象);

  增加或者修改

  session.saveOrOpdate(pojo对象)//当修改时候,id不存在将被抛出异常

           删除

           session.delete(pojo对象)

  //根据主键加载

           p1=(Person)session.load(pojo类.class,主键值);

 

6.提交事务

例:

mit();

7.关闭Session实例及SessionFactory

例:

 session.close();

       sessionFactory.close();

 

  4.Session的管理

  Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取,都与Session息息相关,

  就如同在编写JDBC时需关心Connection的管理,以有效的方法创建、利用与回收Connection,以减少资源的消耗,

  增加系统执行效能一样,有效的Session管理,也是Hibernate应用时需关注的焦点。

   

  Session是由SessionFactory所创建,SessionFactory是线程安全的(Thread-Safe),您可以让多个

  线程同时存取SessionFactory而不会有数据共享的问题,然而Session则不是设计为线程安全的,所以试图让

  多个线程共享一个Session,将会发生数据共享而发生混乱的问题。

 

  在各种Session管理方案中,ThreadLocal模式得到了大量使用。

ThreadLocal是Java中一种较为特殊的

  线程绑定机制。

通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程,

  绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。

  首先,我们需要知道,SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程

  可以同时访问一个SessionFactory并从中获取Session实例。

而Session并非线程安全,也就是说,如果

  多个线程同时使用一个Session实例进行数据存取,则将会导致Session数据存取逻辑混乱

 

 

 

 

 

   5 Hibernate三种查询方式1hql2qbc《qbe ---querybyexample》3sql

 

 1.hql  

 

      1.1冒号法

  Queryquery=session.createQuery("fromPersonpwherename=:

xxx");//from后面跟的是PO对象名,而不是表名

   query.setString("xxx","ttt");

   Listlist=query.list();

for(Personp:

list)

System.out.println(p.getName())

      1.2问号法

  Queryquery=session.createQuery("fromPersonpwherename=?

");

query.setString(0,"ttt");

Listlist=query.list();

for(Personp:

list)

System.out.println(p.getName())

 

  模糊查询举例

   问号法

   Queryquery=session.createQuery("fromPersonpwherenamelike?

");

   query.setString(0,"%a%");

   冒号法

    Queryquery=session.createQuery("fromPersonpwherenamelike:

xxx");

query.setString("xxx","%w%");

 

 

    2.QBC( querybyCriteria) 

Criteria接口与DetachedCriteria(二者的区别就是DetachedCriteria可以离线操作,而Criteria不可以)

   

   <1>利用Restrictions进行条件筛选

      方法      說明 

Restrictions.eq等於 

Restrictions.allEq使用Map,使用key/value進行多個等於的比對 

Restrictions.gt大於> 

Restrictions.ge大於等於>= 

Restrictions.lt小於< 

Restrictions.le小於等於<= 

Restrictions.between對應SQL的BETWEEN子句 

Restrictions.like對應SQL的LIKE子句 

Restrictions.in對應SQL的in子句 

Restrictions.andand關係 

Restrictions.oror關係 

Restrictions.sqlRestrictionSQL限定查詢 

 

   

   <2>criteria.addOrder(Order.asc("id"));//排序

   

   举例1

   Criteriacriteria=session.createCriteria(Person.class);

   criteria.add(Restrictions.like("name","ad%")); //模糊查询,姓名以ad开头,注意要加%号

   criteria.add(Restrictions.between("age",20,30)); //年龄在20到30之间

   criteria.addOrder(Order.asc("id"));//

   Listlist=criteria.list();

   for(Personp:

list){

 System.out.println(p);

   }

       上面是与查询,如果是或查询  查询等于20或者或者年龄为空的记录

   Criteriacriteria=session.createCriteria(User.class);

        criteria.add(Restrictions.or( 

          Restrictions.eq("age",newInteger(20)), 

          Restrictions.isNull("age") 

        )); 

        Listusers=criteria.list();

 

 

 

 

       DetachedCriteria使用 //?

离线操作的意义何在?

       DetachedCriteriadc=DetachedCriteria.forClass(Person.class);

dc.add(Restrictions.eq("name","aaa"));

   Listlist=dc.getExecutableCriteria(session).list();

   for(Personp:

list){

 System.out.println(p.getId());

   }

 

 

 

 

    3.Sql

      <

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1