《Hibernate程序设计.ppt》由会员分享,可在线阅读,更多相关《Hibernate程序设计.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Hibernate程序设计第一讲Hibernate概述第二讲对象关系映射基础第三讲复杂实体映射第四讲关联映射第五讲Hibernate查询Hibernate程序设计第一讲Hibernate概述Hibernate概述一个主流的持久化框架在JDBC基础上进行分装只需要少量代码就可以完成持久化工作一个优秀的ORM(对象-关系映射)机制通过映射文件保存映射信息在业务层以面向对象的方式编程,封装对数据库的访问细节.应用程序中对象应用程序中对象(O)姓名:mary性别:女年龄:20ORM(对象-关系映射):完成对象数据到关系型数据映射的机制称为对象-关系映射,简称ORM。持久化层什么是ORM?数据库关系型数
2、据关系型数据(R)优点优点:Productivity,Maintainability,Performance,VendorindependenceHibernate优势开源成熟流行(约13000downloads/month)自定义APIJBoss用Hibernate3实现EntityBeans下载及设置hibernate第一个Hibernate案例问题描述:利用HibernateAPI对Customer数据表增加记录步骤:添加Hibernate库添加POJO对象类Customer在程序中实现对数据库的操作jdbc:oracle:thin:localhost:1521:oradbscottti
3、ger配置配置JDBC驱动驱动配置配置JDBC连库连库URL,用户名密码用户名密码指定数据库方言指定数据库方言cust_seq实体类到表的映射实体类到表的映射主键生成方式主键生成方式属性到字段的映射属性到字段的映射7个步骤:ConfigurationConfiguration创建创建SessionFactorySessionFactory打开打开SessionSession开始一个事务开始一个事务持久化操作持久化操作save/update/delete/findsave/update/delete/find提交事务提交事务关闭关闭SessionSession在程序中实现对数据库的操作publi
4、cclassTest01privatestaticSessionFactoryfactory;staticConfigurationcfg=newConfiguration();cfg.configure();cfg.addClass(Customer.class);factory=cfg.buildSessionFactory();publicstaticvoidmain(Stringargs)Test01test=newTest01();test.testSave();/*用于演示session的save方法*/publicvoidtestSave()Sessionsession=fact
5、ory.openSession();Customerc=newCustomer();c.setName(peter);c.setBirthday(newDate(0);Transactiontx=null;trytx=session.beginTransaction();System.out.println(c);/1session.save(c);/2System.out.println(c);/mit();catch(HibernateExceptionex)ex.printStackTrace();if(tx!=null)tx.rollback();finallysession.clos
6、e();第二个Hibernate案例利用HibernateAPI对Customer数据表增加、修改、删除、查找记录publicvoidtestDelete()Sessionsession=factory.openSession();Transactiontx=null;trytx=session.beginTransaction();Customerc=(Customer)session.load(Customer.class,newLong(1);session.delete(c);mit();catch(HibernateExceptionex)ex.printStackTrace();i
7、f(tx!=null)tx.rollback();finallysession.close();publicvoidtestUpdate()Sessionsession=factory.openSession();Transactiontx=null;trytx=session.beginTransaction();Customerc=newCustomer();c.setId(newLong(1);c.setName(chris);c.setBirthday(newDate(0);session.update(c);/1System.out.println(c);/mit();catch(H
8、ibernateExceptionex)ex.printStackTrace();if(tx!=null)tx.rollback();finallysession.close();Hibernate程序设计第二讲Hibernate映射基础Hibernate基本配置POJO对象:Customer.class应用程序:Test01.classjdbc:oracle:thin:localhost:1521:oradbscotttigerHibernate配置文件cust_seqHibernate基本数据类型Hibernate主键生成方式Hibernate主键生成方式Hibernate架构实体对象(P
9、ersistentObject)持久化的对象Hibernate配置文件配置数据库连接信息Hibernate映射文件配置对象和关系表的映射信息Hibernate核心APIConfiguration对象负责管理数据库的配置信息Configuration对象通过加载配置文件(hibernate.cfg.xml)获取并管理这些信息Configurationconfig=newConfiguration();config.configure();Filefile=newFile(“C:myhibernate.xml”);Configurationconfig=newConfiguration().con
10、figure(file);通过classpath找配置文件自定义配置文件的位置Hibernate核心APISessionFactory负责创建Session对象SessionFactory对象中保存当前的数据库配置信息和所有映射关系以及预定义的SQL语句SessionFactory负责维护Hibernate的二级缓存SessionFactory对象采取了线程安全的设计方式如何创建SessionFactory对象?Configurationconfig=newConfiguration().configure();SessionFactoryfactory=config.buildSession
11、Factory();Hibernate核心APISession对象的添加、更新、删除和查询Session的设计是非线程安全的Session对象由SessionFactory对象创建Configurationconfig=newConfiguration().configure();SessionFactoryfactory=config.buildSessionFactory();Sessionsession=factory.openSession();Hibernate核心APITransactionHibernate本身没有事务管理功能,需要依赖JDBC或JTA的事务事务管理功能使用Hib
12、ernate进行操作时(增、删、改)必须显式的调用Transaction(默认:autoCommit=false)Transactiontx=session.beginTransaction();持久化对象的生命周期持久化对象的生命周期持久化对象的状态持久化对象的状态TransientObjects:使用new操作符初始化的对象的状态是瞬时的,如果没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,它们的状态将会丢失,并由垃圾回收机制回收。PersistObjects:如果内存中的对象和数据库的记录有对应关系,即和session对象相关,则此对象处于Persistent状态,在当事务提交
13、时它们的状态和数据库进行同步DetachedObjects:Session关闭之后,持久化对象就变为detached对象。表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。Hibernate程序设计第三讲Hibernate高级映射实体映射(1)联合主键在数据表设计时使用两个列作为联合主键时,用HibernateAPI来完成对象关系映射CREATETABLEstudents(firstnamevarchar2(16)NOTNULL,lastnamevarchar2(16)NOTNULL,majorvarchar2(100),PRIMARYKEY(firstname,lastn
14、ame);实体映射(1)联合主键StudentsId.javapublicclassStudentsIdimplementsjava.io.SerializableprivateStringfirstname;privateStringlastname;Students.javapublicclassStudentsimplementsjava.io.SerializableprivateStudentsIdid;privateStringmajor;实体映射(1)联合主键实体映射(1)联合主键Studentsstudent=newStudents();StudentsIdpk=newStud
15、entsId();pk.setFirstname(Michael);pk.setLastname(Scofield);student.setId(pk);student.setMajor(Building);Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(student);mit();HibernateSessionFactory.closeSession();案例:02_UnionKey实体映射(2)组合关系映射CREATETAB
16、LEPerson(idnumberprimarykey,namevarchar2(20),address_cityvarchar2(50),address_streetvarchar2(50),address_zipcodechar(6),mailing_cityvarchar(50),mailing_streetvarchar(50),mailing_zipcodevarchar(6);有必要把其中的city,street,zipcode提取出来单独组成一个Address类,将这个类作为Person对象的一个组成部分出现。实体映射(2)组合关系映射Address.javapublicclas
17、sAddressprivateStringcity;privateStringstreet;privateStringzipcode;Person.javapublicclassPersonimplementsjava.io.Serializable/FieldsprivateLongid;privateStringname;privateAddressaddress;privateAddressmailAddress;实体映射(2)组合关系映射映射组合关系映射组合关系person_seq实体映射(2)组合关系映射Personperson=newPerson();person.setName(
18、peter);Addressaddress1=newAddress(beijing,changanstreet,100080);Addressaddress2=newAddress(tianjin,weijinstreet,300300);person.setAddress(address1);person.setMailAddress(address2);Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(person);mit();
19、HibernateSessionFactory.closeSession();案例:03_Component实体映射(3)大对象类型映射createtableusers(idnumberprimarykey,namevarchar2(20),passwordvarchar2(20),imageblob,resumeclob);实体映射(3)大对象类型映射.0OracleJDBC不允许使用批处理方式进行操作,所以需要在Hibernate配置文件中,将hibernate.jdbc.batch_size设为0.实体映射(3)大对象类型映射Users.javapublicclassUsersimple
20、mentsjava.io.Serializable/FieldsprivateLongid;privateStringname;privateStringpassword;privateBlobimage;privateClobresume;实体映射(3)大对象类型映射 users_seq 实体映射(3)大对象类型映射Usersuser=newUsers();user.setName(Scofield);user.setPassword(1234);user.setResume(Hibernate.createClob();user.setImage(Hibernate.createBlob(
21、newbyte1);Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(user);session.flush();FileInputStreamfileInputStream=newFileInputStream(tomcat.gif);session.refresh(user,LockMode.UPGRADE);/SELECTFORUPDATEuser.setResume(Hibernate.createClob(alotsofwo
22、rds);user.setImage(Hibernate.createBlob(fileInputStream);session.save(user);mit();fileInputStream.close();HibernateSessionFactory.closeSession();Hibernate程序设计第四讲Hibernate关联映射关联映射(1)集合类映射映射集合类关系:一本书,可能属于多个类别CREATETABLEbook(idnumberprimarykey,booknamevarchar2(20)NOTNULL);CREATETABLEtopic(idnumber,topi
23、cnamevarchar2(20)NOTNULL);ALTERTABLEtopicADDPRIMARYKEY(id,topicname);ALTERTABLEtopicADDFOREIGNKEY(id)REFERENCESbook(id);关联映射(1)集合类映射Book.javapublicclassBookimplementsjava.io.SerializableprivateLongid;privateStringbookname;privateSettopics=newHashSet(0);关联映射(1)集合类映射book_seq 关联映射(1)集合类映射Sessionsession
24、=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Bookbook1=newBook();book1.setTopics(newHashSet();book1.setBookname(hibernate);book1.addTopic(java);book1.addTopic(O-RMapping);Bookbook2=newBook();book2.setTopics(newHashSet();book2.setBookname(struts);book2.addTopic(java)
25、;book2.addTopic(MVC);session.save(book1);session.save(book2);mit();HibernateSessionFactory.closeSession();关联映射(2)一对多/多对一 一对多关联直接连接两个类对应的表,而没有连接表,两个表之间通过唯一的外键关联。外键与另一个类的主键对应。一对多的关联经常见到,如一个部门有很多员工,一个学校有很多学生等。关联映射(2)一对多/多对一Employee.javapublicclassEmployeeimplementsjava.io.SerializableprivateLongempid;p
26、rivateStringename;privateDepartmentdepartment;Department.javapublicclassDepartmentimplementsjava.io.Serializable/FieldsprivateLongdeptid;privateStringdname;privateStringlocation;privateSetemployees=newHashSet(0);关联映射(2)一对多/多对一employee_seq 关联映射(2)一对多/多对一department_seq 关联映射(2)一对多/多对一Employeeemp1=newEm
27、ployee();emp1.setEname(King);Employeeemp2=newEmployee();emp2.setEname(Scott);Departmentdept1=newDepartment();dept1.setDname(Accounting);dept1.setEmployees(newHashSet();dept1.addEmployee(emp1);dept1.addEmployee(emp2);emp1.setDepartment(dept1);emp2.setDepartment(dept1);Sessionsession=HibernateSessionF
28、actory.getSession();Transactiontx=session.beginTransaction();session.save(dept1);mit();HibernateSessionFactory.closeSession();案例:06_one-to-manySet集合Set集合name集合属性的名称table(可选)目标关联数据库表lazy(可选默认为false)允许延迟加载(lazyinitialization)inverse(可选默认为false)标记有哪一方来维护关联关系(双向关联中使用)。cascade(可选默认为none)让操作级联到子实体order-by
29、(可选,仅用于jdk1.4)指定表的字段(一个或几个)再加上asc或者desc(可选),定义Map,Set和Bag的迭代顺序where(可选)指定任意的SQLwhere条件outer-join(可选-默认为auto)是否使用外联接cascade级联操作关联映射(3)一对一:外键关联 一对一关联指两个表之间的记录是一一对应的关系。分为两种:外键关联和主键关联。比如一家公司(Company)和它所在的地址(Address)。在业务逻辑中要求一家公司只有唯一的地址,一个地址也只有一家公司。下图表现为外键关联关系。关联映射(3)一对一:外键关联Company.javapublicclassCompan
30、yimplementsjava.io.SerializableprivateLongid;privateStringname;privateAddressaddress;Address.javapublicclassAddressimplementsjava.io.Serializable/FieldsprivateLongid;privateStringcity;privateStringcountry;privateCompanycompany;关联映射(3)一对一:外键关联company_seq 关联映射(3)一对一:外键关联address_seq关联映射(3)一对一:外键关联Compa
31、nycompany1=newCompany();company1.setName(OriStand);Addressaddress1=newAddress();address1.setCity(BeiJing);address1.setCountry(China);company1.setAddress(address1);Companycompany2=newCompany();company2.setName(IBM);Addressaddress2=newAddress();address2.setCity(NewYork);address2.setCountry(American);c
32、ompany2.setAddress(address2);Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(company1);session.save(company2);mit();HibernateSessionFactory.closeSession();案例:07_one-to-one关联映射(4)一对一:主键关联一对一的另一种解决方式就是主键关联,在这种关联关系中,要求两个对象的主键必须保持一致,通过两个表的主键建立关联关
33、系,无须外键参与。关联映射(4)一对一:主键关联POJO对象的结构和一对一关系中的外键关联方式相同。关联映射(4)一对一:主键关联company_seq关联映射(4)一对一:主键关联company关联映射(4)一对一:主键关联Company company1=new Company();company1.setName(OriStand);Address address1=new Address();address1.setCity(BeiJing);address1.setCountry(China);company1.setAddress(address1);/company-addres
34、saddress1.setCompany(company1);/address-company Company company2=new Company();company2.setName(IBM);Address address2=new Address();address2.setCity(New York);address2.setCountry(American);company2.setAddress(address2);address2.setCompany(company2);Session session=HibernateSessionFactory.getSession(
35、);Transaction tx=session.beginTransaction();session.save(company1);session.save(company2);mit();HibernateSessionFactory.closeSession();案例:07_one-to-one关联映射(5)多对多多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系。关联映射(5)多对多Student.javapublicclassS
36、tudentimplementsjava.io.SerializableprivateLongid;privateStringname;privateSetcourses=newHashSet(0);Course.javapublicclassCourseimplementsjava.io.SerializableprivateLongid;privateStringname;privateSetstudents=newHashSet(0);关联映射(5)多对多student_seq关联映射(5)多对多 course_seq 关联映射(5)多对多Session session=Hibernat
37、eSessionFactory.getSession();Transaction tx=session.beginTransaction();Student student1=new Student();student1.setName(peter);student1.setCourses(new HashSet();Student student2=new Student();student2.setName(scott);student2.setCourses(new HashSet();Course course1=new Course();course1.setName(Java);C
38、ourse course2=new Course();course2.setName(Oracle);student1.addCourse(course1);student1.addCourse(course2);student2.addCourse(course1);student2.addCourse(course2);session.save(student1);session.save(student2);mit();HibernateSessionFactory.closeSession();案例:08_many-to-many关联映射(6)继承关系映射在业务逻辑的设计中,继承关系是
39、非常常见的。对于继承关系在数据库中数据表上的映射方式,Hibernate支持三种不同的基本继承映射策略。以第一种为例:类继承关系树中每个类共用一个表(tableperclasshierarchy)。关联映射(6)继承关系映射Employee.javapublicclassEmployeeimplementsjava.io.SerializableprivateLongid;privateStringname;privateDoublesalary;privateStringposition;privateManagermgr;Manager.javapublicclassManagerexte
40、ndsEmployeeSetclerks;Clerk.javapublicclassClerkextendsEmployeeManagermanager;关联映射(6)继承关系映射employee_seq 关联映射(6)继承关系映射Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Managerm=newManager();m.setName(king);m.setSalary(3000.00);Clerkc1=newClerk();Clerkc2=newCl
41、erk();c1.setName(peter);c2.setName(scott);c1.setManager(m);c1.setSalary(1000.00);c2.setManager(m);c2.setSalary(1200.00);HashSetclerks=newHashSet();clerks.add(c1);clerks.add(c2);m.setClerks(clerks);session.save(m);mit();session.close();案例:09_InheritHibernate程序设计第五讲Hibernate查询查询概述Hibernate语言查询(语言查询(Hi
42、bernate Query Language HQL):完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。标准化对象查询标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)Native SQL Queries(原生(原生SQL查询)查询):直接使用数据库提供的SQL方言进行查询。HQL基本查询HQL查询过程中操作对象是类、实例或属性,而不是表列行等概念,H
43、QL可以理解如继承关联等面向对象概念基本的HQL查询有:fromEmployeeselectdept.name,dept.descriptionfromDepartmentasdeptorderbydept.namedescselectdistinctemp.deptnofromEmployeeasempselectnewDepartment(dept.name,dept.description)fromDepartmentasdeptorderbydept.nameascHQL基本查询Sessionsession=factory.openSession();Queryquery=sessio
44、n.createQuery(“fromCustomer);Listcustomers=query.list();Iteratoriterator=customers.iterator();while(iterator.hasNext()Customercustomer=(Customer)iterator.next();System.out.println(customer.getID()+t+customer.getName()+t+customer.getSalary();是对象类型而非数据表是对象类型而非数据表结果集为对象集结果集为对象集,不用处理复杂的不用处理复杂的resultSetH
45、QL基本查询Sessionsession=factory.openSession();Queryquery=session.createQuery(“selectc.name,c.salaryfromCustomerasc);Listcustomers=query.list();Iteratoriterator=customers.iterator();while(iterator.hasNext()Objectobj=(Object)iterator.next();System.out.println(obj0+t+obj1);数组方式的结果集数组方式的结果集HQL条件查询用where子句来
46、限定结果集fromVendorasvwherev.address=:addressandv.namelikejava%updateDepartmentasdeptsetdept.name=deptname_updatewheredept.namein(deptname1,deptname2deleteDepartmentwheredescriptionisnull占位符占位符标准化对象查询(QueryByCriteria)Criteriacriteria=session.createCriteria(Customer.class);Listcusts=criteria.list();Itera
47、toriterator=custs.iterator();while(iterator.hasNext()Customercust=(Customer)iterator.next();System.out.println(cust.getId()+t+cust.getName()+t+cust.getSalary();标准化对象查询(QueryByCriteria)Criteriacriteria=session.createCriteria(Customer.class);criteria.add(Restrictions.gt(salary,newDouble(2000.00);crite
48、ria.add(Restrictions.lt(salary,newDouble(3000.00);Listcusts=criteria.list();Criteriacriteria=session.createCriteria(Customer.class);criteria.add(Restrictions.or(Restrictions.eq(salary,newDouble(2000),Restrictions.isNull(salary);Listusers=criteria.list();加条件过滤结果集加条件过滤结果集原生SQL查询(NativeSQLQueries)原生SQL
49、查询即是直接使用数据库提供的SQL方言进行查询。Hibernate提供了对SQL的支持,程序开发人员可以自行建立SQL,并将对象类和数据表对应起来。既可以获得SQL的灵活性又不必处理繁琐的ResultSet原生SQL查询(NativeSQLQueries)Stringsql=selectcust.*fromCustomercustwherecust.salary2000;Sessionsession=sessionFactory.openSession();SQLQuerysqlQuery=session.createSQLQuery(sql);sqlQuery.addEntity(cust,Customer.class);Iteratoriterator=sqlQuery.list().iterator();while(iterator.hasNext()Customercust=(Customer)iterator.next();System.out.println(cust.getName()+t+cust.getSalary();session.close();建立SQLQuery将表的别名将表的别名cust和对象类关联在一起和对象类关联在一起执行查询执行查询小结Hibernate概述实体映射基础复杂实体映射关联映射Hibernate查询
限制150内