《Hibernate详解》PPT课件.ppt

上传人:sh****n 文档编号:6607601 上传时间:2020-02-29 格式:PPT 页数:89 大小:652.36KB
返回 下载 相关 举报
《Hibernate详解》PPT课件.ppt_第1页
第1页 / 共89页
《Hibernate详解》PPT课件.ppt_第2页
第2页 / 共89页
《Hibernate详解》PPT课件.ppt_第3页
第3页 / 共89页
点击查看更多>>
资源描述
第9章Hibernate详解 CompanyLogo 主要内容 CompanyLogo 9 1Hibernate配置文件 Hibernate配置文件相当于本书前几章中用到的数据库属性文件db properties 用来为程序配置连接数据库的参数 如 数据库的驱动程序名 URL 用户名和密码等 它有两种格式 一种是hibernate properties一种是hibernate cfg xml CompanyLogo 配置Hibernate Hibernate的配置参数随环境不同而有所改变 但框架本身对大部分的配置参数提供了默认配置样例 使用时只需将样例文件复制到类路径下 并作自定义修改即可 CompanyLogo 9 1数据库连接配置 Hibernate支持两种数据库连接方式 JDBC和JNDIJDBC配置表JNDI配置表 CompanyLogo hibernate properties thisistheconnectionandhibernate dialectfomysql hibernate dialect net sf hibernate dialect MySQLDialecthibernate connection driver class org gjt mm mysql Driverhibernate connection url jdbc mysql ip 3306 databasename lastUpdateCount true useUnicode true characterEncoding gb2312hibernate connection username roothibernate connection password thisistheconnectionandhibernate dialectfomssqlserver hibernate dialect net sf hibernate dialect SQLServerDialect hibernate connection driver class net sourceforge jtds jdbc Driver hibernate connection url jdbc jtds sqlserver IP 1433 DatabaseName databasename charset cp936 hibernate connection username sa hibernate connection password sa CompanyLogo Hibernate cfg xml配置文件 com microsoft jdbc sqlserver SQLServerDriverjdbc microsoft sqlserver 127 0 0 1 1433 DatabaseName t filesasa100falseorg hibernate dialect SQLServerDialect CompanyLogo SQL方言 Hibernate能够实现应用程序与底层数据库的分离 但各个数据库的SQL语句有一定的差异 因此需要在Hibernate中设置一个SQL方言转换映射 即SQL方言 CompanyLogo 9 2持久化类 对象 用来实现业务问题实体的类 类似于我们以前的实体JavaBean 这些类一般遵循一些简单规则 即POJO 简单传统Java对象 编程模型 注意 这些规则并不是必须要遵循 但推荐 下面以一个简单的POJO类为例说明其具体规则 CompanyLogo Java语言 List Set ArrayList 泛型JSP JavaBean Servlet JDBC CompanyLogo 9 2 1一个简单的POJO类 packagehibernate3 object importjava awt Color importjava util HashSet importjava util Set importjava util Date publicclassCat privateLongid identifierprivateDatebirthdate privateColorcolor privatecharsex privatefloatweight privateintlitterId privatevoidsetId Longid this id id publicLonggetId returnid CompanyLogo voidsetBirthdate Datedate birthdate date publicDategetBirthdate returnbirthdate voidsetWeight floatweight this weight weight publicfloatgetWeight returnweight publicColorgetColor returncolor CompanyLogo voidsetColor Colorcolor this color color voidsetSex charsex this sex sex publicchargetSex returnsex CompanyLogo POJO类的主要规则 1 必须实现一个默认的 即无参的 构造方法2 推荐提供一个标识属性 该属性可以是任何名字 任何类型3 推荐使用非final的类 避免在非final类中使用publicfinal的方法 如果一旦使用则必须通过设置lazy false 来禁用代理4 推荐为持久化字段声明访问器 Accessor 和是否可变的标识 Mutators 5 如果想把持久类实例放入Set中 或者想重用脱管实例 则必须重载对象的equals 和hasCode 方法注 构造方法至少应是包内可见标识属性最好是可以为空的类型equals 和hasCode 这两个方法的实现应结合业务的需要 真正表达对象的相等含义 可参考P220的代码 CompanyLogo 9 2 2实例的状态 当一个对象被加载至Session缓存中时 即将该对象称为持久化对象 PO PersistentObject PO其实就是一个普通JavaBean的对象 只不过定义时需要遵循一定的规则 JavaBean在Hibernate中存在三种状态 临时状态 持久化状态和脱管状态 CompanyLogo 一个持久化类的实例可能有3种状态 临时状态 持久化状态和脱管状态 实例的这三种状态的定义与持久化上下文有关 session对象就是这个上下文 通过不同的操作 实例可以在这三种状态之间相互转换 CompanyLogo 1 临时态 Transient 临时状态 对象由new操作符创建 且尚未与Session关联的对象被认为处于瞬态 瞬态对象不会被持久化到数据库中 也不会被赋予持久化标识 相当于主键值 使用Session可以将其变为持久化状态 特征 不处于Session缓存中 也可以说不被任何Session关联 在数据库中没有相应记录 CompanyLogo 2 持久态 Persistent 持久化状态 持久化对象在数据库中有对应的记录 并拥有一个持久化标识 持久化实例可以是刚刚保存的 也可以是刚被加载的 无论哪一种 持久化对象都必须与指定的Session关联 特征 位于一个Session实例的缓存中 也可以说 持久化对象总是被一个Session实例关联 持久化对象和数据中的相关记录对应 Hibernate会检测到处于持久化状态对象的改动 在当前操作执行完成时 清理缓存时 将对象数据写回数据库 开发者不需要手动执行UPDATE 即同步更新数据库 CompanyLogo 3 脱管态 Detached 脱管 某个对象曾经处于持久化状态 但随着与之关联的Session被关闭 该对象就变成脱管状态 脱管对象的引用仍然有效 对象可继续被修改 如果重新让脱管对象与某个Session关联 这个脱管对象会重新转换为持久化状态 而脱管期间的改动也不会丢失 也可被写入数据库 特征 不再位于Session的缓存中 也可以说 脱管对象不被Session关联 脱管对象是由持久化对象转变而来的 因此在数据库中可能还存在与它对应的记录 前提条件是没有其他程序删除了这条记录 CompanyLogo 脱管对象与临时对象的相同之处在于两者都不被Session关联 因此Hibernate不会保证它们的属性变化与数据库保持同步 脱管对象与临时对象的区别在于前者是由持久化对象转变而来的 因此可能在数据库中海存在对应的记录 而后者在数据库中没有对应的记录 CompanyLogo 当用new语句刚创建一个Java对象 它处于临时状态 此时不合数据库中的任何记录对应 Session的delete 方法能使一个持久化对象或临时脱管对象转化为临时对象 对于脱管对象 delete 方法从数据库中删除与它对应的记录 对于持久化对象 delete 从数据库中删除与它对应的记录 并且把它从Session的缓存中删除 4 实例状态之间的转化 CompanyLogo Session的save 把临时对象转变为持久化对象 Session的load 或get 返回的对象总是处于持久化状态 Session的find 返回List集合中存放的都是持久化对象 Query的list 返回的List集合中存放的都是持久化对象 Session的update saveOrUpdate 和lock 使脱管对象转变为持久化对象 CompanyLogo 当调用Session的close 时 Session的缓存被清空 缓存中的所有持久化对象都变为脱管对象 如果在应用程序中没有引用这些脱管对象 它们就会结束生命周期 Session的evict 能够从缓存中删除一个持久化对象 使它变为脱管状态 当Session的缓存中保存了大量的持久化对象时 会消耗许多内存空间 为了提高性能 可以考虑调用evict 从缓存中删除一些持久化对象 但不推荐使用evict CompanyLogo CompanyLogo 2 配置Hibernate Hibernate的配置参数随环境不同而有所改变 但框架本身对大部分的配置参数提供了默认配置样例 使用时只需将样例文件复制到类路径下 并作自定义修改即可 CompanyLogo 9 3映射文件xxx hbm xml Hibernate的映射文件把一个JavaBean与一个数据表映射起来 每一个表对应一个扩展名为 hbm xml的映射文件 下面一个映射文件的例子把一个类User和一个表T User映射起来 CompanyLogo CompanyLogo 1 class元素class元素用来定义一个持久化类2 id元素元素是元素的一个子元素 被映射的类必须声明对应数据表主键字段 CompanyLogo 3 generator元素元素是元素的一个子元素 用class属性指定id标识的生成类的名字 CompanyLogo 4 property元素元素是元素的一个子元素 它为类声明一个持久化的 JavaBean风格的属性 有name column type和length等属性 CompanyLogo CompanyLogo Hibernate核心类 HibernateAPI的调用过程 CompanyLogo 9 4Configuration类 Configuration类负责管理Hibernate的配置信息 Configuration类负责加载配置文件hibernate cfg xml和映射文件XXX hbm xml如 Configurationconfig newConfiguration configure 或Filefile newFile D util hibernate cfg xml Configurationconfig newConfiguration configure file CompanyLogo CompanyLogo Configuration类 Configuration类的作用是对Hibernate进行配置 及对它进行启动 主要作用1 加载配置文件 创建一个SessionFactory对象 Configurationconfiguration newConfiguration configure 2 动态添加映射文件 3 通过Configuration指定配置属性 如果不使用默认的hibernate cfg xml文件作为配置文件的话 也可以指定配置文件名 方式如下 Filefile newFile c sample myhibernate xml Configurationconfiguration newConfiguration configure file CompanyLogo 9 5SessionFactory接口 SessionFactory负责Session实例的创建 可以通过Configuration实例构建 Configurationconfig newConfiguration configure sessionFactory config buildSessionFactory 当客户端发送一个请求线程时 SessionFactory生成一个Session对象来处理客户请求 CompanyLogo SessionFactory用来创建Session实例 它是线程安全但重量级的 一个项目通常只需要一个SessionFactory 但是当一个项目要操作多个数据库时 必须为每个数据库指定自己的SessionFactory 该类起到了一个缓冲区的作用 它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据 还缓冲了一些将来有可能重复利用的数据 创建方法SessionFactorysf configuration buildSessionFactory 关闭方法close 用于释放某些资源 如缓存 连接池等 CompanyLogo 9 6Session接口 Session是Hibernate运作的核心 完成对象的状态的转换 事务的管理和数据库的存取 相当于JDBC中的Connection 它是非线程安全的轻量级对象一个session对应一个数据库创建方法Sessionsession sf openSession 它是一个事物对象的工厂 用于开启事务 Transactiontx session beginTransaction CompanyLogo 1 概述Session是应用程序与数据库之间的一个会话 是Hibernate的运行中心 持久层操作的基础 相当于JDBC中的Connection Session对象是通过SessionFactory构建的 Sessionsession sessionFactory openSession CompanyLogo 2 取得持久化对象的方法 单条查询 取得持久化对象 PO 的方法主要有get 和load 它们通过主键id OID 来取得PO 3 持久化对象的保存 更新和删除方法save Objectobj 方法Useruser newUser user setUsername username session save user update Objectobj 方法 session update user CompanyLogo saveOrUpdate Objectobj 方法Useruser newUser user setUsername username session saveOrUpdate user delete Objectobj 方法Useruser newUser session delete user CompanyLogo 9 7Query接口 Hibernate中用Query来执行HQL 1 setXXX 方法 如 Queryquery session createQuery fromTraintwheret trainCode query setString 0 code 2 list 方法如 Listlist query list for inti 0 i list size i t Train list get i 3 executeUpdate 方法 CompanyLogo 9 8Transaction接口 Transaction接口是一个可选接口 Transaction接口是对实际事务的抽象的抽象 使项目在不同的环境和容器中方便地移植一个事物对象可能包括对多个数据库进行操作创建方法Transactiontx session beginTransaction CompanyLogo 它的运行与Session接口相关 可调用Session的beginTransaction 方法生成一个Transaction实例 如 session HibernateUtil currentSession Transactiontx session beginTransaction query session createQuery fromTraintwheret trainCode query setString 0 code mit session close CompanyLogo 9 9HibernateUtil类 HibernateUtil类是Hibernate的Session管理的一个应用广泛的方案 它是使用ThreadLocal类建立的一个Session管理的辅助类 CompanyLogo 9 10通过Session完成基本操作 Hibernate对数据库的基本操作是通过Session来完成的 Session提供了基本的保存 更新 删除和查询的方法 CompanyLogo 1保存数据 session save 方法用于实体对象的持久化保存 如 Personuser newPerson user setName zx Transactiontx session beginTransaction session save user session flush mit session close tx close CompanyLogo 1保存数据 session save 方法执行时 并不会马上更新数据库库 只有在session清理缓存时才有可能执行insert语句 执行步骤如下 在session内部缓存中寻找对象 如果找到 则认为此数据已经保存 实体对象已经处于Persistent状态 直接返回 如果实体对象实现了lifecycle接口 那么将执行待保存对象的onSave 方法如果实体对象实现了Validatable接口 那么将执行相应的validate 方法如果存在拦截器对象 那么将会执行Interceptor onSave 方法 构造insertSQL语句完成数据保存数据保存成功后 设定实体对象的id为插入记录的id将保存后的实体对象纳入Hibernate的内部缓存如果该对象有关联对象 那么将会递归处理该级联对象 CompanyLogo 2加载数据 session的load 和get 方法都能根据给定的OID Objectidentifier 对象标识 从数据库中加载一个持久化对象 区别 当数据库中不存在与OID对应的记录时 load 方法抛出net sf ObjectNotfoundException异常 而get 方法返回null这两个方法都能将对象变成持久化状态 置于当前Session的缓存中 因此修改了持久化对象的属性后 当Session清理缓存时 会根据持久化对象的属性变化来同步更新数据库 CompanyLogo Sessionsession1 sf openSession Transactiontx1 session beginTransaction Customa Custom session1 load Custom class newLong 1 Customb Custom session1 load Custom class newLong 2 mit Session1 close CompanyLogo 3更新数据 session update 方法能够将一个处于临时脱管或状态的对象 重新纳入Hibernate的内部缓存 变成持久化对象 如 Transactiontx session beginTransaction session update customer 提交mit session close tx close CompanyLogo 3更新数据 session update 方法被调用时 并不立刻执行SQL语句 而是等到更新操作累计到一定程度的时候在提交事务的时候一起执行 执行步骤如下 首先在缓存中寻找需要更新的实体对象 如果找到立刻返回当提交事务进行缓存清理时 将会通过脏数据检查 确定变化的属性 然后生成updateSQL完成对数据的更新如果在数据库中不存在这个实体对应的记录 那么这个操作将会抛出异常当执行session update 方法将一个对象与session关联时 如果此时缓存中已经存在了与该实体对象具有相同OID的持久化对象 那么这个方法会抛出异常 CompanyLogo 4saveOrUpdate方法 有save 和update 方法的功能 对于传入的对象 首先会执行一遍查询语句判断该对象在数据库中是否存在 然后调用相应的方法 如果传入该方法的是一个脱管对象 那么这个方法就会执行update操作 如果传入该方法的是一个临时对象 那么这个方法就会执行insert操作 原理 首先在缓存中寻找 如果找到就直接返回如果实体实现了拦截方法 就执行isUpdate 方法如果实体处于临时状态就执行save 方法 如果实体处于脱管状态就执行update 方法 CompanyLogo 5删除数据 delete 方法用于从数据库中删除一个实体所对应的数据如果传入的对象是持久化对象 那么当清理缓存时 就会执行delete操作 如果传入的是脱管对象 那么首先会使该对象与session相关联 然后当清理缓存时 再执行delete操作例如 Sessionsession sessionFactory openSession Transactiontx session beginTransaction Customercustomer Customer session load Customer class 1 计划执行一条delete语句session delete customer 清理缓存 执行一条delete语句mit 关闭session 这时将会把customer对象从缓存中删除 session close CompanyLogo 应用举例 对用户信息的增 删 改 查操作 一 Java类1 User javapackageuser publicclassUser privateintid privateStringusername privateStringpassword privateintage CompanyLogo publicintgetId returnid publicStringgetPassword returnpassword publicStringgetUsername returnusername publicvoidsetId intid this id id CompanyLogo publicvoidsetPassword Stringpassword this password password publicvoidsetUsername Stringusername this username username publicintgetAge returnage publicvoidsetAge intage this age age CompanyLogo 2 HibernateUtil java packageuser importorg hibernate HibernateException importorg hibernate Session importorg hibernate SessionFactory importorg hibernate cfg Configuration publicclassHibernateUtil privatestaticfinalSessionFactorysessionFactory CompanyLogo static try CreatetheSessionFactory Filefile newFile D util hibernate cfg xml Configurationconfig newConfiguration configure sessionFactory config buildSessionFactory catch Throwableex ex printStackTrace log error InitialSessionFactorycreationfailed ex thrownewExceptionInInitializerError ex CompanyLogo publicstaticfinalThreadLocalsession newThreadLocal publicstaticSessioncurrentSession throwsHibernateException Sessions Session session get OpenanewSession ifthisThreadhasnoneyetif s null s isOpen s sessionFactory openSession session set s returns CompanyLogo publicstaticvoidcloseSession throwsHibernateException Sessions Session session get session set null if s null s close CompanyLogo 3 HibernateSessionFactory java packageuser importorg hibernate HibernateException importorg hibernate Session importorg hibernate cfg Configuration publicclassHibernateSessionFactory CompanyLogo privatestaticStringCONFIG FILE LOCATION hibernate cfg xml privatestaticfinalThreadLocalthreadLocal newThreadLocal privatestaticConfigurationconfiguration newConfiguration privatestaticorg hibernate SessionFactorysessionFactory privatestaticStringconfigFile CONFIG FILE LOCATION privateHibernateSessionFactory CompanyLogo publicstaticSessiongetSession throwsHibernateException Sessionsession Session threadLocal get if session null session isOpen if sessionFactory null rebuildSessionFactory session sessionFactory null sessionFactory openSession null threadLocal set session returnsession CompanyLogo publicstaticvoidrebuildSessionFactory try configuration configure configFile sessionFactory configuration buildSessionFactory catch Exceptione System err println ErrorCreatingSessionFactory e printStackTrace CompanyLogo publicstaticvoidcloseSession throwsHibernateException Sessionsession Session threadLocal get threadLocal set null if session null session close CompanyLogo publicstaticorg hibernate SessionFactorygetSessionFactory returnsessionFactory publicstaticvoidsetConfigFile StringconfigFile HibernateSessionFactory configFile configFile sessionFactory null CompanyLogo publicstaticConfigurationgetConfiguration returnconfiguration CompanyLogo 3 userServlet java packageuser importjavax servlet importjavax servlet http importjava io importjava util importorg hibernate publicclassuserServletextendsHttpServlet privatestaticfinalStringCONTENT TYPE text html charset GB2312 Initializeglobalvariablespublicvoidinit throwsServletException CompanyLogo publicvoiddoGet HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException Stringusername request getParameter username if username null username Stringpassword request getParameter password if password null password Stringage1 request getParameter age if age1 null age1 0 CompanyLogo Stringaction request getParameter action System out println action action if action null action intage Integer parseInt age1 response setContentType CONTENT TYPE PrintWriterout response getWriter Useruser newUser 生成User实例user setUsername username user setPassword password user setAge age CompanyLogo Sessionsession Transactiontx Queryquery CompanyLogo if action equals save session HibernateUtil currentSession 生成Session实例tx session beginTransaction try session save user 保存持久类对象mit 提交到数据库session close response sendRedirect reply jsp 跳转到回复页面 catch HibernateExceptione e printStackTrace tx rollback CompanyLogo if action equals update session HibernateUtil currentSession 生成Session实例tx session beginTransaction try query session createQuery fromUseruwhereu username query setString 0 username Listlist query list for inti 0 i list size i Useru User list get i Useru1 User session get User class newInteger u getId u1 setPassword password u1 setAge age Useru1 User session createQuery fromUseruwhereu username walker uniqueResult session update u1 CompanyLogo mit 提交到数据库session close response sendRedirect reply jsp 跳转到回复页面 catch HibernateExceptione e printStackTrace tx rollback CompanyLogo if action equals delete session HibernateUtil currentSession 生成Session实例tx session beginTransaction try query session createQuery fromUseruwhereu username query setString 0 username Listlist query list for inti 0 i list size i Useru User list get i Useru1 User session get User class newInteger u getId Useru1 User session createQuery fromUseruwhereu username walker uniqueResult session delete u1 CompanyLogo mit 提交到数据库session close response sendRedirect reply jsp 跳转到回复页面 catch HibernateExceptione e printStackTrace tx rollback CompanyLogo publicvoiddoPost HttpServletRequestrequest HttpServletResponseresponse throwsServletException IOException doGet request response Cleanupresourcespublicvoiddestroy CompanyLogo 二 JSP文件 1 user jspuser CompanyLogo 用户名 密码 年龄 CompanyLogo 2 reply jsp 回复数据已成功存入数据库 CompanyLogo 三 配置文件 1 hibernate cfg xml CompanyLogo com mysql jdbc Driverjdbc mysql testroot123100 CompanyLogo falseorg hibernate dialect MySQLDialect CompanyLogo 2 User hbm xml CompanyLogo CompanyLogo 四 数据库的设计 usetest 打开数据库createtablet user idintprimarykey usernamevarchar 20 passwordvarchar 20 ageint insertintot uservalues 001 lili 123 23 select fromt user use CompanyLogo 运行结果 CompanyLogo
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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