




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hibernate教程,Confidential,课程目标,了解持久层的意义 掌握Hibernate的体系结构 掌握Hibernate开发,课程内容,持久层概述 Hibernate基础 Hibernate映射 Hibernate数据检索 Hibernate高级特性 Hibernate最佳实践 Hibernate资源,持久层概述,Hibernate教程,1.持久层的位置,表现层 (Presentation Layer),Struts,Action ,FormBean,配置文件,模板页面,业务逻辑层 (Business Layer),Spring,IoC容器,AOP,Hibernate支持,事务管
2、理,持久化层 (Data Access Layer),Domain Model Business Objects,Hibernate,映射文件,Hibernate接口,DAO模式,IoC,IoC,2.持久层实现模式,混杂模式 混杂模式是持久化功能的原始实现模式。即在业务类中混杂JDBC访问代码,从而提供所需的持久化功能。,JDBC,Business Classes,关系数据库,基于Data Class的持久层实现模式 数据类(Data Class)作为业务类与持久层沟通的桥梁,起着承上启下的作用。常见的DAO模式就是这种模式的典型实现。Data Class实际上包含了DAO模式中的Domain
3、 Class/Object 和Data Accessor Class。Domain Class作为对现实世界的抽象,起着信息携带者的作用,而Data Accessor Class则通过JDBC代码将Domain Class与数据库相关联。,JDBC,Business Classes,关系数据库,Data Classes,基于现有持久层框架的实现模式 此模式是第二种模式的延伸。Data Classes所包含的Data Accessor和Domain Class数量并没有减少,只是把其中最繁琐的工作基于JDBC的OR映射工作,交由第三方组件来完成。从而Data Accessor中的繁琐编码工作得到
4、简化。,JDBC,Business Classes,关系数据库,Data Classes,持久层组件,3.持久层可选方案,4.什么是O/R Mapping?,什么是O/R Mapping? 对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。,5.O/R Mapping的优点,O/R Mapping的优点 提高生产率(Productivity) 可维护性(Maintainability) 更好性能(Performance) 厂商独立性(Vendor independence)
5、,Hibernate基础,Hibernate教程,Hibernate概述 Hibernate核心接口 Hibernate基础配置,1.Hibernate概述,Hibernate概述 Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。 Hibernate优势 开源(LGPL) 成熟 流行(约13 000 downloads/month) 自定义API JBoss 将用Hibernate3实现Entity Beans,1.1.Hibernate体系结构,1.2.Hibernate与关系数据库的映射,Xdoclet:它通过在Java源代码
6、中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件( XDoclet提供了对Hibernate的支持,这样我们可以直接由Java代码生成Hibernate映射文件。,Middlegen: 从数据库中已有 的表结构中生成Hibernate映射文 件。当前版本是2.1可以去http:/boss.bekk.no/boss/middlegen下载。,2.Hibernate核心接口,这几个核心接口几乎在任何实际开发中都会用到。通过这些接口,不仅可以存储和获得持久对象,并且能够进行事务控制。 Con
7、figuration接口 SessionFactory接口 Session接口 Transaction接口 Query和Criteria接口,2.1.Configuration接口,Configuration 接口负责管理Hibernate 的配置信息。它包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。 Hibernate映射文件(*.hbm.xml)。 Hibernate配置的两种方法: 属性文件(Hperties)。 调用代码:Configuration config = new
8、Configuration(); Xml文件(Hibernate.cfg.xml)。 调用代码:Configuration config = new Configuration().configure();,Configuration例子,数据库连接的配置 Hibernate.dialect net.sf.Hibernate.dialect.MySQLDialect Hibernate.connection.driver_class com.mysql.jdbc.Driver Hibernate.connection.url jdbc:mysql:/localhost/Hibernate Hi
9、bernate.connection.username root Hibernate.connection.password 111111 数据库连接池的配置 Hvider_class net.sf.Hibernate.connection.DBCPConnectionProvider 其它 Hibernate.show_sql true Hibernate.jdbc.fetch_size 50 Hibernate.jdbc.batch_size 25,2.2.SessionFactory接口,概述 应用程序从SessionFactory(会话工厂
10、)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。 创建SessionFactory Configuration config=new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory();,2.3.Session接口,概述
11、Session是Hibernate持久化操作的基础,与传统意义上的Web层的HttpSession没什么关系。Hibernate Session之与Hibernate,相当于JDBC Connecgtion相对于JDBC。 Session作为贯穿Hibernate的持久化管理器核心,提供了众多持久化方法,如:save,update,delete等。提供了透明地完成了对象的增删查改操作(CRUD)。 Session不是线程安全的,它代表与数据库之间的一次操作。 Session通过SessionFactory打开,在所有的工作完成后,需要关闭。 Session创建 Configuration co
12、nfig=new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); 创建以后可以调用Session所提供的save、get、delete等方法进行持久化操作。,save User user=new User(); user.setName(“John”); session.save(user); get User user=(User)session.get(User.
13、class,new Integer(1); delete User user=(User)session.get(User.class,new Integer(1); sesson.delete(user); Query查询 Query query=session.createQuery(“from User user where like ?”); query.setParameter(0,”John”); List list=query.List(); ,Criteria查询 Criteria criteria=session.createCriteria(User.c
14、lass”); criteria.add(Restrictions.eq(“name”,”John”); List list=criteria.List(); ,2.4.Transaction接口,概述: 它将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。 调用代码: Transaction tx = session.beginTransaction(); mit(); 注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=f
15、alse)。,2.5. Query和Criteria接口,概述 Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。 Criteria接口与Query接口非常类似,它允许你创建并执行面向对象的标准化查询。 值得注意的是Query接口也是轻量级的,它不能在Session之外使用调用代码: 调用代码 Query接口 Query query=session.createQuery(“from User”); List users=query.list(); Criteri
16、a接口 Criteria criteria=session.createCriteria(User.class); criteria.add(Restrictions.eq(“name”,”John”); criteria.add(Restrictions.eq(“sex”,new Integer(1); List users=criteria.list();,2.6. 应用示例,持久化类User.java public class User private Long id; private String name; private Date birthday; private String
17、email; public User() public User(String name,Date birthday,String email) /Getter/Setter ,映射文件User.hbm.xml ,应用UserTest.java,public void testCreate() throws Exception Configuration cfg = new Configuration(); cfg.addURL(UserTest.class.getResource(/com/test/um/User.hbm.xml); SessionFactory sessionFactor
18、y = cfg.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); SimpleDateFormat format = new SimpleDateFormat(yyyy-mm-dd); User user = new User(Jack,format.parse(1980-04-12),J); session.save(user); mit(); assertNotNull(user.getId(); sessio
19、n.clear(); User user_2 = (User)session.get(User.class,user.getId(); assertNotNull(user_2); session.close(); ,应用UserTest.java,保存用户:session.save(user); 修改用户:session.update(user); 保存或修改用户:session.saveOrUpdate(user); 删除用户:session.delete(user); 删除所有用户:session.delete(“from User ”); 查询用户名为“test”的用户: Query
20、query = session.createQuery(from User where = :name); query.setParameter(“name,user.getName(); User findUser = (User) query.list().get(0);,Hibernate的配置文件可以有两种格式:perties与hibernate.cfg.xml。配置项大部分都预设了默认值,使用时只需根据实际情况对所需属性进行配置即可。 常见配置项,3. 基础配置,典型hibernate.cfg.xml的配置文件结构 hibernate.c
21、fg.xml,Hibernate教程,Hibernate映射,Hibernate基本数据类型 映射基础 关联关系映射 继承映射,1.Hibernate基本数据类型,Hibernate提供了丰富的数据类型支持,其中包括了传统的Java数据类型,如String、Integer,以及JDBC数据类型,如Clob,Blob等。 Java原始类型-1,Hibernate基本数据类型,Java原始类型-2,大数据类型,2.映射基础,实体映射技术作为类与表之间的联系纽带,在ORM实现中起着至关重要的作用。对于Hibernate用户而言,映射关系更多地体现在配置文件的维护过程中。Hibernate选用XML作
22、为映射配置文件的基础形式。 实体映射的核心内容,即实体类与数据库表之间的映射定义。Hibernate中,类表映射主要包括: 类/表映射 主键id映射 属性/字段映射 复合主键映射,2.1.类/表映射, (1) name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。 (2) table (可选 - 默认是类的非全限定名): 对应的数据库表名。 (3) dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。 (4) dynam
23、ic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。,2.2.主键-id映射, (4) (5) (1)、name (可选) :标识属性的名称。 (2)、type(可选):标识Hibernate类型的名字。 (3)、column(可选默认为属性名):对应数据库表的主键字段的名字。 (4)、unsaved-value(可选默认为null):这个值用来判断对象是否要保存。 (5)、主键生成方式。,主键生成方式:,assigned 主键由应用逻辑产生,数据交由Hibernate保存时,主键值已经设置完成,无需Hibern
24、ate干预。 hilo 通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态 seqhilo 与hilo类似,通过hilo算法实现主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。 increment 主键按数值顺序递增。 identity 采用数据库提供的主键生成机制,如SQL Server,MySQL中的自增长主键生成机制,sequence 采用数据库提供的sequence机制生成主键,如Oracle Sequence native 由Hibernate根据数据库适配器中的定义,自动采用identity、hi
25、lo、sequence的其中一种作为主键生成方式 uuid.hex 由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4个参数生成十六进制数值(编码后以长度为32位的字符串表示)作为主键。利用uuid.hex方式生成主键将提供最好的数据插入性能和数据库平台适应性 uuid.String 与uuid.hex类似,只是生成的主键不进行编码(长度16位),2.3.属性/字段映射, (1) Name:指定了映射类中的属性名为” propertyName”,此属性将被映射到指定的库表字段。 (2) column(可选):指定了库表中对应映射类属性的字段名
26、。 (3) type(可选):指定了映射字段的数据类型 (4) update, insert (可选 - 默认为 true) :表明在用于UPDATE 和/或 INSERT的SQL语句中是否包含这个字段。 (5) formula (可选): 一个SQL表达式,定义了这个计算(computed) 属性的值。计算属性没有和它对应的数据库字段。,2.4.复合主键映射,Hibernate中,通过composite-id节点对复合主键进行定义。 定义方式有两种: 基于实体类属性的复合主键 基于主键类的复合主键,2.4.1.基于实体类属性的复合主键,定义: User实体类: Public class Us
27、er implements Serializable private String firstname; private String lastName; private Integer age; /getter and setter public boolean equals(Object object) public int hashCode() ,查找方法: User user=new User(); user.setFirstname(“小小”); user.setLastname(“张”); user=(User)session.load(User.class,user); Syst
28、em.out.println(“User age is=”+user.getAge();,2.4.2.基于主键类的复合主键,定义: UserPK主键类: Public class UserPK implements Serializable private String firstname; private String lastName; /getter and setter /equals and hashCode ,User实体类: Public class User implements Serializable private Integer age; private UserPK
29、userpk; /getter and setter 查找方法: UserPK userpk=new UserPK(); userpk.setFirstname(“小小”); userpk.setLastname(“张”); User user=(User)session.load(User.class,userpk); System.out.println(“User age is=”+user.getAge();,3. 关联关系映射,一对一关联 一对多关联 多对多关联,3.1.一对一关联,一对一关联包括两种形式: 主键关联 惟一外键关联,3.1.1主键关联,一对一主键关联形式即两张关联表通
30、过主键形式一对一映射关系。Hibernate中,通过one-to-one节点对一对一关系进行定义。典型实例:中国公民只允许拥有一份护照。 User.hbm.xml ,1.一对一映射节点,2.级联关系,Passport.hbm.xml user ,1.foreign主键生成,3.约束,2.一对一映射节点,对关联对象的保存: User user=new User(); user.setAge(new Integer(20); user.setName(“张小小”); Passport passport=new Passport (); passport.setSerial(“PDR1234567”
31、); passport.setExpiry(new Integer(20080101); /相互设置关联 passport.setUser(user); user.setPassport(passport); Transaction tx=session.beginTransaction(); session.save(user) mit();,1.由于User类的one-to-one节点被设置为cascade=“all”,其关联的passport对象将被级联保存。,3.1.2唯一外键关联,唯一外键关联的一对一关系只是多对一关系的一个特例。 假定在一个特定的用户管理系统中,每个用户(User)
32、都从属于一个用户组(Group),: Hibernate节点定义如下 ,1.多对一映射节点,2.关联字段,运行测试代码 User user=(User)session.load(User.class,new Integer(1); System.out.println(“Group name=”+user.getGroup().getName(); 屏幕输出: Hibernate: select t_user.id as id1_, left outer join t_group on t_user.group_id=t_group.group_id where t_user.id=? Gro
33、up name=My Group,1.Hibernate输出的SQL,2.程序输出,3.2.一对多关联,一对多关联在系统实现中应用得非常广泛。比如:每个用户关联到多个地址。 一对多关联包括两种形式: 单向一对多关联 双向一对多关联 单向一对多关联只需在”方进行配置,双向一对多需要关联双方均加以配置。,3.2.1单向一对多关联,User.hbm.xml ,1.级联关系,2.排序方式,3.外键,为已有用户增加地址对象 Transaction tx=session.beginTransaction(); Address addr=new Address(); addr.setTel(“8602888
34、8”); addr.sestZipcode(“517099”); addr.setAddress(“ShenZhen”); user.getAddresses().add(addr); session.save(user); mit();,1. 通过主控对象级联更新,Hibernate自动新增t_address表的记录。,3.2.2双向一对多关联,双向一对多关联,实际上是”一对多”和”多对一”关联的组合。必须在主控方配置单向”一对多”关系的基础上,在被控方配置与其对应的”多对一”关系 User.hbm.xml ,1.延迟加载,2.控制方向反转,决定关联关系由谁来维护,Address.hbm.x
35、ml ,维护关系 Transaction tx=session.beginTransaction(); Address addr=new Address(); addr.setTel(“86028888”); addr.sestZipcode(“517099”); addr.setAddress(“ShenZhen”); addr.setUser(user); user.getAddresses().add(addr); session.save(user); mit(); 问题:为什么User.hbm.xml文件里的inverse设置成”true”?,1. 设置关联的User对象,2. 级联
36、更新,3.3.多对多关联,由于引入了中间表,一次读取操作需要反复数次查询,多对多关联的性能不佳,设计时应该尽量避免大量使用。 在一个权限管理系统中,一个常见的多对多的映射关系是Role与Privilege之间的映射: Role代表”角色”(如:会计、出纳) Privilege代表某个特定资源的访问特权(如修改财务报表,查询财务报表) 一个Role可以有多种Privilege,一个Privilege可同时属于多个Role,Role.hbm.xml ,1. t_role_privilege为t_role和t_privilege之间的映射表,2. 一般情况下设为”save-update”,对于多对多
37、逻辑而言,很少出现删除一方需要删除所有关联另一方所有的数据。,3. 映射表中对于t_role表记录的标识字段,4. 映射表中对于t_privilege表记录的标识字段,Privilege.hbm.xml ,保存关系代码: Role role1=new Role(); role1.setName(“Role1”); Role role2=new Role(); role2.setName(“Role2”); Privilege privilege1=new Privilege(); privilege1.setName(“Privilege1”); Privilege privilege2=ne
38、w Privilege(); privilege2.setName(“Privilege2”); Privilege1.getRoles().add(role1); Privilege1.getRoles().add(role2); Privilege2.getRoles().add(role1); role1.getPrivileges.add(privilege1); role1.getPrivileges.add(privilege2);,role2.getPrivileges.add(privilege1); Try Transaction tx = session.beginTran
39、saction(); /多对多关系必须同时对关联双方进行保存 session.save(role1); session.save(role2); session.save(privilege1); session.save(privilege2); mit(); catch(Exception e) ,4. 继承映射,继承关系是关系型数据与面向对象数据结构之间的主要差异之一。Hibernate支持三种类型的继承关系 每个具体类一张表(Table per concrete class) 表与子类之间的独立一对一关系 每个子类一张表(Table per subclass) 每个子类对应一张子表,并
40、与主类共享主表 每个类分层结构一张表(Table per class hierarchy) 表与类的一对多关系,4.1.实例场景-类图,4.2.每个具体类一张表,数据库表结构, ,Book.hbm.xml, ,DVD.hbm.xml, Query query=session.createQuery(“from example.model.Product”); List products=query.list(); Hibernate输出SQL: select dvd0_.id as id1_, dvd0_.manufacturer as manufact2_1_, dvd0_.name as
41、name1_, dvd0_.region_code as region4_1_ from t_dvd dvd0_ select book0_.id as id0_, book0_.manufacturer as manufact2_0_, book0_.name as name0_, book0_.page_count as page4_0_ from t_book book0_ Hibernate会自动把t_book与t_dvd表里的内容全部查询出来。,查询Product,4.3.每个子类一张表,数据库表结构,t_book,id page_count,int int,t_product,id
42、 manufacturer name,int varchar(50) varchar(50), ,Product.hbm.xml, Query query =session.createQuery(“from example.model.Product”); List products=query.list(); Hibernate输出SQL: select product0_.id as id0_, product0_.manufacturer as manufact2_0_, product0_.name as name0_, product0_1_.page_count as page2
43、_1_, product0_2_.region_code as region2_2_, case when product0_1_.id is not null then 1 when product0_2_.id is not null then 2 when product0_.id is not null then 0 end as clazz_ from t_product product0_ left outer join t_book product0_1_ on product0_.id=product0_1_.id left outer join t_dvd product0_
44、2_ on product0_.id=product0_2_.id Hibernate会自动把t_product、t_book与t_dvd表里的内容全部连接查询出来。,查询Product,4.4.每个类分层结构一张表,数据库表结构,t_product,id category manufacturer name page_count region_code,int varchar(10) varchar(50) varchar(50) int varchar(30),t_product表不但包括Product的id,name,manufacturter字段,同时还包含了Book的page_cou
45、nt字段、DVD的region_code字段,不同的类型商品通过(category)字段加以区分。, ,1. 通过discriminator节点声明用作子类辨别的字段名,2. 指定具体子类Book的discriminator值book,3. 指定具体子类DVD的discriminator值dvd,Product.hbm.xml, Query query =session.createQuery(“from example.model.Book”); List books=query.list(); Hibernate输出SQL: select book0_.id as id0_, book0_
46、.manufacturer as manufact3_0_, book0_.name as name0_, book0_.page_count as page5_0_ from t_product book0_ where book0_.category=book Hibernate会根据配置自动进行类型识别,把t_product表中category=book的数据(Book) 全部查询出来。,查询Book,4.5 总结,每个具体类一张表 每个子类一张表 每个类分层结构一张表,Hibernate教程,Hibernate数据检索,标准化对象查询-Criteria Query Hibernate查
47、询语言-Hibernate Query Language Hibernate数据加载方式,Hibernate数据检索概述,数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。 标准化对象查询(Criteria Query) 以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation) Hibernate语言查询(Hibernate Query Language,HQL) 它是完全面向对象的查询语句,查询功能非常
48、强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询。 Native SQL Queries(原生SQL查询) 直接使用数据库提供的SQL方言进行查询。,1.Criteria Query,Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象。如: Criteria criteria=session.createCriteria(User.class); criteria.add(Restrictions.eq(“name”,”John”); criteria.add(Restrictions.eq(“sex”,new Integer(1);
49、 List users=criteria.list(); 就相当于SQL语法的”SELECT * FROM t_user WHERE name=John AND sex=1”,1.1.Criteria查询表达式,Criteria本身中是一个查询容器,具体的查询条件需要通过add方法添加到Criteria实例中。Restrictions对象具体描述了查询条件。针对SQL语法,Restrictions提供了对应的查询限定机制。如:,1.2.Criteria查询示例,查询名为”John”的用户: Criteria criteria=session.createCriteria(User.class)
50、; criteria.add(Restrictions.eq(“name”,”John”); 查询所有年龄大于18岁的用户: Criteria criteria=session.createCriteria(User.class); criteria.add(Restrictions.gt(“age”,new Integer(18); 查询所有年龄大于20岁且小于30岁的用户: Criteria criteria=session.createCriteria(User.class); criteria.add(Restrictions.gt(“age”,new Integer(20); cri
51、teria.add(Restrictions.lt(“age”,new Integer(30);,1.3.复合查询,打印出数据库所有用户及其地址: Criteria criteria=session.createCriteria(User.class); List list=criteria.list(); for(int i=0;ilist.size();i+) User user=(User)list.get(i); System.out.println(“t”+user.getName(); Set addresses=user.getAddresses(); Iterator it=a
52、ddresses.iterator(); while(it.hasNext() Address addr=(Address)it.next(); System.out.println(“t”+addr.getAddress(); ,查询出所有位于上海的用户: Criteria criteria=session.createCriteria(User.class); Criteria addressCriteria=criteria.createCriteria(“addresses”); addressCriteria.add(Restrictions.like(“address”,”%上海%
53、”); List list=criteria.list(); for(int i=0;ilist.size();i+) User user=(User)list.get(i); System.out.println(“t”+user.getName(); Set addresses=user.getAddresses(); Iterator it=addresses.iterator(); while(it.hasNext() Address addr=(Address)it.next(); System.out.println(“t”+addr.getAddress(); ,1.4.Crit
54、eria高级特性,限定返回的记录范围 Criteria criteria=session.createCriteria(User.class); /限定查询返回检索结果中,从100条结果开始的20记录 criteria.setFirstResult(100); criteria.setMaxResults(20); 记录排序 Criteria criteria=session.createCriteria(User.class); /查询所有groupId=2的记录并按姓名(升序)和groupId(降序)排序 criteria.add(Restrictions.eq(“groupId”,new
55、 Integer(2); criteria.addOrder(Order.asc(“name”); criteria.addOrder(Order.desc(“groupid”);,分组 Criteria criteria=session.createCriteria(User.class); criteria.setProjection(Projections.groupProperty(“age”);/ 按年龄分组 List list=criteria.list(); Iterator it=list.iterator(); while(it.hasNext() System.out.pr
56、intln(it.next(); 统计 Criteria criteria=session.createCriteria(User.class); criteria.setProjection(Projections.avg(“age”);/ 统计用户的平均年龄 ,多条件组合统计、分组 ProjectionList projectionList=PjectionList(); projectionList.add(Projections.groupProperty(“age”);/ 按年龄分组 projectionList.add(Projections.rowCo
57、unt();/ 按统计记录总数 Criteria criteria=session.createCriteria(User.class); criteria.setProjection(projectionList); List list=criteria.list(); ,2.Hibernate Query Language(HQL),Criteria提供了符合面向对象风格的查询封装模式。不过,HQL提供了更丰富灵活的特性,它在涵盖了Criteria功能范围的前提下,提供了更为强大的查询能力。 实体查询与属性查询 实体更新与删除 分组与排序 联合查询,实体查询 String hql= “fo
58、rm User”; Query query=session.createQuery(hql) List list=query.list(); 实体Where查询 String hql= “form User as user where user.age between 20 and 30”; Query query=session.createQuery(hql); List list=query.list(); ,2.1.实体查询与属性查询,单个属性查询 List list=session.createQuery(“select from User as user”).l
59、ist(); Iterator it=list.iterator(); while(it.hasNext() System.out.println(it.next();/每个条目都是一个String类型数据 多个属性查询 List list=session.createQuery(“select ,user.age from User as user”).list(); Iterator it=list.iterator(); while(it.hasNext() Object results=(Object)it.next (); System.out.println(results0); System.out.println(results1); ,更新 Transaction tx=session.beginTransaction(); Q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年静脉治疗护理小组理论试题及答案
- 交通噪声监测印刷考核试卷
- 发电机组润滑油更换与维护规范考核试卷
- 过电压保护装置检测考核试卷
- 光纤网络规划与优化考核试卷
- 体育产业电商用户行为追踪与分析工具考核试卷
- 互联网批发行业数据分析平台搭建考核试卷
- 救援基金管理办法
- 新疆养蜂管理办法
- 异地办矿管理办法
- 土地平整单元工程质量评定表
- 贵港市展旺木业有限公司年产5万立方米生态板项目环境影响报告
- 养老院凉晒被子记录表
- 珠海市斗门区事业单位考试历年真题2023
- 乌兰察布市综合物流产业园区地质灾害评估报告
- 小儿鸡胸矫正术后护理查房
- 人民防空工程质量验收和评价标准RFJ01-2015年
- 新员工入职廉洁从业教育培训课件
- 第三章表面膜层及其电接触特性
- 第1章第3节怎样学习和研究化学(第1课时)导学案(含答案)2023-2024学年度沪教版化学九年级上册
- 目标设定及如何达成目标课件
评论
0/150
提交评论