Hibernate程序设计.ppt

上传人:tia****nde 文档编号:11496530 上传时间:2020-04-25 格式:PPT 页数:85 大小:553KB
返回 下载 相关 举报
Hibernate程序设计.ppt_第1页
第1页 / 共85页
Hibernate程序设计.ppt_第2页
第2页 / 共85页
Hibernate程序设计.ppt_第3页
第3页 / 共85页
点击查看更多>>
资源描述
Hibernate程序设计,第一讲Hibernate概述第二讲对象关系映射基础第三讲复杂实体映射第四讲关联映射第五讲Hibernate查询,Hibernate程序设计,第一讲Hibernate概述,Hibernate概述,一个主流的持久化框架在JDBC基础上进行分装只需要少量代码就可以完成持久化工作一个优秀的ORM(对象-关系映射)机制通过映射文件保存映射信息在业务层以面向对象的方式编程,封装对数据库的访问细节.,应用程序中对象(O),姓名:mary性别:女年龄:20,ORM(对象-关系映射):完成对象数据到关系型数据映射的机制称为对象-关系映射,简称ORM。,持久化层,什么是ORM?,数据库,关系型数据(R),优点:Productivity,Maintainability,Performance,Vendorindependence,Hibernate优势,开源成熟流行(约13000downloads/month)自定义APIJBoss用Hibernate3实现EntityBeans,下载及设置hibernate,http:/www.hibernate.org/,第一个Hibernate案例,问题描述:利用HibernateAPI对Customer数据表增加记录步骤:添加Hibernate库配置hibernate.cfg.xml添加POJO对象类Customer配置映射文件Customer.hbm.xml在程序中实现对数据库的操作,hibernate.cfg.xmloracle.jdbc.driver.OracleDriverjdbc:oracle:thin:localhost:1521:oradbscotttigerorg.hibernate.dialect.Oracle9Dialect,配置JDBC驱动,配置JDBC连库URL,用户名密码,指定数据库方言,Customer.hbm.xmlcust_seq,实体类到表的映射,主键生成方式,属性到字段的映射,7个步骤:Configuration创建SessionFactory打开Session开始一个事务持久化操作save/update/delete/find提交事务关闭Session,在程序中实现对数据库的操作,publicclassTest01privatestaticSessionFactoryfactory;staticConfigurationcfg=newConfiguration();cfg.configure();cfg.addClass(Customer.class);factory=cfg.buildSessionFactory();publicstaticvoidmain(Stringargs)Test01test=newTest01();test.testSave();/*用于演示session的save方法*/,publicvoidtestSave()Sessionsession=factory.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.close();,第二个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();if(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(HibernateExceptionex)ex.printStackTrace();if(tx!=null)tx.rollback();finallysession.close();,Hibernate程序设计,第二讲Hibernate映射基础,Hibernate基本配置,Hibernate配置文件:hibernate.cfg.xmlPOJO对象:Customer.class映射文件:Customer.hbm.xml应用程序:Test01.class,hibernate.cfg.xml,oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:localhost:1521:oradbscotttigerorg.hibernate.dialect.Oracle9Dialect,Hibernate配置文件,Hibernate映射文件Customer.hbm.xml,cust_seq,Hibernate基本数据类型,Hibernate主键生成方式,Hibernate主键生成方式,Hibernate架构,实体对象(PersistentObject)持久化的对象Hibernate配置文件配置数据库连接信息Hibernate映射文件配置对象和关系表的映射信息,Hibernate核心API,Configuration对象负责管理数据库的配置信息Configuration对象通过加载配置文件(hibernate.cfg.xml)获取并管理这些信息,Configurationconfig=newConfiguration();config.configure();Filefile=newFile(“C:myhibernate.xml”);Configurationconfig=newConfiguration().configure(file);,通过classpath找配置文件,自定义配置文件的位置,Hibernate核心API,SessionFactory负责创建Session对象SessionFactory对象中保存当前的数据库配置信息和所有映射关系以及预定义的SQL语句SessionFactory负责维护Hibernate的二级缓存SessionFactory对象采取了线程安全的设计方式,如何创建SessionFactory对象?,Configurationconfig=newConfiguration().configure();SessionFactoryfactory=config.buildSessionFactory();,Hibernate核心API,Session对象的添加、更新、删除和查询Session的设计是非线程安全的Session对象由SessionFactory对象创建,Configurationconfig=newConfiguration().configure();SessionFactoryfactory=config.buildSessionFactory();Sessionsession=factory.openSession();,Hibernate核心API,TransactionHibernate本身没有事务管理功能,需要依赖JDBC或JTA的事务事务管理功能使用Hibernate进行操作时(增、删、改)必须显式的调用Transaction(默认:autoCommit=false),Transactiontx=session.beginTransaction();,持久化对象的生命周期,持久化对象的状态,TransientObjects:使用new操作符初始化的对象的状态是瞬时的,如果没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,它们的状态将会丢失,并由垃圾回收机制回收。PersistObjects:如果内存中的对象和数据库的记录有对应关系,即和session对象相关,则此对象处于Persistent状态,在当事务提交时它们的状态和数据库进行同步DetachedObjects:Session关闭之后,持久化对象就变为detached对象。表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。,Hibernate程序设计,第三讲Hibernate高级映射,实体映射(1)联合主键,在数据表设计时使用两个列作为联合主键时,用HibernateAPI来完成对象关系映射CREATETABLEstudents(firstnamevarchar2(16)NOTNULL,lastnamevarchar2(16)NOTNULL,majorvarchar2(100),PRIMARYKEY(firstname,lastname);,实体映射(1)联合主键,StudentsId.javapublicclassStudentsIdimplementsjava.io.SerializableprivateStringfirstname;privateStringlastname;Students.javapublicclassStudentsimplementsjava.io.SerializableprivateStudentsIdid;privateStringmajor;,实体映射(1)联合主键,实体映射(1)联合主键,Studentsstudent=newStudents();StudentsIdpk=newStudentsId();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)组合关系映射,CREATETABLEPerson(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.javapublicclassAddressprivateStringcity;privateStringstreet;privateStringzipcode;Person.javapublicclassPersonimplementsjava.io.Serializable/FieldsprivateLongid;privateStringname;privateAddressaddress;privateAddressmailAddress;,实体映射(2)组合关系映射,映射组合关系person_seq,实体映射(2)组合关系映射,Personperson=newPerson();person.setName(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();HibernateSessionFactory.closeSession();案例:03_Component,实体映射(3)大对象类型映射,createtableusers(idnumberprimarykey,namevarchar2(20),passwordvarchar2(20),imageblob,resumeclob);,实体映射(3)大对象类型映射,.0,OracleJDBC不允许使用批处理方式进行操作,所以需要在Hibernate配置文件中,将hibernate.jdbc.batch_size设为0.,实体映射(3)大对象类型映射,Users.javapublicclassUsersimplementsjava.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(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(alotsofwords);user.setImage(Hibernate.createBlob(fileInputStream);session.save(user);mit();fileInputStream.close();HibernateSessionFactory.closeSession();,Hibernate程序设计,第四讲Hibernate关联映射,关联映射(1)集合类映射,映射集合类关系:一本书,可能属于多个类别CREATETABLEbook(idnumberprimarykey,booknamevarchar2(20)NOTNULL);CREATETABLEtopic(idnumber,topicnamevarchar2(20)NOTNULL);ALTERTABLEtopicADDPRIMARYKEY(id,topicname);ALTERTABLEtopicADDFOREIGNKEY(id)REFERENCESbook(id);,关联映射(1)集合类映射,Book.javapublicclassBookimplementsjava.io.SerializableprivateLongid;privateStringbookname;privateSettopics=newHashSet(0);,关联映射(1)集合类映射,book_seq,关联映射(1)集合类映射,Sessionsession=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);book2.addTopic(MVC);session.save(book1);session.save(book2);mit();HibernateSessionFactory.closeSession();,关联映射(2)一对多/多对一,一对多关联直接连接两个类对应的表,而没有连接表,两个表之间通过唯一的外键关联。外键与另一个类的主键对应。一对多的关联经常见到,如一个部门有很多员工,一个学校有很多学生等。,关联映射(2)一对多/多对一,Employee.javapublicclassEmployeeimplementsjava.io.SerializableprivateLongempid;privateStringename;privateDepartmentdepartment;Department.javapublicclassDepartmentimplementsjava.io.Serializable/FieldsprivateLongdeptid;privateStringdname;privateStringlocation;privateSetemployees=newHashSet(0);,关联映射(2)一对多/多对一,employee_seq,关联映射(2)一对多/多对一,department_seq,关联映射(2)一对多/多对一,Employeeemp1=newEmployee();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=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(dept1);mit();HibernateSessionFactory.closeSession();,案例:06_one-to-many,Set集合,Set集合,name集合属性的名称table(可选)目标关联数据库表lazy(可选默认为false)允许延迟加载(lazyinitialization)inverse(可选默认为false)标记有哪一方来维护关联关系(双向关联中使用)。cascade(可选默认为none)让操作级联到子实体order-by(可选,仅用于jdk1.4)指定表的字段(一个或几个)再加上asc或者desc(可选),定义Map,Set和Bag的迭代顺序where(可选)指定任意的SQLwhere条件outer-join(可选-默认为auto)是否使用外联接,cascade级联操作,关联映射(3)一对一:外键关联,一对一关联指两个表之间的记录是一一对应的关系。分为两种:外键关联和主键关联。比如一家公司(Company)和它所在的地址(Address)。在业务逻辑中要求一家公司只有唯一的地址,一个地址也只有一家公司。下图表现为外键关联关系。,关联映射(3)一对一:外键关联,Company.javapublicclassCompanyimplementsjava.io.SerializableprivateLongid;privateStringname;privateAddressaddress;,Address.javapublicclassAddressimplementsjava.io.Serializable/FieldsprivateLongid;privateStringcity;privateStringcountry;privateCompanycompany;,关联映射(3)一对一:外键关联,company_seq,关联映射(3)一对一:外键关联,address_seq,关联映射(3)一对一:外键关联,Companycompany1=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);company2.setAddress(address2);Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(company1);session.save(company2);mit();HibernateSessionFactory.closeSession();,案例:07_one-to-one,关联映射(4)一对一:主键关联,一对一的另一种解决方式就是主键关联,在这种关联关系中,要求两个对象的主键必须保持一致,通过两个表的主键建立关联关系,无须外键参与。,关联映射(4)一对一:主键关联,POJO对象的结构和一对一关系中的外键关联方式相同。,关联映射(4)一对一:主键关联,company_seq,关联映射(4)一对一:主键关联,company,关联映射(4)一对一:主键关联,Companycompany1=newCompany();company1.setName(OriStand);Addressaddress1=newAddress();address1.setCity(BeiJing);address1.setCountry(China);company1.setAddress(address1);/company-addressaddress1.setCompany(company1);/address-companyCompanycompany2=newCompany();company2.setName(IBM);Addressaddress2=newAddress();address2.setCity(NewYork);address2.setCountry(American);company2.setAddress(address2);address2.setCompany(company2);Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();session.save(company1);session.save(company2);mit();HibernateSessionFactory.closeSession();,案例:07_one-to-one,关联映射(5)多对多,多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系。,关联映射(5)多对多,Student.javapublicclassStudentimplementsjava.io.SerializableprivateLongid;privateStringname;privateSetcourses=newHashSet(0);,Course.javapublicclassCourseimplementsjava.io.SerializableprivateLongid;privateStringname;privateSetstudents=newHashSet(0);,关联映射(5)多对多,student_seq,关联映射(5)多对多,course_seq,关联映射(5)多对多,Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Studentstudent1=newStudent();student1.setName(peter);student1.setCourses(newHashSet();Studentstudent2=newStudent();student2.setName(scott);student2.setCourses(newHashSet();Coursecourse1=newCourse();course1.setName(Java);Coursecourse2=newCourse();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)继承关系映射,在业务逻辑的设计中,继承关系是非常常见的。对于继承关系在数据库中数据表上的映射方式,Hibernate支持三种不同的基本继承映射策略。以第一种为例:类继承关系树中每个类共用一个表(tableperclasshierarchy)。,关联映射(6)继承关系映射,Employee.javapublicclassEmployeeimplementsjava.io.SerializableprivateLongid;privateStringname;privateDoublesalary;privateStringposition;privateManagermgr;Manager.javapublicclassManagerextendsEmployeeSetclerks;Clerk.javapublicclassClerkextendsEmployeeManagermanager;,关联映射(6)继承关系映射,employee_seq,关联映射(6)继承关系映射,Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Managerm=newManager();m.setName(king);m.setSalary(3000.00);Clerkc1=newClerk();Clerkc2=newClerk();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_Inherit,Hibernate程序设计,第五讲Hibernate查询,查询概述,Hibernate语言查询(HibernateQueryLanguageHQL):完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。标准化对象查询(CriteriaQuery):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)NativeSQLQueries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。,HQL基本查询,HQL查询过程中操作对象是类、实例或属性,而不是表列行等概念,HQL可以理解如继承关联等面向对象概念基本的HQL查询有:fromEmployeeselectdept.name,dept.descriptionfromDepartmentasdeptorderbydept.namedescselectdistinctemp.deptnofromEmployeeasempselectnewDepartment(dept.name,dept.description)fromDepartmentasdeptorderbydept.nameasc,HQL基本查询,Sessionsession=factory.openSession();Queryquery=session.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();,是对象类型而非数据表,结果集为对象集,不用处理复杂的resultSet,HQL基本查询,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子句来限定结果集fromVendorasvwherev.address=:addressandv.namelikejava%updateDepartmentasdeptsetdept.name=deptname_updatewheredept.namein(deptname1,deptname2deleteDepartmentwheredescriptionisnull,占位符,标准化对象查询(QueryByCriteria),Criteriacriteria=session.createCriteria(Customer.class);Listcusts=criteria.list();Iteratoriterator=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);criteria.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查询即是直接使用数据库提供的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查询,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!