Hibernate学习文档.doc_第1页
Hibernate学习文档.doc_第2页
Hibernate学习文档.doc_第3页
Hibernate学习文档.doc_第4页
Hibernate学习文档.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1. Configuration2. SessionFactory3. Transaction4. 保存学生记录的例子保存、更新一定要显式调用事务5. manyto one的级连更新例子6. hibernate查询复杂的查询需求 Restrictions,Projections的用法结果集排序投影Projections,提供聚合函数的类对多个字段进行投影7. 分页查询8. 根据模版例子查询9. 离线查询10. HQL聚合函数11. HQL例子12. 清除Session内部缓存的两个方法,Session.evict(Objecto) ,Session.clear() 清空内部缓存13. inverse14.15. Hibernate设置二级缓存16. 使用经验Configuration使用Hibernate 必须首先提供这些基础信息以完成初始化工作,为后继操作做好准备。这些属性在hibernate配置文件(hibernate.cfg.xml或perties)中加以设定。Hibernate会自动在当前的CLASSPATH 中搜寻hibernate.cfg.xml文件并将其读取到内存中作为后继操作的基础配置。Configuration config= new Configuration().configure();SessionFactory会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂。如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。SessionFactory负责创建Session 实例。我们可以通过Configuation实例构建SessionFactory:Configuration config = new Configuration().configure();SessionFactory sessionFactory= config.buildSessionFactory();Transaction使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。Configuration config= new Configuration().configure();SessionFactory sessionFactory= config.buildSessionFactory();Session session= sessionFactory.openSession();Transaction tx= session.beginTransaction();Student stu=new Student();.session.save(stu);mit();保存学生记录的例子一定要显式调用事务,Transaction tx= session.beginTransaction();public static void saveStudent() /(1)创建Hibernate的Configuration对象Configuration config= new Configuration().configure();/* * (2)从config中获取SessionFactory对象(可以多线程共享) * 在整个应用程序中,SessionFactory只需要一个实例,所以一在系统启动时创建 */SessionFactory sessionFactory = config.buildSessionFactory();/(3)创建Session对象(单线程独占),通过session完成curd操作Session session= sessionFactory.openSession();/(4)可以创建一个Transaction对象Transaction tx= session.beginTransaction();Student stu=new Student();stu.setName(小明明);stu.setAge(96);stu.setDesc(他是一个坏学生);stu.setSex(f);try/保存学生对象到数据库session.save(stu);/提交事务mit();System.out.println(保存成功!);catch(Exception e)/如果失败,回退tx.rollback();System.out.println(保存失败!);finally/最后关闭sessionsession.close();manyto one的级联更新例子要在标签增加 cascade=save-update ,Hibernate才会级连更新*最好在外键约束上加上 not-null=”true”,表示外键不能为空,这是一个好的编程习惯在一对一的关联和多对一几乎是一样的,唯一不同的就是单向一对一关联中的外键键字段具有唯一约束. Unique=”true” Session session=HibernateSessionFactory.getSession();Address address=new Address(gzXXX,new Integer(4567851);Person person=new Person();person.setProsonName(FGHJ);person.setAddress(address);Transaction tx= session.beginTransaction();session.save(person);mit();hibernate查询获取一个对象(即如何对应数据库的记录)?最简单的请况是知道了对象的ID(对象主键),使用load()方法或get()方法例如我们要查询一个用户信息,事先知道了它的用户IDsession.load(Student.class, new Integer(1);或者session.get(User.class, 1);查询多个对象-条件查询对象,由session创建。-查询条件对象,由Restrictions创建,Criterion 接口实例还可以 通过org.hibernate.criterion.Property来取得/1).创建Criteria 实例,使用org.hibernate.Criteria接口Criteria stuCriteria = session.createCriteria(Student.class);/创建查询条件,这里是性别为f的所有学生Criterion criterion=Restrictions.eq(stuSex,f);stuCriteria.add(criterion);List stuList=stuCriteria.list();如果有更复杂的查询需求,hibernate照样能满足:1.查询条件按逻辑分组,例如我们查询名字为narci或frank的男性用户,可以这样写:userCriteria.add(Restrictions.or( Restrictions.eq(name, narci), Restrictions.eq(name, frank).add(Restrictions.eq(sex, M);结果集排序可以使用org.hibernate.criterion.Order来为查询结果排序,例如将上面的结果按用户年龄升序排序。userCriteria.add(Restrictions.ge(age, new Integer(18) .add(Restrictions.eq(sex, F) .addOrder(Order.asc(age);投影投影其实就是选择结果集中的某些列, *如果这些列的值是相等的,hibernate会过滤.Projection可以实现投影,org.hibernate.criterion.Projections是 Projection 的实例工厂:/对name进行投影,这种方式只能对一个字段进行投影userCriteria.setProjection( Projections.groupProperty(name);/对多个字段进行投影/创建投影字段列表 ProjectionList pl=PjectionList(); /向投影列表上添加具体的投影字段 pl.add(Projections.groupProperty(stuName); pl.add(Projections.groupProperty(stuSex); criteria.setProjection(pl); List stuList=criteria.list();分页查询Criteria stuCriteria=session.createCriteria(Student.class);/设置起始行stuCriteria.setFirstResult(startRowNo);/设置每页要显示的记录数stuCriteria.setMaxResults(size);List list=stuCriteria.list();session.close();根据模版例子查询*注意,如果有原始类型,如int,会有默认的初值。Criteria stuCriteria = session.createCriteria(Student.class);/ 根据模版例子查询,查询性别为女性的学生,空的属性不会作为查询条件Student stu = new Student();stu.setStuSex(m);stu.setStuAge(26);stuCriteria.add(Example.create(stu);List list = stuCriteria.list();session.close();离线查询/ 创建一个条件查询对象Criteria criteria = session.createCriteria(Student.class);/ 添加查询条件Criterion /添加离线查询条件的代码DetachedCriteria avgAge = DetachedCriteria.forClass(Student.class).setProjection(Projections.avg(stuAge);/ 查询年龄大于平均年龄的所有学生Criterion criterion = Property.forName(stuAge).gt(avgAge);/ 添加查询条件对象到条件查询对象criteria.add(criterion);List stuList = criteria.list();session.close();return stuList;HQL 1。大小些敏感,针对的是 pojo类 2。from语句 Session session = HibernateSessionFactory.getSession();String hql=from Student;/查询所有学生的hqlQuery query=session.createQuery(hql);/创建Query对象 List stuList=query.list();只显示两个字段的例子:Session session = HibernateSessionFactory.getSession();String hql2=select stu.stuName,stu.stuSex from Student stu;Query query=session.createQuery(hql2);List stuList=query.list();/返回的是一个对象数组for(Object o:stuList)System.out.println(*n);System.out.println(学生姓名: + o0);System.out.println(学生性别: + o1);这是可以返回类型安全对象的hql语句,但要求pojo的构造方法有这样的构造方法Session session = HibernateSessionFactory.getSession();String hql3=select new Student(stu.stuName,stu.stuSex) from Student stu;Query query=session.createQuery(hql3);List stuList=query.list();for(Student stu:stuList)System.out.println(学生姓名: + stu.getStuName();System.out.println(学生性别: + stu.getStuSex();/聚合函数String hql4=select avg(stu.stuAge) from Student stu;String hql5=select count(*) from Student stu;Query query=session.createQuery(hql4);List list=query.list();for(Object o:list)System.out.println(平均年龄为: +o);HQL例子String hql=from Student;/查询所有学生的hql/查询sex为f的学生String hql6=FROM Student stu WHERE stu.stuSex=f;/in语句String hql7=FROM Student stu WHERE stu.stuName in(aaa,tom,小冰冰);/order语句String hql8=FROM Student stu order by stu.stuAge desc,stu.stuName asc;/分组语句,统计学生的年龄以及相同学生的人数String hql9=select stu.stuAge,count(stu.stuAge) from Student stu +group by stu.stuAge;/只查询学生的两个属性,返回 Object String hql2=select stu.stuName,stu.stuSex FROM Student stu;/只查询学生的两个属性,返回学生类型的对象String hql3=select new Student(stu.stuName,stu.stuSex) from Student stu;/聚合函数String hql4=select avg(stu.stuAge) from Student stu;String hql5=select count(*) from Student stu; 3。join相关 (inner) join left (outer) join right (outer) join full join HQL同样对SQL中的这些特性支持 下面插播一个小话题,关于上边的那些特性,我一直都没怎么用,今天既然说到这里,就想 把上边的几个特性的用法说一下,也算对自己的一个补充: 假设有两个表:部门、员工,下面列举一些数据: 员工(Employee): ID Name DepNo 001 Jplateau 01 002 Jony 01 003 Camel 02 部门(Department): ID Name 01 研发部 02 营销部 在Hibernate中我们操纵的都是对象,所以我们操纵的是部门类和员工类 1).(inner) join select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name as name2 from Employee as employee join Department as department on employee.DepNo= department.ID (注意到条件语句我用on 没有用where) 那么执行结果是什么呢? id1 name1 id2 name2 + 001 Jplateau 01 研发部 002 Jony 01 研发部 2).left (outer) join select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name as name2 from Employee as employee left join Department as department on employee.DepNo= department.ID 那么执行结果又该是什么呢? id1 name1 id2 name2 + 001 Jplateau 01 研发部 002 Jony 01 研发部 003 Camel null null 就是说此时我要已第一个表的记录多少为准,第二个表中没有相应纪录的时候填充null 3). right (outer) join select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name as name2 from Employee as employee right join Department as department on employee.DepNo= department.ID 那么执行结果又该是什么呢? id1 name1 id2 name2 + 001 Jplateau 01 研发部 002 Jony 01 研发部 null null 02 营销部 就是说此时我要已第二个表的记录多少为准,第一个表中没有相应纪录的时候填充null 4。select语句 就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧: select employee form Employee as employee select employee form Employee as employee where employee.Name like J% select employee.Name form Employee as employee where employee.Name like J% select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name as name2 from Employee as employee right join Department as department on employee.DepNo= department.ID select elements(employee.Name) from Employee as employee (不明白elements到底是做什么用的?望给于说明) 等等 5。数学函数 JDO目前好像还不支持此类特性。 avg(.), sum(.), min(.), max(.) count(*) count(.), count(distinct .), count(all.) 其用法和SQL基本相同 select distinct from Employee as employee select count(distinct ),count(employee) from Employee as employee 6。polymorphism (暂时不知道如何解释?) from com.test.Animal as animal 不光得到所有Animal得实例,而且可以得到所有Animal的子类(如果我们定义了一个子类Cat) 一个比较极端的例子 from java.lang.Object as o 可以得到所有持久类的实例 7。where语句 定义查询语句的条件,举几个例子吧: from Employee as employee where employee.Name=Jplateau from Employee as employee where employee.Name like J% from Employee as employee where employee.Name like %u 在where语句中“=”不光可以比较对象的属性,也可以比较对象,如: select animal from com.test.Animal as animal where =dog 8。表达式 在SQL语句中大部分的表达式在HQL中都可以使用: mathematical operators +, -, *, / binary comparison operators =, =, =, , !=, like logical operations and, or, not string concatenation | SQL scalar functions like upper() and lower() Parentheses ( ) indicate grouping in, between, is null JDBC IN parameters ? named parameters :name, :start_date, :x1 (这种应该是另一种?的变通解决方法) SQL literals foo, 69, 1970-01-01 10:00:01.0 Java public static final constants eg.Color.TABBY 其他不必解释了,在这里我只想对查询中的参数问题说明一下: 大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatement,在语句中写一大堆的“?”, 在hql中也可以用这种方法,如: List mates = sess.find( select from Employee as employee + where employee.Name=? , name, Hibernate.STRING ); (说明:上面利用Session里的find方法,在hibernate的api Session中重载了很多find方法,它可以满足你多种形式的查询) 上边是一个参数的情形,这种情况下紧接着引入参数和定义参数的类型,当为多个参数,调用另一个find方法,它的后两个 参数都是数组的形式。 还有另外一种方法来解决上边的问题,JDO也有这样的方法,不过和hibernate的表现形式上有差别,但他们两个骨子里却是 一样的,如: Query q = sess.createQuery(select from Employee as employee where employee.Name=:name); q.setString(name, Jplateau); /当有多个参数的时候在此逐一定义 Iterator employees = q.iterate(); 9。order 语句 和sql语句没什么差别,如: select from Employee as employee where employee.Name like J% order by employee.ID desc (或者asc) 10。group by 语句 同样和sql语句没什么差别,如: select ,employee.DepNo from Employee as employee group by employee.DepNo select foo.id, avg( elements(s) ), max( indices(s) ) from eg.Foo foo group by foo.id Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects. 谁帮我解释一下上边两句,谢过! 11。子查询 hibernate同样支持子查询,写几个例子: from eg.Cat as fatcat where fatcat.weight ( select avg(cat.weight) from eg.DomesticCat cat )inverseinverse只存在于集合标记的元素中,Hibernate所提供的集合元素,包括 ,inverse属性默认为false,也就是将集合对象的修改反映到数据库中。当inverse=”false”时,表明对象之间的关联关系由本方来进行维护,而当inverse=”true”时,则表示对象之间的关联关系由关联的另一方进行维护。Hibernate设置二级缓存1. 在hibernate.cfg.xml中设置trueorg.hibernate.cache.EhCacheProvider2. 在cla

温馨提示

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

评论

0/150

提交评论