1、SSH基础知识之Hibernate,主讲人:周文敏 2012-2-13,,ORM介绍,看广州人与北京人做生意 何谓ORM,ORM介绍,看广州人与北京人做生意,ORM介绍,ORM视图,ORM介绍,何谓ORM,对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。,Hibernate介绍,Hibernate介绍 Hibernate组成部分 Hibernate使用
2、流程,Hibernate介绍,hibernate 是一个O/R mapping框架,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中)。,Hibernate程序的组成部分,先看看联合国大会的组成 有各个国家的老外们参加 有开会的发言人 老外们需要翻译,Hibernate程序的组成部分,使用了Hibernate的程序: 有数据库中的各张表 有程序里的各个对象 当然需要一个“翻译”来告诉程序里的各个对象“各张表在程序里分别对应那个对象”,Hibernate程序的组成部分,Hibernate配置
3、文件:hibernate.cfg.xml 数据库 与数据库对应的各个对象:POJO JavaBean与库表的映射配置:*.hbm.xml,hibernate.cfg.xml样例,com.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/hibernate_learningroot 1231org.hibernate.dialect.MySQLDialectthreadorg.hibernate.cache.NoCacheProvidertruecreate,POJO样例,package base_mon.beans;public class Student
4、 private String id;private String name;public String getId() return id;public void setId(String id) this.id = id;public String getName() return name;public void setName(String name) this.name = name; ,*.hbm.xml,Hibernate使用流程,建立库表(找发言人) 编写hibernate.cfg.xml(总体配置) 编写POJO(找各国代表) 配置POJO与库表的映射(请翻译) 编写数据库操
5、作代码(开始开会),Hibernate查询方案,HQL方案 统计函数调用方案 嵌套子查询方案 本地SQL查询方案(选讲),Hibernate查询方案,普通查询 查询部分字段 查询一个字段 查询多个字段 实例化多字段查询结果,Hibernate查询方案HQL方案,Hibernate查询方案,在HQL中,使用的是对象,而不是库表。 返回的是保存着要查询的数据的对象。 Query q = session.createQuery( “FROM Student s WHERE s.age 18” );,HQL方案 - 普通查询,Hibernate查询方案,在HQL中指定要查询的对象的属性。 取得查询结果
6、时,查询到的属性的值不在以所属对象的形式保存在List中,而是以自身类型的形式保存在List中。,HQL方案 - 查询一个字段,Hibernate查询方案,Query q = session.createQuery( “SELECT s.name FROM Student s WHERE s.age 18” );List list = q.list();for ( int i = 0 ; i list.size() ; i + ) String name = ( String )list.get(i);,HQL方案 - 查询一个字段,Hibernate查询方案,在HQL中指定要查询的对象的各个
7、属性。 取得查询结果时,查询到的属性的值不在以所属对象的形式保存在List中,而是以Object数组的形式保存在List中。,HQL方案 - 查询多个字段,Hibernate查询方案,Query q = session.createQuery( “SELECT s.name, s.age FROM Student s WHERE s.age 18” );List list = q.list();for ( int i = 0 ; i list.size() ; i + ) Object res = ( Object )list.get(i);String name = ( String )re
8、s0;Integer age = ( Integer )res1;,HQL方案 - 查询多个字段,Hibernate查询方案,将多字段查询的结果保存在对应的实例中,让查询结果以对象的形式被程序使用。 在HQL中要显示实例化结果。 对应的POJO要拥有实例化自身的构造函数。,HQL方案 实例化多个字段查询结果,Hibernate查询方案,Query q = session.createQuery( “SELECT new Student( s.name, s.age ) FROM Student s WHERE s.age 18” );List list = q.list();for ( int
9、 i = 0 ; i list.size() ; i + ) Student stu = ( Student )list.get(i);Student类要拥有Student( String, int )的构造函数。,HQL方案 实例化多个字段查询结果,Hibernate查询方案,COUNT():统计记录条数。 MIN():求最小值。 MAX():求最大值。 SUM():求和。 AVG():求平均值。,统计函数调用方案,Hibernate查询方案,Query q = session.createQuery( “SELECT COUNT(*) FROM Student); Query q = se
10、ssion.createQuery( “SELECT MIN(s.age) FROM Student s); Query q = session.createQuery( “SELECT MAX(s.age) FROM Student s); Query q = session.createQuery( “SELECT SUM(s.age) FROM Student s); Query q = session.createQuery( “SELECT AVG(s.age) FROM Student s);,统计函数调用方案,Hibernate查询方案,All:所有记录。 Any:记录中的任意一
11、条。 Some:与Any一样。 In:与“Any”一样。 Exists:查询至少要返回一条记录。,嵌套子查询方案,Hibernate查询方案,求平均年龄以上的学生姓名: Query q = session.createQuery( “SELECT s.name FROM Student s WHERE s.age exists( SELECT AVG(s.age) FROM Student s );,嵌套子查询方案,Hibernate查询方案,基本查询 命名查询,本地SQL检索方案,Hibernate查询方案,使用session的createSQLQuery方法。 获取查询结果以前要将别名与实
12、体类关联起来。,本地SQL检索方案 - 基本查询,Hibernate查询方案,String sql = “SELECT s.* FROM Student s”;SQLQuery q = session.createSQLQuery( sql );q.addEntity( “s”, Student.class );List list = q.list();,本地SQL检索方案 - 基本查询,Hibernate查询方案,在POJO映射文件中对查询命名和设定。 在代码中用session的getNamedQuery方法来执行某命名查询。,本地SQL检索方案 -命名查询,Hibernate查询方案,:a
13、ge ,本地SQL检索方案 -命名查询,Hibernate查询方案,Query q = session.getNamedQuery( “QueryStudents” );/sql语句参数赋值q.setInteger( “age”, 18 );,本地SQL检索方案 -命名查询,Hibernate其它功能,集合映射-Map,Set映射 关联表的操作一对一, 一对多 与 多对一, 多对多 多线程数据共享解决方案-Hibernate官方不推荐多线程共享同一个Session。-使用ThreadLocal 批处理解决方案 Cache缓存控制一级缓存:Session二级缓存:SessionFactory Clob与Blob数据处理方案Hibernate处理非文本数据和大容量数据的解决方案使用java.sql.Clob和java.sql.Blob 数据检索策略立即检索 lazy=false延迟检索 lazy=true预先抓取 fetch=join,Thanks & Question?,