03Hibernate核心API.ppt_第1页
03Hibernate核心API.ppt_第2页
03Hibernate核心API.ppt_第3页
03Hibernate核心API.ppt_第4页
03Hibernate核心API.ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

北京传智播客教育 ,Hibernate核心API,北京传智播客教育 ,Hibernate核心API (重点),Configuration SessionFactory Session Transaction Query Criteria SQLQuery,北京传智播客教育 ,Configuration,Configuration对象用于封装Hibernate的配置信息,在Hibernate框架启动后,需要装载对应的配置文件。Hibernate的配置文件有两种格式 hibernate.cfg.xml文件(常用格式) perties文件(早期格式),北京传智播客教育 ,Configuration,使用hibernate.cfg.xml加载配置 Configuration conf = new Configuration.configure(); 此方式可以将资源文件通过XML配置的方式加入配置文件 资源文件配置方式 添加配置文件(主流) 添加持久化类(非主流) 该方式需要基于注解格式,北京传智播客教育 ,Configuration (了解),使用perties加载配置 Configuration conf = new Configuration (); 此方式无法配置资源文件,必须手动添加 资源文件添加方式 添加配置文件(非主流) conf. addResource(“cn/itcast/h3/user/vo/UserModel.hbm.xml”); 添加持久化类(非主流) conf.addClass(UserModel.class); 此方式Hibernate会自动读取当前类所在目录下同名的配置文件,UserModel.hbm.xml,所以在进行配置文件的命名时尽量保持两个文件名相同,不推荐使用不同名称的文件,北京传智播客教育 ,SessionFactory,SessionFactory对象根据Configuration对象加载的配置信息创建得到,其中封装了配置信息中有关数据库的信息、所有的映射关系及预定义SQL语句 SessionFactory对象是线程安全的 SessionFactory对象可以通过Configuration对象获得 Configuration conf = new Configuration().configure(); SessionFactory sf = conf.buildSessionFactory(); 由于SessionFactory对象的创建需要基于所有的配置信息,因此创建此对象需要消耗大量的资源,通常一个应用程序中只初始化一个SessionFactory对象,北京传智播客教育 ,Session(重点),Session对象是Hibernate与应用程序APP进行交互的桥梁,应用程序与Hibernate之间通过Session进行数据交互,其功能相当于JDBC中的Connection Session对象可以通过SessionFactory对象获得 Session s = sf.openSession(); Session对象描述的是一次Hibernate与APP的会话信息,因此Session对象是线程不安全的。在使用时要保障该对象只出现在方法内部,而不要共享 Session对象操作完成后要进行关闭 s.close();,北京传智播客教育 ,Session,Session对象位于应用程序与数据库之间,应用程序需要持久化的对象交由Session传递给数据库,应用程序需要获取数据库的信息也同样是从Session对象处获取,Session对象可以看做是一个数据调度中心,Java应用程序 Application,数据库 DB,Hibernate,Session,操作对象,查询结果,北京传智播客教育 ,HibernateUtil工具类的制作,北京传智播客教育 ,Transaction (重点),Transaction对象描述Hibernate执行过程中事务对象 数据库操作中事务是保障数据操作成功的重要因素 事务操作主要包含以下几种 开启事务 Transaction t = s.beginTransaction(); 提交事务 mit(); 回滚事务 t.rollback();,北京传智播客教育 ,Session常用操作(重点),插入数据 save(Object) persist(Object) 删除数据 delete(Object); 修改数据 update(Object) saveOrUpdate(Object) 查询单条数据 get(Class, Serializable) load(Class, Serializable),北京传智播客教育 ,插入数据,Serializable save(Object object),北京传智播客教育 ,删除数据,void delete(Object object),北京传智播客教育 ,修改数据,void update(Object object),北京传智播客教育 ,添加或修改数据,void saveOrUpdate(Object object),北京传智播客教育 ,查询单条数据,查询单条数据需要根据主键进行查找,并且要明确查 找的数据最终包装成的对象类型,使用反射完成 Object get(Class class, Serializable id) Object load(Class class, Serializable id),北京传智播客教育 ,Hibernate数据查询,Hibernate在进行数据查询时,会根据查询时所提供的Class模型,基于反射原理将对象自动封装成Java对象,与JSP技术中的JavaBean十分相似 查询数据无需开启事务 load方法与get方法的区别(后面详细讲解),北京传智播客教育 ,Query(重点),Query对象描述了用于进行查询操作的对象,Query对象执行查询操作需要使用HQL语言。Query对象通过Session对象获得 Query q = s.createQuery(“from UserModel“); 其中“from UserModel”使用的就是HQL语言的语法规则 HQL语言是Hibernate框架中根据SQL语言发展得到的一种面向对象操作格式的查询语句,是Hibernate中主流的查询方式之一。,北京传智播客教育 ,HQL语句,HQL(Hibernate Query Language)是一种Hibernate专用的查询语句,基于面向对象的模式,将SQL语句转化成对象的操作格式 HQL与SQL区别 (SQL)select * from tbl_user (HQL)select um from UserModel um (HQL简化)from UserModel (SQL)select user.age from tbl_user user (HQL)select um.age from UserModel um,北京传智播客教育 ,HQL别名,HQL书写过程中,如果类名过长,或者属性名过长,可以通过别名的方式简化书写,同时可以描述查询的结果为对象类型 别名使用规则与SQL完全相同,as可以省略 “select um.age from UserModel as um” (正确) “select um.age from UserModel um” (正确) “select age from UserModel um” (正确) “select um.age from UserModel” (错误),北京传智播客教育 ,使用Query查询数据,步骤: 获得Session对象 编写HQL语句(字符串格式) 由Session对象创建执行查询操作的Query对象,并传入HQL语句作为参数 HQL语句编写时应满足预编译SQL的语法格式 如果HQL语句中有参数,为Query对象指定操作的参数 执行Query对象的数据列表方法获得查询结果 q.list(); q.uniqueResult();,北京传智播客教育 ,使用Query查询多条数据,使用list()获得查询结果 list方法用于获得查询数据结果为0到多条的情况 list方法执行得到List集合,其中封装了查询的结果,北京传智播客教育 ,使用Query查询多条数据,北京传智播客教育 ,使用Query查询得到单条数据,使用uniqueResult()获得查询结果 uniqueResult方法用于获得查询数据结果为0到1条的情况 uniqueResult方法执行后得到对象,其中封装查询的结果 注意:如果查询结果超过一条,将抛出异常 org.hibernate.NonUniqueResultException query did not return a unique result: 15,北京传智播客教育 ,使用Query查询得到单条数据,北京传智播客教育 ,Query查询的数据模型,使用Query对象进行查询,根据查询的内容不同,返回的数据模型也不同 查询单个属性,返回查询对象的类型 select um from UserModel um (返回类型为UserModel) select age from UserModel (返回类型为Integer) select userName from UserModel (返回类型为String) 查询多个属性(投影),返回对象数组Object select userName,age from UserModel 返回对象数组,其中第一个元素是查询的userName数据,第二个元素是查询的age数据 select age,userName from UserModel(是否和上面相同?),北京传智播客教育 ,使用Query查询单个属性,北京传智播客教育 ,使用Query查询多个属性(投影),北京传智播客教育 ,Query进行分页查询,Query对象可以对查询结果进行局部获取,也就是JEE中常用的“分页查询”结果 Query对象进行查询数据局部获取 设定查询的第一条数据编号 q.setFirstResult(int); 设置查询结果保留索引从第10条开始的数据 设定查询的数据总量 q.setMaxResults(int); 设置查询结果保留共20条数据 Query对象的分页查询结果可以根据数据库类型不同,自动生成对应的语句,北京传智播客教育 ,Query进行分页查询,北京传智播客教育 ,Query设定查询条件,Query对象查询时,可以添加对应的查询条件 Query对象进行带条件的查询时有三种格式 固定值查询(不推荐使用) 无参数条件查询(少用) 传入可变参数查询(常用),北京传智播客教育 ,Query固定参数条件查询(了解),Query对象使用固定值进行查询 步骤: 创建要查询的HQL语句 String hql = “from UserModel where age = 34“; 创建查询对象Query Query q = s.createQuery(hql); 获取查询结果 List queryList = q.list(); Hibernate推荐使用预编译SQL语句的格式,不推荐使用此形式进行条件查询,北京传智播客教育 ,Query无参数条件查询(了解),无参数条件查询指查询条件中无需传入外部的查询条件值 查询姓名与地址相同的人,北京传智播客教育 ,Query可变参数条件查询(1),Query对象可变参数进行查询,不指定参数类型 步骤: 创建要查询的HQL语句 String hql = “from UserModel where age = ? and userName = ?“; 创建查询对象Query Query q = s.createQuery(hql); 为查询语句中的参数赋值(无类型区分) q.setParameter(0, 34); q.setParameter(1, “jockme“); 获取查询结果 List queryList = q.list(); 此形式参数传递索引,灵活度太差,不推荐使用,北京传智播客教育 ,Query可变参数条件查询(2),Query对象可变参数进行查询,指定参数类型 步骤: 创建要查询的HQL语句 String hql = “from UserModel where age = ? and userName = ?“; 创建查询对象Query Query q = s.createQuery(hql); 为查询语句中的参数赋值(按类型区分) q.setInteger(0, 34); q.setString(1, “jockme“); 获取查询结果 List queryList = q.list(); 此形式参数传递索引,灵活度太差,不推荐使用,北京传智播客教育 ,Query可变参数条件查询(3),Query对象使用可变参数进行查询 步骤: 创建要查询的HQL语句 String hql = “from UserModel where age =:age and userName =:name“; 创建查询对象Query Query q = s.createQuery(hql); 为查询语句中的参数赋值(无类型区分) q.setParameter(“age”, 34); q.setParameter(“name”, “jockme“); 获取查询结果 List queryList = q.list(); 此形式匹配类型不明确,不推荐使用,北京传智播客教育 ,Query可变参数条件查询(4)(重点),Query对象使用可变参数进行查询 步骤: 创建要查询的HQL语句 String hql = “from UserModel where age =:age and userName =:name“; 创建查询对象Query Query q = s.createQuery(hql); 为查询语句中的参数赋值(按类型区分) q.setInteger(“age”, 34); q.setString(“name”, “jockme“); 获取查询结果 List queryList = q.list(); 此形式位置与匹配类型明确,推荐使用,匹配类型由数 据存储类型决定,北京传智播客教育 ,链式格式(了解),Query对象查询时,书写时代码很多,连接的设置很复杂,可以通过单条语句完成,这就是Query查询的链式格式 链式格式远远强大于普通格式,但仅仅是一个格式的变化,无需过于关注。,北京传智播客教育 ,Query链式格式,链式格式 非链式格式,北京传智播客教育 ,Query查询聚合函数使用规则,聚合函数是SQL语言中提供一种快速进行数据统计操作的内置函数 Hibernate兼容使用SQL语句中的如下聚合函数 count() min() max() sum() avg() 格式: “select count(uuid) from UserModel”,北京传智播客教育 ,Query查询聚合函数使用规则,count函数返回的结果必须使用Long型数据接收 其他函数则要根据具体操作的数据类型进行选择,例如上例中的age需要使用Integer类型接收,北京传智播客教育 ,Query分组查询,对数据进行分组后查询 统计同岁的人数,北京传智播客教育 ,Query查询结果排序,查询结果排序是在实际开发过程中常用的操作,北京传智播客教育 ,投影数据封装(了解),投影数据封装是将查询结果封装成对象模型的格式 投影数据封装在使用时使用构造方法完成 首先在模型类中声明投影数据封装需要的构造方法 例如UserModel类中创建带有userName和age属性的构造方法 然后查询时修改HQL语句,改为投影数据封装格式 原始格式:select userName,age from UserModel 封装格式:select new UserModel(userName,age) from UserModel 最后从Query对象中获得的查询结果就是投影封装完成的对象 List queryList = q.list(); 投影数据封装模型对象要求构造方法参数必须与HQL语句中参数顺序完全相同,并且要求大量的构造方法才能全兼容(不常用),北京传智播客教育 ,投影集合封装(了解),投影数据也可以存入一个集合List对象或Map对象(不常用),北京传智播客教育 ,Query配置型查询(了解),为方面后期维护,将查询语句写入配置文件 hbm.xml文件中添加如下配置 定义一条查询HQL,名称为getByName,需要参数name 调用时使用Session对象的getNamedQuery方法获取Query对象 Query q = s.getNamedQuery(“getByName”);,北京传智播客教育 ,Criteria(重点),Criteria对象描述了用于进行按条件查询操作的对象,它可以按照面向对象的格式传递查询条件 使用Criteria对象进行的查询又名QBC QBC(Query By Criteria)是一种Hibernate中使用面向对象的格式进行查询的技术,北京传智播客教育 ,使用Criteria进行查询(QBC),步骤: 获得Session对象 由Session对象创建执行查询操作的Criteria对象,并传入要查询的模型类作为参数 Criteria c = s.createCriteria(UserModel.class); 如果存在有查询条件,添加查询条件 执行Criteria对象的数据列表方法获得查询结果 c.list(); c.uniqueResult();,北京传智播客教育 ,使用Criteria查询多条数据,使用list()获得查询结果 list方法用于获得查询数据结果为0到多条的情况 list方法执行得到List集合,其中封装了查询的结果,北京传智播客教育 ,使用Criteria查询多条数据,北京传智播客教育 ,使用Criteria查询得到单条数据,使用uniqueResult()获得查询结果 uniqueResult方法用于获得查询数据结果为0到1条的情况 uniqueResult方法执行后得到对象,其中封装查询的结果 注意:如果查询结果超过一条,将抛出异常 org.hibernate.NonUniqueResultException query did not return a unique result: 15,北京传智播客教育 ,使用Criteria查询得到单条数据,北京传智播客教育 ,Criteria查询的数据模型,使用Criteria对象进行查询,模型查询的内容为模型对象 如果要查询封装模型之外的数据,可以通过设置投影,设置查询的结果,返回对象数组Object,北京传智播客教育 ,使用Criteria查询模型对象,北京传智播客教育 ,为Criteria设置单一属性投影,北京传智播客教育 ,为Criteria设置多属性投影,北京传智播客教育 ,Criteria进行分页查询,Criteria对象可以对查询结果进行局部获取,也就是JEE中常用的“分页查询”结果 Criteria对象进行查询数据局部获取 设定查询的第一条数据编号 c.setFirstResult(int); 设置查询结果保留索引从第10条开始的数据 设定查询的数据总量 c.setMaxResults(int); 设置查询结果保留共20条数据 Criteria对象的分页查询结果可以根据数据库类型不同,自动生成对应的语句,北京传智播客教育 ,Criteria进行分页查询,北京传智播客教育 ,Criteria条件查询(重点中的重点),Criteria条件查询是QBC查询中最强大的功能,由于格式由SQL语句转化为对象化操作,因此需要掌握转化后的对应关系与书写规则 Criteria将所有的查询条件封装成面向对象的操作,从格式上初期接受起来比较困难,北京传智播客教育 ,Criteria条件查询短语,北京传智播客教育 ,Criteria条件查询组合规则,HQL与QBC条件运算符对应关系,北京传智播客教育 ,Criteria条件查询规则比对,HQL与QBC条件运算符对应关系,北京传智播客教育 ,Criteria条件查询示例,查询年龄小于30岁的用户 c.add(Restrictions.lt(“age“, 30); 查询年龄不小于30岁的用户 c.add(Restrictions.not(Restrictions.lt(“age“, 30); c.add(Restrictions.ge(“age“, 30); 查询年龄小于35岁,姓张的用户 格式一: c.add(Restrictions.lt(“age”, 45); c.add(Restrictions.like(“userName”, “张%“); 格式二: c.add(Restrictions.and(Restrictions.lt(“age”, 45), Restrictions.like(“userName”, “张%“);,北京传智播客教育 ,Criteria链式格式,QBC查询格式中,需要添加的条件设置众多,因此,链式格式在QBC查询中的应用较广。,北京传智播客教育 ,Criteria使用聚合函数,Criteria查询使用聚合函数的方式与Query区别较大,均以查询条件的形式出现,配合投影使用 统计数量 Projection condition = Projections.rowCount(); 求最值 Projection conditionMax = Projections.max(“age“); Projection conditionMin = Projections.min(“min“); 求和、求平均 Projection conditionAvg = Projections.avg(“age“); Projection conditionSum = Projections.sum(“age“);,北京传智播客教育 ,Criteria使用聚合函数,北京传智播客教育 ,Criteria分组查询,Criteria分组查询以查询条件的形式出现 分组 Projection p = Projections.groupProperty(“age“);,北京传智播客教育 ,Criteria分组查询,北京传智播客教育 ,Criteria查询排序,Criteria查询排序作为Criteria对象的操作出现,而非查询条件的形式 升序 c.addOrder(Order.asc(“age“); 降序 c.addOrder(Order.desc(“address“); 排序规则可以添加多个,排序主次顺序以添加顺序为划分主次,北京传智播客教育 ,Criteria查询排序,北京传智播客教育 ,Criteria离线查询(了解),实际业务中按条件查询业务非常多 淘宝查询价格10-25元,全皮,手套 QQ查询年龄18-22岁,女性,在线 上述业务中查询条件非常之多,在进行应用程序分层时,每层完成如下功能 表现层:收集参数(组织数据),将参数传递给数据层,得到 返回值后将值显示到页面中 逻辑层/业务层:接受表现层参数,将参数传递给数据层,得 到返回值后,将值传回表现层 数据层:接受逻辑层参数,进行具体的数据层操作,将操作 结果返回给逻辑层,北京传智播客教育 ,Criteria离线查询,在逻辑层与数据层进行数据交互时,会出现逻辑层将大量的数据传递给数据层,那么数据层中对应的方法将书写大量的参数 根据Java编程的设计习惯,一个方法参数通常不超过7个,此

温馨提示

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

评论

0/150

提交评论