首页 第9章 利用Hibernate进行持久层开发

第9章 利用Hibernate进行持久层开发

举报
开通vip

第9章 利用Hibernate进行持久层开发nullJ2EE实用技术J2EE实用技术第9章 利用Hibernate进行持久层开发学习内容学习内容9.1 使用Hibernate的图书管理系统 9.2 Hibernate概述 9.3 第一个Hibernate例子 9.4 Hibernate.cfg.xml文件的配置 9.5 利用工具生成映射文件 9.6 操作持久化数据使用Hibernate的图书管理系统 使用Hibernate的图书管理系统 使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码:pu...

第9章 利用Hibernate进行持久层开发
nullJ2EE实用技术J2EE实用技术第9章 利用Hibernate进行持久层开发学习内容学习内容9.1 使用Hibernate的图书管理系统 9.2 Hibernate概述 9.3 第一个Hibernate例子 9.4 Hibernate.cfg.xml文件的配置 9.5 利用工具生成映射文件 9.6 操作持久化数据使用Hibernate的图书管理系统 使用Hibernate的图书管理系统 使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码:public class BookDaoHibernateImp implements BookDao { public Book findByPrimaryKey(String pk) { Session session = getSession(); try { if (session != null) { Book book = (Book) session.load(Book.class, pk); return book; } } catch (HibernateException e) { e.printStackTrace(); } return null; }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码:public List find(String author, String bookname, String publishing) { Session session = getSession(); try { if (session != null) { List list = session .find( "from Book where bookname like ? and author like ? and publishing like ?", new Object[] { "%" + bookname + "%", "%" + author + "%", "%" + publishing + "%" }, new Type[] { Hibernate.STRING, Hibernate.STRING, Hibernate.STRING }); return list;使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码: } } catch (HibernateException e) { e.printStackTrace(); } return null; } public void create(Book book) { Session session = getSession(); try { if (session != null) { Transaction ts = session.beginTransaction(); session.save(book); ts.commit(); }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码: } catch (HibernateException e) { e.printStackTrace(); } }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码: public void delete(String pk) { Session session = getSession(); try { if (session != null) { Transaction ts = session.beginTransaction(); Book book = (Book) session.load(Book.class, pk); session.delete(book); ts.commit(); } } catch (HibernateException e) { e.printStackTrace(); } }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码:public void modify(Book book) { Session session = getSession(); try { if (session != null) { Transaction ts = session.beginTransaction(); Book dbbook = (Book) session.load(Book.class, book.getBookid()); dbbook.setAuthor(book.getAuthor()); dbbook.setBookname(book.getBookname()); dbbook.setPublishing(book.getPublishing());使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码: dbbook.setPublishingdate(book.getPublishingdate()); dbbook.setStorage(book.getStorage()); session.save(dbbook); ts.commit(); } } catch (HibernateException e) { e.printStackTrace(); } }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码: public List find() { Session session = getSession(); try { if (session != null) { List list = session.find("from Book"); return list; } } catch (HibernateException e) { e.printStackTrace(); } return null; }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码: public String findMaxId() { Session session = getSession(); try { if (session != null) { Iterator it2 = session .iterate("select max(b.bookid) from Book as b"); while (it2.hasNext()) { String id = (String) it2.next(); return id; } } } catch (HibernateException e) { e.printStackTrace(); } return null; }使用Hibernate的图书管理系统使用Hibernate的图书管理系统BookDaoHibernateImp 代码:private Session getSession() { Session session = null; try { // 1. Configuration config = new Configuration().configure(); // 2. SessionFactory sessionFactory = config.buildSessionFactory(); // 3. session = sessionFactory.openSession(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } return session; } } 使用Hibernate的图书管理系统使用Hibernate的图书管理系统UserDaoHibernateImp代码:public class UserDaoHibernateImp implements UserDao { public UserInfo findByPrimaryKey(String pk) { Session session = getSession(); try { if (session != null) { UserInfo userinfo = (UserInfo) session.load(UserInfo.class, pk); return userinfo; } } catch (HibernateException e) { e.printStackTrace(); } return null; }使用Hibernate的图书管理系统使用Hibernate的图书管理系统UserDaoHibernateImp代码: public void create(UserInfo user) { // TODO Auto-generated method stub } public void delete(String pk) { // TODO Auto-generated method stub } public void modify(UserInfo user) { // TODO Auto-generated method stub } public List find() { // TODO Auto-generated method stub return null; }使用Hibernate的图书管理系统使用Hibernate的图书管理系统UserDaoHibernateImp代码:private Session getSession() { Session session = null; try { // 1. Configuration config = new Configuration().configure(); // 2. SessionFactory sessionFactory = config.buildSessionFactory(); // 3. session = sessionFactory.openSession(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } return session; } } 使用Hibernate的图书管理系统使用Hibernate的图书管理系统UserInfo代码:public class UserInfo implements Serializable { ……. /** full constructor */ public UserInfo(String username, String password, String authority) { this.username = username; this.password = password; this.authority = authority; } …… } null业务领域对象业务领域对象业务领域对象Book.java代码:…… /** full constructor */ public Book(String bookid, String bookname, String author, String publishing, String publishingdate, Integer storage) { this.bookid = bookid; this.bookname = bookname; this.author = author; this.publishing = publishing; this.publishingdate = publishingdate; this.storage = storage; } ……业务领域对象业务领域对象Book.hbm.xml映射文件 :…… ……nullUserInfo.hbm.xml映射文件 J2EE中的层次J2EE中的层次 J2EE中的层次 J2EE中的层次 数据持久层就是访问数据库层,我们要将从服务层中分离出来数据持久化代码到数据持久层。也就是在业务服务层中不应该再有数据持久化的代码(Select、Update、Insert和Delete)。现在我们用Hibernate实现数据持久层。Hibernate概述 Hibernate概述 在企业开发中,把对象持久化到关系数据库中可能是相当麻烦、浪费时间的。Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。Hibernate概述 Hibernate概述 Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。 Hibernate概述 Hibernate概述 Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案,对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。不管怎样,Hibernate一定可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。 Hibernate体系结构Hibernate体系结构概括的体系结构 Hibernate体系结构Hibernate体系结构详细的体系结构 图中一些对象的定义图中一些对象的定义SessionFactory (net.sf.hibernate.SessionFactory) 它是Session的工厂。 会话,Session (net.sf.hibernate.Session) 代表应用程序和持久化层之间的一次对话。 持久化对象(Persistent Object)及其集合(Collection) 它们代表数据表中的一条记录,包含了持久化状态,它们可能是普通的JavaBeans/POJOs,是系统中的业务领域对象。图中一些对象的定义图中一些对象的定义临时对象(Transient Object)及其集合(Collection) 它们不代表数据表中的任何数据,没有从属于一个Session的持久化类的实例。他们可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session所实例化的。 事务,Transaction (net.sf.hibernate.Transaction) 可选) ,应用程序用它来管理事务原子性操作。 ConnectionProvider (net.sf.hibernate.connection.ConnectionProvider) (可选)JDBC连接的工厂和池。 TransactionFactory (net.sf.hibernate.TransactionFactory) (可选)事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。 第一个Hibernate例子 第一个Hibernate例子 步骤: 1.创建一个普通的Java工程(如果是一个Web项目可以建立一个Web工程)。 2.为工程添加Hibernate的支持。 3.创建数据库结构。 4.编写POJO类型的领域对象。 5.为这个POJO的领域对象编写数据库表映射XML文件。 6.编写hibernate.cfg.xml配置文件。 7.测试运行。建立一个Java普通工程 建立一个Java普通工程 添加Hibernate支持添加Hibernate支持选择Hibernate2.1 选择Hibernate2.1 nullnullnull打开『Source』tag打开『Source』tag添加配置文件代码添加配置文件代码数据库表与POJO对象映射文件数据库表与POJO对象映射文件AppUser.hbm.xml编写AppUser.java POJO的业务领域对象编写AppUser.java POJO的业务领域对象编写AppUser.java POJO的业务领域对象编写AppUser.java POJO的业务领域对象编写测试程序 编写测试程序 …… private static void insert() throws HibernateException { // 1、Configuration的初始化 Configuration config = new Configuration().configure(); // 2、获得SessionFactory SessionFactory sf = config.buildSessionFactory(); // 3、获得Session Session session = sf.openSession(); Transaction ts = session.beginTransaction(); AppUser user = new AppUser(); user.setFirstName("Tony"); user.setLastName("Guan"); user.setId("99999"); session.save(user); ts.commit(); } …… Hibernate.cfg.xml文件的配置 Hibernate.cfg.xml文件的配置 配置数据库连接 配置数据库连接 配置SQL Dialects SQL 方言 配置SQL Dialects SQL 方言 配置SQL Dialects SQL 方言 配置SQL Dialects SQL 方言 配置SQL输出 配置SQL输出 True是把所有的SQL语句都输出到控制台 ,取值. true | false 。 配置事务管理类型 配置事务管理类型 事务类型有JDBC 和JTA,我们这里使用JDBC,配置方式如下: net.sf.hibernate.transaction.JDBCTransactionFactory映射文件配置 映射文件配置 所有的映射文件都有配置到这里,注意配置文件名必须包含其相对于根的全路径: 利用工具生成映射文件和业务领域对象利用工具生成映射文件和业务领域对象Hibernate 从本质上来讲是一种“对象-关系型数据映射”(Object RelationalMapping 简称ORM)。在一个系统中存在实体对象就是我们说的业务领域对象(Domain Object),例如我们的图书管理系统中的Book就是业务领域对象,在数据库中有这个对象对应的表(因为业务领域对象需要持久化),在程序里也有这个对象——Book类,这样的类我们叫实体类,业务领域对象一般被设计为POJO对象,这样的对象没有业务逻辑方法,只有属性和对属性操作的set/get方法。ORM就是将它们两个关系起来,而映射(Mapping)文件则是将对象(Object)与关系型数据(Relational)相关联的纽带,在Hibernate中,映射文件通常以“.hbm.xml”作为后缀。构建Hibernate基础代码通常有以下途径 构建Hibernate基础代码通常有以下途径 1. 手工编写。 2. 直接从数据库中导出表结构,并生成对应的ORM文件和Java 代码。 3. 根据现有的Java 代码生成对应的映射文件,将Java 代码与数据库表相绑定。 null使用Middlegen-Hibernate工具使用Middlegen-Hibernate工具Middlegen-Hibernate软件包解压缩 配置目标数据库参数 \config\database 子目录,oracle.xml根据数据库的实际情况修改这个文件使用Middlegen-Hibernate工具使用Middlegen-Hibernate工具修改Build.xml 目标数据库配置文件地址查找关键字 “!ENTITY”,得到:修改为oracle.xml使用Middlegen-Hibernate工具使用Middlegen-Hibernate工具修改Build.xml Application name “airline”是MiddleGen原始配置中默认的 Application Name,将其修改为我们所希望的名称,如“HibernateSample”:使用Middlegen-Hibernate工具使用Middlegen-Hibernate工具输出目录 查找关键字“name="build.gen-src.dir"”,得到:指向我们所期望的输出目录使用Middlegen-Hibernate工具使用Middlegen-Hibernate工具 对应代码的Package name 查找关键字“destination”,得到:我们自己的package使用Middlegen-Hibernate工具使用Middlegen-Hibernate工具在MiddleGen 根目录下运行ant(或ant middlegen),就将出现MiddleGen的界面: 操作持久化数据操作持久化数据装载对象 查询对象 更新对象 删除对象 创建一个持久化对象创建一个持久化对象对象(实体的实例)对一个特定的Session来说,要么是一个瞬时(transient)对象,要么是持久化(persistent)对象。刚刚创建的对象当然是瞬时的(又称为临时对象)。 session则提供了把瞬时实例保存(持久化)的服务: 装载对象装载对象如果你已知某个持久化实例的标识符,Session的load()方法让你取出它。 第一种形式使用一个类对象作为参数,会把状态装载到另一个新创建的对象中去。 第二个版本允许你给出一个实例,会在其中装载状态。查询对象查询对象如果你不能确定你要寻找的对象的标示符,请使用Session的find()方法。Hibernate使用一种简单而强大的面向对象查询语言。查询对象查询对象如果你知道你的查询会返回非常大量的对象,iterate()方法获得更好的性能:更新对象更新对象持久化实例(就是通过session装载、保存、创建或者查询出的对象)可以被程序操作,所做的任何修改都会在Session同步(flushed)的时候被持久化。所以最直接的更改一个对象的方法就是load()它,然后直接修改即可。更新对象更新对象Transaction ts = session.beginTransaction(); AppUser user = new AppUser(); user.setFirstName("Tony"); user.setLastName("Guan"); user.setId("99999"); session.save(user); ts.commit(); 删除持久化对象删除持久化对象使用Session.delete()会把对象的状态从数据库中移除。当然,你的应用程序可能仍然持有一个指向它的引用。所以,最好这样理解:delete()的用途是把一个持久化实例变成临时实例。 你可以通过传递给delete()一个Hibernate 查询字符串来一次性删除很多对象。 删除持久化对象删除持久化对象Transaction ts = session.beginTransaction(); sess.delete(cat); ts.commit();
本文档为【第9章 利用Hibernate进行持久层开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_963709
暂无简介~
格式:ppt
大小:1013KB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2011-03-30
浏览量:10