《韩顺平hibernate第2讲.ppt》由会员分享,可在线阅读,更多相关《韩顺平hibernate第2讲.ppt(25页珍藏版)》请在金锄头文库上搜索。
1、主讲: 韩顺平hibernate 从入门到精通内容介绍内容介绍:1.hibernate核心类和接口核心类和接口2.使用使用eclipse工具开发工具开发hibernate项目项目 主讲: 韩顺平hibernate 从入门到精通 掌握掌握hibernate的核心类和接口的使用的核心类和接口的使用 掌握如何使用工具开发掌握如何使用工具开发hibernate主讲: 韩顺平hibernate 从入门到精通主讲: 韩顺平hibernate 从入门到精通 Configuraion Configuraion类类负责管理负责管理hibernatehibernate的配置信息的配置信息读取读取hibernate
2、.cfg.xmlhibernate.cfg.xml加载加载hibernate.cfg.xmlhibernate.cfg.xml配置文件中配置文件中配置的驱动配置的驱动,url,url,用户名用户名, ,密码密码, ,连接池连接池. .管理管理 *.hbm.xml *.hbm.xml对象关系文件对象关系文件. . 示意代码示意代码: :Configuration cf=new Configuration().configure();Configuration cf=new Configuration().configure();该类的其它方法见该类的其它方法见hibernate api java
3、dochibernate api javadoc文档文档. .主讲: 韩顺平hibernate 从入门到精通 hibernate.cfg.xml hibernate.cfg.xml文件文件该文件主要用于指定各个参数该文件主要用于指定各个参数, ,是是hibernatehibernate核心文件核心文件默认放在默认放在srcsrc目录下,也可以放在别的目录下。目录下,也可以放在别的目录下。指定连接数据库的驱动、用户名、密码、指定连接数据库的驱动、用户名、密码、urlurl、连接池、连接池.指定对象关系映射文件的位置指定对象关系映射文件的位置. .也可使用也可使用hibernate.propert
4、ieshibernate.properties文件来替代该文件文件来替代该文件.(.(推荐使用推荐使用hibernate.cfg.xml)hibernate.cfg.xml)。 主讲: 韩顺平hibernate 从入门到精通 hibernate.cfg.xml hibernate.cfg.xml文件文件一个具体的实例,请参看一个具体的实例,请参看hibernate.cfg.xmlhibernate.cfg.xml文件文件 主讲: 韩顺平hibernate 从入门到精通 hibernate.properties hibernate.properties文件文件作用和作用和hibernate.cf
5、g.xmlhibernate.cfg.xml一致一致. .一个具体的实例,请参看一个具体的实例,请参看hibernate.propertieshibernate.properties文件文件主讲: 韩顺平hibernate 从入门到精通 对象关系映射文件对象关系映射文件(*.hbm.xml)(*.hbm.xml) 该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件. . 一般放在其映射的类同一个目录下一般放在其映射的类同一个目录下, ,但不是必须的。但不是必须的。 命名方式一般是命名方式一般是 类名类名.hbm.xml,.hbm
6、.xml,但不是必须的。但不是必须的。 示意图示意图: :表*.hbm.xml某个类某个类主讲: 韩顺平hibernate 从入门到精通 SessionFactory( SessionFactory(会话工厂会话工厂) )接口接口缓存缓存sqlsql语句和某些数据语句和某些数据在应用程序初始化的时候创建在应用程序初始化的时候创建, ,是一个重量级的类是一个重量级的类( (吃内存吃内存),),一般一般用单例模式保证一个应用中只需要一个用单例模式保证一个应用中只需要一个 SessionFactory SessionFactory实例实例. .如果某个应用访问多个数据库,则要创建多个会话工厂实例如果
7、某个应用访问多个数据库,则要创建多个会话工厂实例, ,一般一般是一个数据库一个会话工厂实例是一个数据库一个会话工厂实例. .通过通过SessionFactorySessionFactory接口可以获得接口可以获得Session(Session(会话会话) )实例实例. .如何理解会话工厂见下一个如何理解会话工厂见下一个pptppt示意代码示意代码: Configuration cf=new Configuration().configure();: Configuration cf=new Configuration().configure(); SessionFactory sf=cf.bu
8、ildSessionFactory(); SessionFactory sf=cf.buildSessionFactory(); Session s=sf.getCurrentSession(); Session s=sf.getCurrentSession(); / /或者是或者是: Session s=sf.openSession();: Session s=sf.openSession();它的其它方法见它的其它方法见 hibernate api javadochibernate api javadoc文件文件主讲: 韩顺平hibernate 从入门到精通 SessionFactory(
9、 SessionFactory(会话工厂会话工厂) )接口的理解接口的理解示意图示意图:java se:java se应用应用如果是如果是 java ee java ee应用应用(web(web应用应用) )则会话工厂在应用服务器那头则会话工厂在应用服务器那头.java程序程序db会话会话工厂工厂主讲: 韩顺平hibernate 从入门到精通session Session( Session(会话会话) )接口接口 Session Session一个实例代表与数据库的一次操作一个实例代表与数据库的一次操作( (当然一次操作可以是当然一次操作可以是crudcrud组合组合) ) Session S
10、ession实例通过实例通过SessionFactorySessionFactory获取,用完获取,用完需要关闭。需要关闭。 Session Session是线程不同步的是线程不同步的( (不安全不安全),),因此要保证因此要保证在同一线程中使用在同一线程中使用, ,可以用可以用getCurrentSessiong()getCurrentSessiong()。 Session Session可以看做是持久化管理器可以看做是持久化管理器, ,它是与持久它是与持久化操作相关的接口化操作相关的接口如何理解看下一个如何理解看下一个pptppt示意代码示意代码: Configuration cf=new
11、 Configuration().configure();: Configuration cf=new Configuration().configure(); SessionFactory sf=cf.buildSessionFactory(); SessionFactory sf=cf.buildSessionFactory(); Session s=sf.getCurrentSession(); Session s=sf.getCurrentSession(); / /或者是或者是: Session s=sf.openSession();: Session s=sf.openSessio
12、n();主讲: 韩顺平hibernate 从入门到精通 Session( Session(会话会话) )接口的理解接口的理解示意图示意图:java se:java se应用应用如果是如果是 java ee java ee应用应用(web(web应用应用) )则会话工厂在应用服务器那头则会话工厂在应用服务器那头.java程序程序db会话会话工厂工厂主讲: 韩顺平hibernate 从入门到精通 Session( Session(会话会话) )接口的几个重要方法接口的几个重要方法 SessionSession一般以对象的形式来操作,这里一般以对象的形式来操作,这里给大家演示一下吧给大家演示一下吧!
13、(!(请参考文档请参考文档) )保存一个对象保存一个对象( (记录记录)save)save方法方法删除一个对象删除一个对象( (记录记录)delete)delete方法方法查询一个对象查询一个对象( (记录记录)get/load)get/load方法方法修改一个对象修改一个对象( (记录记录)update)update方法方法java程序程序db会话会话工厂工厂主讲: 韩顺平hibernate 从入门到精通 get() get()和和load()load()区别区别1 1、get()get()方法直接返回实体类方法直接返回实体类, ,如果查不到数据则返回如果查不到数据则返回nullnull。l
14、oad()load()会会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundExceptionorg.hibernate.ObjectNotFoundException异常异常2.load2.load先到缓存先到缓存(session(session缓存缓存/ /二级缓存二级缓存) )中去查,如果没有则返回一个中去查,如果没有则返回一个代理对象(不马上到代理对象(不马上
15、到DBDB中去找),等后面使用这个代理对象操作的时中去找),等后面使用这个代理对象操作的时候,才到候,才到DBDB中查询中查询, ,这就是我们常说的这就是我们常说的 load load在默认情况下支持延迟加在默认情况下支持延迟加载(载(lazylazy)3. get3. get先到缓存先到缓存(session(session缓存缓存/ /二级缓存二级缓存) )中去查,如果没有就到中去查,如果没有就到DBDB中去中去查(即马上发出查(即马上发出sqlsql)。总之,如果你确定)。总之,如果你确定DBDB中有这个对象就用中有这个对象就用load(),load(),不确定就用不确定就用get()ge
16、t()(这样效率高)(这样效率高)主讲: 韩顺平hibernate 从入门到精通如何配置让load不使用lazy加载? openSession()和 getCurrentSession()区别采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭.使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如
17、下配置:* 如果使用的是本地事务(jdbc事务)thread* 如果使用的是全局事务(jta事务)jta 简单解释一下jdbc事务和jta事务的区别吧!主讲: 韩顺平hibernate 从入门到精通 openSession()和 getCurrentSession()联系深入探讨:在 SessionFactory启动的时候,Hibernate 会根据配置创建相应的 CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession()。在currentSession()执
18、行时,如果当前Session为空,currentSession会调用SessionFactory的openSession。主讲: 韩顺平hibernate 从入门到精通 openSession() openSession()和和 getCurrentSession() getCurrentSession()究竟选谁究竟选谁? ? 原则原则: :如果需要在同一线程中,保证使用同一个如果需要在同一线程中,保证使用同一个SessionSession则,使用则,使用getCurrentSession()getCurrentSession()如果在一个线程中,需要使用不同的如果在一个线程中,需要使用不同
19、的Session,Session,则则使用使用opentSession()opentSession()主讲: 韩顺平hibernate 从入门到精通 openSession()和 getCurrentSession()联系用ThreadLocal模式 (线程局部变量模式) 管理Session,代码如下:public class HibernateUtil public static final ThreadLocal session =new ThreadLocal();public static final SessionFactory sessionFactory; static try
20、sessionFactory = new Configuration().configure().buildSessionFactory(); catch (Throwable ex) throw new ExceptionInInitializerError(ex); public static Session currentSession() throws HibernateException Session s = session.get(); if(s = null) s = sessionFactory.openSession();session.set(s); return s;
21、public static void closeSession() throws HibernateException Session s = session.get(); if(s != null) s.close(); session.set(null); 主讲: 韩顺平hibernate 从入门到精通 Transaction( Transaction(事务事务) )接口接口 这里我们简单给大家说明一下什么是事务。我们通过一个网上转账的这里我们简单给大家说明一下什么是事务。我们通过一个网上转账的案例来说明案例来说明. .事务简单的说事务简单的说, ,就是一组对数据库的操作集合就是一组对数据
22、库的操作集合, ,它们要么全部成功它们要么全部成功, ,要要么全部失败么全部失败. .这个可以保证数据的一致性这个可以保证数据的一致性, ,事务具有原子性。事务具有原子性。TransactionTransaction是底层的事物实现中抽象出来的接口是底层的事物实现中抽象出来的接口可能是一个可能是一个jdbcjdbc或者或者jtajta的事务的事务, ,这样有利于这样有利于hibernatehibernate在不同执行在不同执行环境的移植。环境的移植。hibernatehibernate要求显示的调用事务要求显示的调用事务( (如果仅仅是查询可以不调用如果仅仅是查询可以不调用.).)Transa
23、ction ts=s.beginTransaction();Transaction ts=s.beginTransaction();mit();s.close()mit();s.close(); 发生异常需要发生异常需要ts.rollback()ts.rollback()回滚回滚. .主讲: 韩顺平hibernate 从入门到精通 Query接口QueryQuery接口类型的对象可以对数据库操作接口类型的对象可以对数据库操作, ,它可以使用它可以使用HqlHql,Qbc,Qbe,Qbc,Qbe和原生和原生SQL(native Sql)SQL(native Sql)对数据库操作对数据库操作. .
24、官方推荐使用官方推荐使用HqlHql语句。语句。 这里我们给大家举例简单说明,后面有一个章节专门讲解这里我们给大家举例简单说明,后面有一个章节专门讲解HqlHql的使用的使用,QueryQuery接口查询出来的结果是一个接口查询出来的结果是一个ListList接口类型的对象。接口类型的对象。 主讲: 韩顺平hibernate 从入门到精通 Criteria Criteria接口接口 CriteriaCriteria接口也可用于面向对象方式的查询,关于它的具体用法我们接口也可用于面向对象方式的查询,关于它的具体用法我们这里先不做介绍这里先不做介绍, ,简单看几个案例简单看几个案例. .最简单案例
25、最简单案例: :返回返回5050条记录条记录Criteria crit = sess.createCriteria(Cat.class);Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);crit.setMaxResults(50);List cats = crit.list();List cats = crit.list();限制结果集内容限制结果集内容List cats = sess.createCriteria(Cat.class)List cats = sess.createCriteria(Ca
26、t.class) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.between(weight, minWeight, maxWeight) ) .add( Restrictions.between(weight, minWeight, maxWeight) ) .list(); .list(); 主讲: 韩顺平hibernate 从入门到精通 使用使用eclipseeclipse开发开发hibernatehibernate项目项目 看看看看ec
27、lipseeclipse如何自动完成映射如何自动完成映射 配合下页配合下页ppt-ppt-项目框架图演示开发流程项目框架图演示开发流程.(last hint).(last hint)主讲: 韩顺平hibernate 从入门到精通 项目说明 项目框架图如下所示项目框架图如下所示: : 主讲: 韩顺平hibernate 从入门到精通 使用eclipse开发hibernate项目 配合下页配合下页ppt-ppt-项目框架图演示开发流程项目框架图演示开发流程. .建库建表建库建表创建一个项目创建一个项目使用使用myeclipsemyeclipse自带的自带的db browserdb browser连接到数据库连接到数据库引入引入hibernatehibernate支持支持( (框架框架) )【这里会自动创建【这里会自动创建hibernate.cfg.xmlhibernate.cfg.xml】使用使用hibernatehibernate反向工程创建反向工程创建POJOPOJO类和对象映射文件类和对象映射文件对各配置文件作相应的修改【稍稍改改就可用】对各配置文件作相应的修改【稍稍改改就可用】编写测试类。编写测试类。主讲: 韩顺平hibernate 从入门到精通