第4周-struts2Hibernate教程Hibernate开发步骤_第1页
第4周-struts2Hibernate教程Hibernate开发步骤_第2页
第4周-struts2Hibernate教程Hibernate开发步骤_第3页
第4周-struts2Hibernate教程Hibernate开发步骤_第4页
第4周-struts2Hibernate教程Hibernate开发步骤_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

以用户注册为例。一、ORM原理图1-1 ORM基本原理 图1-2 用户表ORM映射过程1、 基本概念Hibernate是轻量级的ORM框架,企业级应用中数据持久层的应用框架,Hibernate对JDBC进行了轻量级的封装,将Java对象与对象关系映射至关系型数据库中的数据表与数据表之间的关系,对Java对象的方法操作映射为数据库表访问的操作。2、Hibernate的特点(1)Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码;(2)Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现工具。它很大程度上简化了DAO层的编码工作;(3)Hibernate使用Java反射机制,而不是用字节码增强程序来实现透明性;(4)由于Hibernate是Hibernate映射的灵活性很出色,支持各种关系数据库,从一对一到多对多的各种复杂关系。3、 Hibernate支持所需lib 以hibernate-3.0.5为例,所需lib如表所示, hibernate3.jarHibernate核心包xerces-2.6.2.jar (2.6.2)SAX parserruntime, required for JDK 1.4commons-collections-2.1.1.jar (2.1.1)Commons Collectionsruntime, requiredasm.jar ASM bytecode libraryruntime, requiredcglib-2.1.jar (2.1.0)CGLIB bytecode generatorruntime, requireddom4j-1.6.jar (1.6)XML configuration & mapping parserHibernate 配置文件解释log4j-1.2.9.jar (1.2.9)Log4j Libraryasm-attrs.jarASM bytecode libraryruntime, requiredc3p0-数据连接池Hibernate默认使用ehcache-1.1.jarehcache缓存Hibernate默认使用表1-1 Hibernate支持所需lib4、 Hibernate体系架构图1-3 Hibernate 体系架构(1) 应用层 Java应用程序调用Hibernate的API实现持久化对象操作。(2) 持久层 Hibernate框架将持久化对象的操作映射为数据库表的SQL执行动作。(3) 存储层 数据库存储数据。5、 Hibernate主要接口Hibernate主要接口包括Configuration、SessionFactory、Session、Transaction、Query.(1) Configuration Configuration加载Hibernate.cfg.xml或者perties构建SessionFactory的单个实例。SessionFactory实例是单例,是不可变的,仅映射一个数据库实例,不会保留与Configuration的任何关联。(2) SessionFactory单个数据库映射关系经过编译后的内存镜像,它也是线程安全的(不可变)。 它是构建Session实例的工厂,本身要用到ConnectionProvider接口,该接口提供第三方连接池实现(如C3P0ConnectionProvider)。 该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。通过调用save(),persist()或saveOrUpdate()可以使瞬态实例持久化。 通过调用delete()可以使持久化实例变为瞬态。 get()或load()方法返回的任何实例都是持久的。 可以通过调用update(),saveOrUpdate(),lock()或replicate()使分离的实例持久化。 通过调用merge(),瞬态或分离实例的状态也可以作为新的持久实例持久化。(3) Session表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。session示例: Session sess = factory.openSession(); Transaction tx; try tx = sess.beginTransaction(); /do some work . mit(); catch (Exception e) if (tx!=null) tx.rollback(); throw e; finally sess.close(); (4) Transaction应用程序用来指定原子操作单元范围的对象,它是单线程的,生存期很短。 它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。 某些情况下,一个Session之内可能包含多个Transaction对象。 尽管是否使用该对象是可选的,但是事务边界的开启与关闭(无论是使用底层的API还是使用Transaction对象)是必不可少的。(5) Query Hibernate 面向对象查询接口,通过调用Session.createQuery()获取Query实例,通过调用list(),scroll()或iterate()来执行查询。1)Query简单示例: Session sess = factory.openSession(); try String hql=”from User”;Query query=sess.createQuery(hql);List list=query.list(); catch (Exception e) throw e; finally sess.close(); 2)Query动态占位?参数: Session sess = factory.openSession(); try String hql=”from User where userid=?”;Query query=sess.createQuery(hql);query.setString(1, admin);List list=query.list(); catch (Exception e) throw e; finally sess.close(); 3)Query动态HQL参数: Session sess = factory.openSession(); try String hql=”from User where userid=:userid”;Query query=sess.createQuery(hql);query.setString(“userid”, admin);List list=query.list(); catch (Exception e) throw e; finally sess.close(); 4)Query分页: Session sess = factory.openSession(); try String hql=”from User ”;Query query=sess.createQuery(hql);query=query.setFirstResult(0);query=query.setMaxResults(10);/分页数10条记录List list=query.list(); catch (Exception e) throw e; finally sess.close(); 6、 持久化实例状态及转换一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关Hibernate的Session对象就是这个所谓的持久化上下文。持久化对象可以处于如下几种状态:瞬态(transient state)、持久化(persistent state)和脱管(detached state)状态。图1-4 持久化上下文中POJO对象的状态及转换(1)瞬态:一个持久化对象被创建(new运算符创建)之后,但尚未被Hibernate Session对象关联,此时认为该对象处于瞬态。瞬态对象不会被保存至数据库中,只有被Hibernate Session关联之后,才能将该对象转换为持久化状态。如果处于瞬态的对象一旦失去地址引用,它将被JVM销毁。(2)持久化状态:处于该状态的持久化对象是一个通过Hibernate Session对象关联被保存的对象,或者从数据库中加载的对象,此时持久化对象拥有一个标识符,作为区别其他对象的标识。(3)脱管状态:若一个持久化对象处于持久化状态,但若Hibernate Session对象通过close()方法被关闭了,那么此时该持久化对象就处于脱管状态了。在Hibernate中,对处于脱管状态的对象引用依然有效,仍可以修改脱管对象。如果其他的Hibernate Session又关联了该脱管对象,此时该脱管对象又将转换为持久化状态。7、 Hibernate工作过程第一步:读取并解析配置文件hibernate.cfg.xml,主要由Configuration类的configure()方法负责实现。第二步:读取并解析映射文件*.hbm.xml,通过Configuration类的buildSessionFactory()方法实现,同时该方法将返回一个会话工厂SessionFactory。第三步:打开会话Session,由SessionFactory的openSession()方法实现。第四步:创建事务管理对象Transaction,Transaction对象由Session对象的beginTransaction()方法创建。第五步:对数据库进行操作。对数据库的操作主要依赖于Session类的一些方法来实现,如load()方法、delete()方法、save()方法等,实现对数据库的CRUD操作。第六步:提交事务。完成了对数据库的操作之后就应该提交事务,完成数据在数据库中持久化。第七步:关闭Session和SessionFactory对象。完成上述操作之后,就可以关闭Session和SessionFactory对象,以释放内存空间。二、开发步骤1、 创建web项目user。2、 添加Hibernate支持包、hibernate.cfg.xml,perties。3、 定义web项目的java源程序目录(即 软件包的划分)4、 创建web资源目录,包括JSP页面、css文件、静态图片文件、脚本文件等。5、 编写实体POJO类 User类,类图如图2-1所示,代码参考附录3-User.java图2-1 User 类6、 编写实体POJO类 User类的ORM映射文件,命名为User.hbm.xml。参考附录4-User.hbm.xml。7、 编写HibernateUtil类创建SessionFactory 实例,构建session实例,类图如2-2所示。图2-2 HibernateUtil类参考代码如附录-5所示。8、 编写数据访问类UserDao.java,,类图如2-3所示。图2-3 UserDao类参考代码如附录-6所示。附录1-Hibernate配置文件 org.hibernate.connection.C3P0ConnectionProvidercom.mysql.jdbc.Driverjdbc:mysql:/:3306/testrootroot520org.hibernate.dialect.MySQLDialectupdatetrue附录2-log4j日志配置文件perties# Log4J Settings for log4j 1.2.x (via jakarta-commons-logging)# The five logging levels used by Log are (in order):# 1. DEBUG (the least serious)# 2. INFO# 3. WARN# 4. ERROR# 5. FATAL (the most serious)# Set root logger level to WARN and append to stdoutlog4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout# Pattern to output the callers file name and line number.log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%.hibernate=INFO附录3-User.javapackage com.gxuwz.user.entity;/* * 用户实体类 * author 演示 * */public class User private String userid;private String pwd;public User()public String getUserid() return userid;public void setUserid(String userid) this.userid = userid;public String getPwd() return pwd;public void setPwd(String pwd) this.pwd = pwd;附录4-User.hbm.xml 密码附录-5 HibernateUtil.javapackage com.gxuwz.user.util;import org.apache.log4j.Logger;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil private static final Logger logger =Logger.getLogger(HibernateUtil.class);public static final SessionFactory sessionFactory;public static final ThreadLocal session = new ThreadLocal();static try / 加载并解析hibernate.cfg.xml配置文件,生成数据库内存镜像(SessionFactory)sessionFactory = new Configuration().configure().buildSessionFactory();(加载解析Hibernate.cfg.xml); catch (Throwable ex) /保证异常对象能被JVM回收System.err.println(Initial SessionFactory creation failed. + ex);throw new ExceptionInInitializerError(ex);public static Session currentSession() throws HibernateException Session s = (Session) session.get();/ 如果session没有绑定到线程副本上,创建新的session对象(sessionFactory:+sessionFactory.hashCode();if (s = null) s = sessionFactory.openSession();session.set(s);(获取session对象);return s;public static void closeSession() throws HibernateException Session s = (Session) session.get();if (s != null)s.close();

温馨提示

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

评论

0/150

提交评论