hibernat基础教程_第1页
hibernat基础教程_第2页
hibernat基础教程_第3页
hibernat基础教程_第4页
hibernat基础教程_第5页
已阅读5页,还剩170页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hibernate-对象对象/关系映射关系映射第三讲 Hibernate框架q要求要求:熟悉Java、SQL、JDBC,掌握面向对象的开发方法。q课程目标:课程目标:理解O/R Mapping原理,掌握Hibernate开发的相关知识,并能使用Hibernate进行实际项目开发。一、要求与目标一、要求与目标模型不匹配(阻抗不匹配)Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等。解决办法1、使用JDBC手工转换。2、使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibern

2、ate、TopLink、OJB。二、引入二、引入三、 O/R Mapping介绍ORM的全称是Object/Relation Mapping,即对象/关系映射。ORM也可理解是一种规范,具体的ORM框架可作为应用程序和数据库的桥梁。面向对象程序设计语言与关系数据库发展不同步时,需要一种中间解决方案,ORM框架就是这样的解决方案。ORM并不是一种具体的产品,而是一类框架的总称,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系数据库的映射。基于ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。目前ORM的产品非常多,比如Apache组织下的O

3、JB,Oracle的TopLink,JDO,JPA等等。对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。O/R Mapping的优点的优点提高生产效率可维护性更好性能厂商独立性四、四、O/R Mapping的优点的优点五、目前流行的五、目前流行的ORM持久层可选方案持久层可选方案优点优点缺点缺点SQL/JDBC成熟,流行,使用DAO模式代码烦杂,可读性差,维护困难,移植困难Entity BeanCMP(EJB1.1之后),未来的EJB3错误的设计。不可移植,依赖性强,不可

4、序列化,不支持多态的关联查询JDO简单、透明、标准不够成熟Apache OJB性能、稳定性,属于Apache 基金组织文档资源太少,支持标准太多成了负担iBATIS可以控制更多的数据库操作细节。实用于遗留系统的改造和对既有数据库的复用。持久层封装不够彻底,只是一个DBHelper。Hibernate成熟、流行、功能强大。并逐渐发展成Java 持久层事实上的标准。不够透明六、为什么要选择Hibernate Hibernate能在众多的ORM框架中脱颖而出,因为Hibernate与其他ORM框架对比具有如下优势:1、开源和免费的License,方便需要时研究源代码、改写源代码、进行功能定制。2、轻

5、量级封装,避免引入过多复杂的问题,调试容易,可减轻程序员负担。3、具有可扩展性,API开放。功能不够用时,可自己编码进行扩展。4、开发者活跃,产品有稳定的发展保障。Hibernate的工作方式 灵巧的设计,出色的性能表现七、 Hibernate概述 Hibernate是一个免费的开源Java包,是目前最流行的ORM框架,它是一个面向Java环境的对象/关系数据库映射工具。也是一个轻量级的O/R Mapping框架,它问世的时间并不长,但已经成为目前最流行的持久层解决方案。 它使得程序与数据库的交互变得十分容易,更加符合面向对象的设计思想,像数据库中包含普通Java对象一样,而不必考虑如何把它们

6、从数据库表中取出。使开发者可以专注于应用程序的对象和功能,而不必关心如何保存它们或查找这些对象。甚至在对SQL语句完全不了解的情况下,使用hibernate仍然可以开发出优秀的包含数据库访问的应用程序。八、八、 持久化层含义持久化层含义基于B/S的典型三层架构 访问数据库代码(Dao)与业务逻辑(Service)混杂在一起带来了很多问题,这样的程序设计严重限制了程序的可扩展性和适应性,所以有必要要把涉及数据库操作的代码分离出来与业务逻辑分离。就形成了所谓“持久化层”的概念。 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将

7、内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。八、八、 持久化层含义持久化层含义九、九、ORM工具实现持久化示意图工具实现持久化示意图如何进行对象关系数据库的匹配如何进行对象关系数据库的匹配public class User private String name; private String password;private String address;create table t_user ( name varchar(255) not null , password varchar(255),.primary key (name) 如何进行对象

8、如何进行对象关系数据库的匹配?关系数据库的匹配?对象对象关系数据库关系数据库类表类的属性(基本类型)表的列一对多,多对一外键多对多关联表继承单表继承、具体表继承、类表继承十、十、Hibernate入门入门Hibernate概述概述 Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。Hibernate优势优势开源(LGPL)成熟流行自定义API提高开发者工作效率十一、下载Hibernatel下载地址,本教程使用3.2.5。l将下载目录/hibernate3.jar和/lib下的hibern

9、ate运行时必须的包加入classpath中:antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar十二、Hibernate工作原理1. 读取并解析配置文件2. 读取并解析映射信息,创建SessionFactory3. 打开Sesssion4. 创建事务Transation5. 持久化操作6. 提交事务7. 关闭Session8. 关闭SesstionFactory启动Hibernate 构建Configuration实例,初始化该实例中的所有变量 Configurati

10、on cfg = new Configuration().configure(); 加载hibernate.cfg.xml文件至该实例内存 通过hibernate.xfg.xml文件中的mapping节点配置,加载hbm.xml文件至该实例内存利用上面创建的Configuration实例构建一个SessionFactory实例 SessionFactory sf = cfg.buildSessionFactory(); 由上面得到的SessionFactory实例创建连接 Session s = sf.openSession(); 由上面得到的Session实例创建事务操作接口Transact

11、ion的一个实例tx Transaction tx = s.beginTransaction(); 通过Session接口提供的各种方法操作数据库的访问 提交数据库的操作结果 mit(); 关闭Session链接 s.close(); 十二、Hibernate工作原理开始启动hibernate构建configuration实例,初始化该实例中的所有变量加载hibernate.cfg.xml文件至该实例(内存)通过hibernate.cfg.xml文件中的mapping节点配置加载*.hbm.xml至该实例(内存)利用configuration实例创建一个工厂类SessionFactory实例S

12、essionFactory类创建连接SessionFactory实例创建事务接口通过session接口提供的各种方法操纵数据库提交数据库事务关闭session十二、Hibernate工作原理十三、十三、Hibernate开发步骤开发步骤一、持久化类的设计一、持久化类的设计二、持久化类和关系数据库二、持久化类和关系数据库的映射的映射三、应用的开发三、应用的开发十四、持久化十四、持久化Java类必须遵循的原则类必须遵循的原则1、为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。2、实现一个默认的构造方法(constructor)。这样的话

13、Hibernate就可以使用Constructor.newInstance()来实例化它们。3、如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。4、提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpdate()。一、建立数据库和表数据库名main表名和结构如下:表名:stuInt id;varchar xm;varchar sex; Date sr;十五、Hibernate简单实例二、导入hibernate包 导入数据库包十五、十五、Hibe

14、rnate简单实例简单实例十五、十五、Hibernate简单实例简单实例三、建立持久化类package ;import java.util.Date;public class Stu private Integer id;private String xm;private String sex;private Date sr;public Integer getId() return id;public void setId(Integer id) this.id = id;public String getXm() return xm;public void setXm(String xm)

15、 this.xm = xm;public String getSex() return sex;public void setSex(String sex) this.sex = sex;public Date getSr() return sr;public void setSr(Date sr) this.sr = sr;十五、十五、Hibernate简单实例简单实例四、建立持久化类映射文件*.hbm.xml如 Stu.hbm.xml 五、在SRC目录下配置 hibernate.cfg.xml文件十五、十五、Hibernate简单实例简单实例org.hibernate.dialect.My

16、SQLDialectjdbc:mysql:/localhost:3306/testrootrootcom.mysql.jdbc.Driversunli jdbc:mysql:/localhost:3306/main?useUnicode=true&characterEncoding=gbk乱码的解决六、建立操作类 StuDao.javapackage ;import java.util.List;import org.hibernate.Hibernate;import org.hibernate.Query;import org.hibernate.Session;impor

17、t org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class StuDAO public void add(Stu u) Configuration cfg=new Configuration(); cfg.configure(); SessionFactory sf=cfg.buildSessionFactory(); Session s=sf.openSession(); Transaction tx=s.beginTra

18、nsaction(); s.save(u); mit(); 十五、十五、Hibernate简单实例简单实例七、调用实例化类操作数据库 % SimpleDateFormat sd=new SimpleDateFormat(yyyy-mm-dd); StuDAO d=new StuDAO(); Stu s=new Stu(); s.setId(new Integer(1005); s.setSex(t); s.setSr(sd.parse(1981-01-01); s.setXm(sunli); d.add(s);十五、十五、Hibernate简单实例简单实例十六、十六、Hibernate核心接口

19、核心接口十六、十六、Hibernate核心接口核心接口1. Configuration接口Configuration负责管理Hibernate的配置信息。Hibernate运行时需要一些底层实现的基本信息。运行时需要一些底层实现的基本信息。这些信息包括:这些信息包括:数据库URL、数据库用户名、数据库用户密码、数据库JDBC驱动类、数据库dialect。用于对特定数据库提供支持,其中包含了。用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如针对特定数据库特性的实现,如Hibernate数据库数据库类型到特定数据库数据类型的映射等。类型到特定数据库数据类型的映射等。n使用Hiber

20、nate必须首先提供这些基础信息以完成初始化工作,为后续操作做好准备。n这些属性在Hibernate配置文件hibernate.cfg.xml中加以设定,当调用:Configuration config=new Configuration().configure();时,Hibernate会自动在目录下搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置。十六、十六、Hibernate核心接口核心接口2. SessionFactory接口SessionFactory负责创建负责创建Session实例,可以通过实例,可以通过Configuration实例构建实例构

21、建SessionFactory。Configuration实例实例config会根据当前的数据库配置信息,构造会根据当前的数据库配置信息,构造SessionFacory实例并返回。实例并返回。SessionFactory一旦构造完毕,即一旦构造完毕,即被赋予特定的配置信息。也就是说,之后被赋予特定的配置信息。也就是说,之后config的任何变更的任何变更将不会影响到已经创建的将不会影响到已经创建的SessionFactory实例实例sessionFactory。如果需要使用基于变更后的如果需要使用基于变更后的config实例的实例的SessionFactory,需,需要从要从config重新构

22、建一个重新构建一个SessionFactory实例。实例。nSessionFactory保存了对应当前数据库配置的所有映射关系,同时也保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和负责维护当前的二级数据缓存和Statement Pool。由此可见,。由此可见,SessionFactory的创建过程非常复杂、代价高昂的创建过程非常复杂、代价高昂。这也意味着,在系。这也意味着,在系统设计中充分考虑到统设计中充分考虑到SessionFactory的的重用策略重用策略。由于。由于SessionFactory采用了线程安全的设计,可由多个线程并发调用。采用了线程安全的设计,可

23、由多个线程并发调用。Configuration config=new Configuration().configure();SessionFactory sessionFactory=config.buildSessionFactory();十六、十六、Hibernate核心接口核心接口3. Session接口Session是是Hibernate持久化操作的基础,提供了众持久化操作的基础,提供了众多持久化方法,如多持久化方法,如save、update、delete等。通等。通过这些方法,透明地完成对象的增加、删除、过这些方法,透明地完成对象的增加、删除、修改、查找等操作。修改、查找等操作。同

24、时,值得注意的是,同时,值得注意的是,Hibernate Session的设计是的设计是非线程安全的,即一个非线程安全的,即一个Session实例同时只可由实例同时只可由一个线程使用。一个线程使用。同一个同一个Session实例的多线程并实例的多线程并发调用发调用将导致难以预知的错误。将导致难以预知的错误。Session实例由实例由SessionFactory构建:构建:Configuration config=new Configuration().configure();SessionFactory sessionFactory=config.buldSessionFactory();Se

25、ssion session=sessionFactory.openSession();十六、十六、Hibernate核心接口核心接口4. Transaction接口Transaction是是Hibernate中进行事务操作的接口中进行事务操作的接口,Transaction 接口是对实际事务实现的一个抽象,接口是对实际事务实现的一个抽象,这些实现包括这些实现包括JDBC的事务、的事务、JTA 中的中的UserTransaction,甚至可以是,甚至可以是CORBA 事务。事务。之所以这样设计是可以让开发者能够使用一个之所以这样设计是可以让开发者能够使用一个统一的操作界面,使得自己的项目可以在不同

26、统一的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。事务对象通过的环境和容器之间方便地移值。事务对象通过Session创建。例如以下语句:创建。例如以下语句:Transaction ts=session.beginTransaction();mit();十六、十六、Hibernate核心接口核心接口5. Query接口例如以下语句:例如以下语句:在后面设置其值:在后面设置其值:上面的方法是通过上面的方法是通过“?”来设置参数,还可以用来设置参数,还可以用“:”后跟变量的方法来设置后跟变量的方法来设置参数,如上例可以改为:参数,如上例可以改为:或者:或者:Query还有一个还有一

27、个list()方法,用于取得一个方法,用于取得一个List集合的示例,此示例中包括可能集合的示例,此示例中包括可能是一个是一个Object集合,也可能是集合,也可能是Object数组集合。例如:数组集合。例如:Query query=session.createQuery(“from Kcb where kch=100”);Query query=session.createQuery(from Kcb where kch=?);query.setString(0, 要设置的值);Query query=session.createQuery(from Kcb where kch=:kchVa

28、lue);query.setString(kchValue,要设置的课程号值);query.setParameter(0, 要设置的值);Query query=session.createQuery(from Kcb where kch=198);List list=query.list();十七、Configuration配置 概述:概述:Configuration 类负责管理Hibernate 的配置信息。它包括如下内容:Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。Hibernate映射文件(*.cfg.xml)。

29、Hibernate配置的两种方法:配置的两种方法:属性文件(perties)。调用代码:Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml)。调用代码:Configuration cfg = new Configuration().configure();Configuration接口配置文件hibernate.cfg.xml 常用参数数据库连接的配置数据库连接的配置hibernate.dialect org.hibernate.dialect.MySQLDialecthibernate.c

30、onnection.driver_class com.mysql.jdbc.Driverhibernate.connection.url jdbc:mysql:/localhost/hibernatehibernate.connection.username roothibernate.connection.password roothibernate.show_sql truehibernate.jdbc.fetch_size 50设定设定JDBC的的Statement读取数据的时候每次从数据库中取出的记录条数读取数据的时候每次从数据库中取出的记录条数 hibernate.jdbc.batc

31、h_size 25是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!hibernate.cfg.xmltrueorg.hibernate.dialect.MySQLDialectcom.mysql.jdbc.Driverjdbc:mysql:/localhost/hibernatero

32、otroot 十八、十八、SessionFactory概述:概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。调用代码:调用代码:SessionFactory sessionFactory = cfg.buildSessionFactory();十九、十九、Session(会话会话)概述:概述:S

33、ession不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。 Session也称为持久化管理器,因为它是与持久化有关的操作接口。 Session通过SessionFactory打开,在所有的工作完成后,需要关闭。它与Web层的HttpSession没有任何关系。调用代码调用代码Session session = sessionFactory.openSession();保存用户:session.save(Person);查询用户:load(Class theClass, Serializable id ) get(Class theC

34、lass, Serializable id )修改用户:session.update(Person);保存或修改用户:session.saveOrUpdate(Person);删除用户:session.delete(Person);删除所有用户:session.delete(“from Person ”);二十、二十、Transaction(事务事务)概述:概述: 它将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器

35、中的可移植性。调用代码:调用代码: Transaction tx = session.beginTransaction();注:注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。项目步骤1、建立web项目2、导入数据库包和hibernate包3、编写持久化类4、编写持久化类的映射文件5、编写 hibernate.cfg.xml数据库配置文件6、编写操作类接口7、编写工具类8、编写实现类实现操作类接口9、页面中调用实现类二十一、综合举例6、编写操作类接口StuDAO.javapackage ;import java.

36、util.List;public interface StuDAO public void saveUser(Stu user);public Stu findUserByName(String name);public Stu findUserById(Integer id);public void updateUser(Stu user);public void remove(Stu user);public List findall();二十一、综合举例7、编写工具类 HibernateUitl.javapackage ;import org.hibernate.Session;impo

37、rt org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public final class HibernateUitl private static SessionFactory sessionFactory;private HibernateUitl() static /static语句块类加载时仅被执行一次Configuration cfg = new Configuration();cfg.configure();sessionFactory = cfg.buildSessionFactory();p

38、ublic static SessionFactory getSessionFactory() return sessionFactory;public static Session getSession() return sessionFactory.openSession();二十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapackage ;import java.util.List;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.Session;impor

39、t org.hibernate.Transaction;import org.hibernate.criterion.Restrictions;二十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic class StuDAOimpl implements StuDAO public Stu findUserById(Integer id) Session s = null;try s = HibernateUitl.getSession();Stu user =(Stu)s.get(Stu.class, id);return user; finally if (

40、s != null)s.close();二十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic Stu findUserByName(String name) Session s = null;try s = HibernateUitl.getSession();Criteria c = s.createCriteria(Stu.class);c.add(Restrictions.eq(xm, name);Stu user =(Stu) c.uniqueResult();return user; finally if (s != null)s.close();二

41、十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic Stu findUserByName1(String name) Session s = null;try s = HibernateUitl.getSession();String hql = from Stu as u where u.xm=:n;Query q = s.createQuery(hql);q.setString(n, name);Stu user = (Stu) q.uniqueResult();return user; finally if (s != null)s.close();二十

42、一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic void remove(Stu user) Session s = null;Transaction tx = null;try s = HibernateUitl.getSession();tx = s.beginTransaction();s.delete(user);mit(); finally if (s != null)s.close();二十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic void saveUser(Stu user) Session s = nu

43、ll;Transaction tx = null;try s = HibernateUitl.getSession();tx = s.beginTransaction();s.save(user);mit(); finally if (s != null)s.close();二十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic void updateUser(Stu user) Session s = null;Transaction tx = null;try s = HibernateUitl.getSession();tx = s.beginTransa

44、ction();s.update(user);mit(); finally if (s != null)s.close();二十一、综合举例8、编写实现类实现操作类接口StuDAOimpl.javapublic List findall()Session s = null;Transaction tx = null;try s = HibernateUitl.getSession();String queryString = from Stu;Query query = s.createQuery(queryString);return query.list(); finally if (s

45、!= null)s.close();二十一、综合举例9、页面中调用实现类 insert.jsp二十一、综合举例9、页面中调用实现类 findall.jsp% StuDAOimpl d=new StuDAOimpl(); List l=null; l=d.findall(); for(int i=0;il.size();i+) Stu s=(Stu)(l.get(i); out.print(s.getId(); out.print(s.getXm(); out.print(s.getSex(); out.print(s.getSr(); out.print(); %二十一、综合举例9、页面中调用

46、实现类 findbyid.htm 请输入你要查找学生的学号 二十一、综合举例9、页面中调用实现类 findbyid.jsp 二十一、综合举例9、页面中修改记录update1.jsp(步骤一)% StuDAOimpl d=new StuDAOimpl(); List l=null; l=d.findall(); for(int i=0;il.size();i+) Stu s=(Stu)(l.get(i); out.print(s.getId(); out.print(s.getXm(); out.print(s.getSex(); out.print(s.getSr(); out.print(修

47、改修改);out.print(); %二十一、综合举例9、页面中修改记录update2.jsp(步骤二)二十一、综合举例 学号:input type=text name=userid value= readonly/ 姓名:input type=text name=username value=/ 性别:input type=text name=usersex value=/ 学号:input type=text name=usersr value=/ 9、页面中修改记录update3.jsp(步骤三) 二十一、综合举例二十二、缓存 缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用

48、缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。 一级缓存,Session级共享save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。 二级缓存,SessionFactory级共享 实现为可插拔,可以通过实现CacheProvider和Cache接口来加入Hibernate不支持的缓存实现。二十二、缓存二十二、缓存 使用EhCache配置二级缓存 1、加入ehcac

49、he-1.2.3.jar(已在hibernate包中)到当前项目的lib下。 2、在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。 3、拷贝Hibernate安装目录的etc下ehcache.xml文件到src目录中。true *指定二级缓存产品的提供商; org.hibernate.cache.ehcacheprovider 二十三、二十三、Hibernate中对象的状态中对象的状态瞬时对象瞬时对象(Transient Objects)(临时状态临时状态):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的

50、行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。 持久对象持久对象(Persist Objects):持久实例是任何具有数据库标识的实例。它由持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时会和数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。离线对象离线对象(Detached Objects) (脱管状态脱管状态):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate

51、管理。实例的状态一个持久化类的实例可能处于三种不同状态中的某一种。这三种状态的定义则与所谓的持久化上下文(persistence context)有关。Hibernate的Session对象就是这个所谓的持久化上下文:临时状态: 不曾进行持久化,未与任何Session相关联持久化状态: 仅与一个Session相关联游离状态: 已经进行过持久化,但当前未与任何Session相关联二十四、二十四、Hibernate查询查询概述:概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。面向对象的查询语言,与SQL不同,HQL中的对象名

52、是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:Query q = session.createQuery(hql);nfrom Personnfrom User user where =:namenfrom User user where =:name and user.birthday :birthday Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:Criteria crit = session.createC

53、riteria(DomainClass.class);简单属性条件如:criteria.add(Restrictions.eq(propertyName, value),criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName)HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。24.1.1 HQL基础HQL 查询依赖于Query类,每个Query 实例对应一

54、个查询对象。使用HQL 查询可按如下步骤进行:(1)获取HibernateSession对象;(2)编写HQL语句;(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;(4)如果HQL语句包含参数,调用Query 的setXxx方法为参数赋值;(5)调用Query对象的list等方法遍历查询结果。用from子句指定数据表from子句是最简单的HQL语句,也是最基本的HQL语句。from关键字后紧跟持久化类的类名。例如:from Person表明从Person 持久化类中选出全部的实例。大部分时候,推荐为该Person的每个实例起别名。例如: HQL: fro

55、m Person as p SQL : Select * from Person as p24.1.2 HQL查询Query接口Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。调用代码:调用代码:Query query = session.createQuery(“from Person”); 查询用户名为“ff”的用户:Query query = session.createQuery(from Person as person where = :ff);query.setParameter(“ff,

56、person.getName(); Person p = (Person) query.list().get(0);1.3.1 Query用两个方法进行查询结果遍历(1)Iterate() (2)list()1.3.2 Iterate与list的区别1、返回的类型不一样,list()返回List, iterate()返回Iterator。2、 获取数据的方式不一样,list()会直接查数据库, iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。3、iter

57、ate会查询级缓存,list只会查询一级缓存。4、list()中返回的List中每个对象都是原本的对象, iterate()中返回的对象是代理对象24.1.3 Query查询结果遍历查询结果遍历Session session = sessionFactory.openSession();Query query = session.createQuery(from User);Iterator users = query.iterate(); while(users.hasNext() User s = (User)itr.next(); out.print(s.getId(); out.pri

58、nt(s.getXm(); out.print(s.getSex(); out.print(s.getSr(); out.print(); Iterate方式List方式 Session session = sessionFactory.openSession(); Query query = session.createQuery(from User);List l = query.list();for(int i=0;iusers.size();i+) User s=(User)(l.get(i); out.print(s.getId(); out.print(s.getXm(); out

59、.print(s.getSex(); out.print(s.getSr(); out.print(); 24.1.4 用Query接口简单分页 如果需要指定结果集的范围(希望返回的最大行数/或开始的行数),应该使用Query接口提供的方法:Query q = sess.createQuery(from Person person);q.setFirstResult(1);q.setMaxResults(10);List persons = q.list();24.1.5 用where子句添加查询条件where子句用于筛选选中的结果,缩小选择的范围。如果没有为持久化实例命名别名,可以直接使用属

60、性名引用属性。如下面的HQL查询语句:from Person where name like tom%from Person where name like _tom 如果为持久化实例命名了别名,则应该使用完整的属性名。from Person as p where like tom%复合属性表达式加强了where子句的功能,例如如下HQL查询语句:from Person p where p.address.country like us%模糊查询:模糊查询:查询用户名以“李”开头的所有用户。Query query = session.createQuery(from Person as

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论