《hibernate的简介.ppt》由会员分享,可在线阅读,更多相关《hibernate的简介.ppt(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Softeem Consultancy Service第一章第一章第一章第一章HibernateHibernate入入入入门门门门Softeem Consultancy Service预习检查预习检查为什么需要为什么需要Hibernate?Hibernate是什么?是什么?使用使用Hibernate的步骤是?的步骤是?Softeem Consultancy Service本章任务本章任务了解了解Hibernate基本原理基本原理 学会编写实体映射文件学会编写实体映射文件 学会使用学会使用Hibernate完成数据增、删、改操作完成数据增、删、改操作 学会在项目中使用学会在项目中使用Hibern
2、ate一级缓存与二级缓存一级缓存与二级缓存Softeem Consultancy Service为什么使用为什么使用Hibernate?在编写在编写DAO层代码时,容易出现哪些问题?层代码时,容易出现哪些问题?思考:这部分思考:这部分代码规律性很代码规律性很强,是否可以强,是否可以采用采用“通用通用”的方法的方法“集中集中”解决?解决?代码繁琐代码繁琐容易出错容易出错纯纯“体力体力”劳劳动动工作量大工作量大占用大量开发占用大量开发时间时间public void insert(HouseDTO dto)try PreparedStatement ps=con.prepareStatement(i
3、nsert into house values(?,?,?,?,?,?,?,?,?,?,?);ps.setString(1,dto.getTitle();/出租出租标题标题ps.setFloat(2,dto.getHireprice();/租金租金ps.setDate(3,new java.sql.Date(dto.getBooktime().getTime();/登登记记日期日期ps.setString(4,dto.getLinkman();/联联系人系人ps.setString(5,dto.getLinktel();ps.setString(6,dto.getHousething();/房
4、屋房屋设设施施ps.setInt(7,dto.getRoom();ps.setInt(8,dto.getTing();ps.setInt(9,dto.getUid();ps.setInt(10,dto.getSid();ps.setInt(11,dto.getAid();ps.execute();catch(SQLException e)e.printStackTrace();public void edit(HouseDTO dto)try PreparedStatement ps=con.prepareStatement(update house set title=?,hireprice
5、=?,linkman=?,linktel=?,housething=?,room=?,ting=?,sid=?,aid=?where hid=?);ps.setString(1,dto.getTitle();/出租出租标题标题ps.setFloat(2,dto.getHireprice();/租金租金ps.setString(3,dto.getLinkman();/联联系人系人ps.setString(4,dto.getLinktel();ps.setString(5,dto.getHousething();/房屋房屋设设施施ps.setInt(6,dto.getRoom();ps.setIn
6、t(7,dto.getTing();ps.setInt(8,dto.getSid();ps.setInt(9,dto.getAid();ps.setInt(10,dto.getHid();ps.execute();catch(SQLException e)e.printStackTrace();public HouseDTO findById(String id)HouseDTO dto=new HouseDTO();try PreparedStatement ps=con.prepareStatement(select*from house where hid=?);ps.setString
7、(1,id);ResultSet rs=ps.executeQuery();if(rs.next()dto.setHid(rs.getInt(hid);/房屋房屋编编号号dto.setTitle(rs.getString(title);dto.setHireprice(rs.getFloat(hireprice);/租金租金dto.setBooktime(rs.getDate(booktime);/登登记记日期日期dto.setLinkman(rs.getString(linkman);/联联系人系人dto.setRoom(rs.getInt(room);/室室dto.setSid(rs.ge
8、tInt(sid);/街道街道dto.setAid(rs.getInt(aid);/区域区域 catch(SQLException e)e.printStackTrace();return dto;Softeem Consultancy Service为什么使用为什么使用Hibernate?使用使用Hibernate后的后的DAO层代码:层代码:代码精简易读代码精简易读封装了封装了JDBC操作,操作,以面向对象的方式以面向对象的方式操作数据操作数据开发工作量小,可开发工作量小,可以以集中集中精力精力处理处理业业务逻辑务逻辑public class HouseDAOHibImpl extends
9、 BaseHibernateDAO implements IHouseDAO public House get(int id)super.get(House.class,id);public void add(House house)super.add(house);public void del(int id)super.del(House.class,id);public void update(House house)super.update(house);Hibernate就是用来就是用来解决这些问题的解决这些问题的!Softeem Consultancy Service为什么使用为什
10、么使用Hibernate?屏蔽数据库之间的差异性屏蔽数据库之间的差异性HibernateJDBCJNDI文本JTA数据库类型数据库类型访问方式访问方式Softeem Consultancy ServiceHibernate是什么?是什么?Hibernate之父:之父:Gavin KingJBoss核心成员之一核心成员之一EJB3.0专家委员会成员专家委员会成员Hibernate In Action作者作者2001年开始开发年开始开发Hibernate2003年年Hibernate发展为发展为Java世界主流持久层框架世界主流持久层框架充满激情充满激情脾气倔强脾气倔强永不言败永不言败Softee
11、m Consultancy Service基于关系数据库的持久层可选方案基于关系数据库的持久层可选方案Softeem Consultancy Service基于关系数据库的持久层可选方案基于关系数据库的持久层可选方案Softeem Consultancy Service一个优秀的持久化框架一个优秀的持久化框架什么是持久化?什么是持久化?内存内存姓名:小颖姓名:小颖性别:女性别:女特长:英语、程序设计特长:英语、程序设计瞬时状态瞬时状态磁盘磁盘持久状态持久状态用用JDBC完成数据在完成数据在瞬时瞬时和和持久持久状状态间的转换态间的转换:stmt.execute().瞬时状态:瞬时状态:保存在内存
12、的程序数据,程保存在内存的程序数据,程序退出后,数据就消失了,序退出后,数据就消失了,称为瞬时状态称为瞬时状态持久状态:持久状态:保存在磁盘上的程序数据,保存在磁盘上的程序数据,程序退出后依然存在,称为程序退出后依然存在,称为程序数据的持久状态程序数据的持久状态持久化:持久化:将程序数据在瞬时状态和持将程序数据在瞬时状态和持久状态之间转换的机制久状态之间转换的机制持久化持久化Softeem Consultancy Service一个主流的一个主流的ORM产品产品什么是什么是ORM?对象数据(对象数据(OO)name:小颖:小颖sex:女:女skill:英语、程序设计:英语、程序设计User对象
13、对象持久化层持久化层业务逻辑层业务逻辑层表现层表现层数据库层数据库层tbl_user表表关系型数据(关系型数据(R R)tbl_user表记录表记录 映射信息映射信息(MM)ORM(对象(对象-关系映射):关系映射):完成对象数据到关系型数据映射的机完成对象数据到关系型数据映射的机制称为对象制称为对象-关系映射,简称关系映射,简称ORM。Softeem Consultancy Service如何使用如何使用Hibernate?使用使用 Hibernate 的的“3个准备,个准备,7个步骤个步骤”Softeem Consultancy Service如何使用如何使用Hibernate?使用使用
14、的的3个准备:个准备:1.导入导入Hibernate库库(jar包)包)3.添加对应表添加对应表的实体类和映的实体类和映射文件射文件Softeem Consultancy Service jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=crm;SelectMethod=cursor sa 123 true 配置数据源配置数据源数据库数据库“方言方言”运行时在控制台显示运行时在控制台显示SQL语句语句映射文件,可以有多个映射文件,可以有多个Softeem Consultancy Servicepackage com.softeem.en
15、tity;public class User private Integer uid;private String uname;private String upass;public User()/默认构造方法默认构造方法 /Getter and setter准备准备3:添加实体类和映射文件(添加实体类和映射文件(User.hbm.xml)实现实现Serializable接口接口添加默认构造方添加默认构造方法法实体类到表的映射实体类到表的映射主键主键属性到字段的映射属性到字段的映射主键生成器:主键生成器:native 由数据库由数据库生成生成assigned 在程序在程序中指定中指定Softe
16、em Consultancy Service如何使用如何使用Hibernate?使用使用Hibernate的的7个步骤:个步骤:7 7、关闭关闭关闭关闭SessionSession6 6、提交事务提交事务提交事务提交事务 5 5、持久化操作持久化操作持久化操作持久化操作 save/update/delete/get save/update/delete/get4 4、开始一个事务开始一个事务开始一个事务开始一个事务3 3、打开打开打开打开SessionSession1 1、ConfigurationConfiguration2 2、创建创建创建创建SessionFactorySessionFa
17、ctory Softeem Consultancy Service七个步骤对应的程序代码七个步骤对应的程序代码public static void main(String args)Configuration conf=new Configuration().configure();/1、读取配置、读取配置文件文件 SessionFactory sf=conf.buildSessionFactory();/2、创建、创建SessionFactory Session session=sf.openSession();/3、打开、打开Session Transaction tx=null;try
18、tx=session.beginTransaction();/4、开始一个事务、开始一个事务 /5、持久化操作、持久化操作 User user=new User();user.setUname(Hibernate user);user.setUpass(“password);session.save(user);mit();/6、提交事务提交事务 catch(Exception e)if(null!=tx)tx.rollback();e.printStackTrace();finally session.close();/7、关闭、关闭Session 执行结果执行结果Softeem Consu
19、ltancy ServiceConfiguration SessionFactory SessionTransaction创建创建创建创建开始开始save delete update get mit()session.close()执行执行House.cfg.xmlUser.hbm.xml结束结束创建和销毁都相当耗费创建和销毁都相当耗费资源,通常一个系统内资源,通常一个系统内一个数据库只创建一个一个数据库只创建一个类似于类似于JDBC中的中的Connection 查询操作稍后介绍查询操作稍后介绍 Hibernate执行过程执行过程Softeem Consultancy Service程序代码程
20、序代码Session session=sf.openSession();User user=(User)session.get(User.class,id);session.close();System.out.println(user.getUname()+,+user.getUpass();根据主键加载根据主键加载tx=session.beginTransaction();User user=(User)session.load(User.class,id);user.setUname(new Name);session.update(user);mit();修改修改tx=session.
21、beginTransaction();User user=(User)session.load(User.class,id);session.delete(user);mit();删除删除没有更新数据,没有更新数据,不需进行事务不需进行事务控制控制先加载,再更新先加载,再更新先加载,再删除先加载,再删除使用使用Hibernate实现数据的加载实现数据的加载/删除删除/修改修改Softeem Consultancy Service程序代码程序代码Session session=sf.openSession();Query query=session.createQuery(“from User
22、user”);List list=query.list();for(User user:list)System.out.println(user.getUname()+,+user.getUpass();session.close();使用使用Hibernate实现数据的查询实现数据的查询Softeem Consultancy ServiceHibernate延时加载延时加载1.延时加载概念:只有真正使用该对象时,才会创建,延时加载概念:只有真正使用该对象时,才会创建,对于对于hibernate而言,真正使用的时候才会发出而言,真正使用的时候才会发出sql。2.hibernate支持支持laz
23、y策略只有在策略只有在session打开状态下打开状态下才才有效有效。3.hibernate lazy策略可以使用在:策略可以使用在:标签上,可以取值:标签上,可以取值:true/false注:标签上的lazy特性只对普通属性起作用标签上,可以取值:标签上,可以取值:true/false需要类增强工具需要类增强工具标签上,可以取值:标签上,可以取值:true/false/extra单端关联上,可以取值:单端关联上,可以取值:false/proxy/noproxySofteem Consultancy Service延时加载演示示例:延时加载演示示例:/设置设置标签上的标签上的lazy=true
24、lazy=true,也就是默认配置,也就是默认配置,可以不加可以不加 public void testLoad1()Session session=null;session=HibernateUtils.getSession();session.beginTransaction();/不会发出不会发出sqlGroup group=(Group)session.load(Group.class,1);/不会发出不会发出sqlSystem.out.println(group.id=+group.getId();/会发出会发出sqlSystem.out.println(group.name=+gro
25、up.getName();session.getTransaction().commit();session.getTransaction().rollback();HibernateUtils.closeSession(session);public void testLoad2()Session session=null;Group group=null;session=HibernateUtils.getSession();session.beginTransaction();group=(Group)session.load(Group.class,1);session.getTran
26、saction().commit();session.getTransaction().rollback();HibernateUtils.closeSession(session);/不能正确输出,抛出不能正确输出,抛出LazyInitializationException 异常,因为异常,因为session已经关闭已经关闭/hibernate支持支持lazy策略只有在策略只有在session打开状态下有效打开状态下有效System.out.println(group.name=+group.getName();/hibernate/hibernate在集合上的在集合上的lazylazy策略
27、,可以取值:策略,可以取值:true/false/extratrue/false/extra Softeem Consultancy ServiceHibernate一级缓存一级缓存1.缓存是指一组数据的集合,这些数据储存在其他地方,缓存是指一组数据的集合,这些数据储存在其他地方,因为获取这些数据代价昂贵,所以把这些结果数据保因为获取这些数据代价昂贵,所以把这些结果数据保存起来,让下一次需要这些数据的时候直接使用,这存起来,让下一次需要这些数据的时候直接使用,这就大大提高了系统效率。就大大提高了系统效率。2.一级缓存很短和一级缓存很短和session的生命周期一致,一级缓存也的生命周期一致,一
28、级缓存也叫叫session级或事务级缓存。级或事务级缓存。3.哪些方法支持一级缓存及一级缓存的管理:哪些方法支持一级缓存及一级缓存的管理:get()load()Iterate()(查询实体对象)(查询实体对象)session.clear(),session.evict()(管理一级缓存)(管理一级缓存)Softeem Consultancy Service哪些方法支持一级缓存哪些方法支持一级缓存(设置断点方式判断设置断点方式判断)/在同一个在同一个session中发出两次中发出两次load查询查询public void testCache1()Session session=null;try
29、session=HibernateSessionFactory.getSession();session.beginTransaction();/load()方法不会发出SQL语句,因为他返回一个代理类 TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();/不会发出sql,因为load使用缓存 user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.get
30、UserName();session.getTransaction().commit();session.close();catch(Exception e)e.printStackTrace();/在同一个在同一个session中发出两次中发出两次iterate查询属性,不使用一级缓存查询属性,不使用一级缓存public void testCache3()Session session=null;session=HibernateSessionFactory.getSession();String userName=(String)session.createQuery(select use
31、rName from TbUser where userId=1).iterate().next();System.out.println(user.name=+userName);/iterate查询普通属性,没有用到一级缓存 /从这个例子可以看出,一级缓存是缓存实体对象的 userName=(String)session.createQuery(select userName from TbUser where userId=1).iterate().next();System.out.println(user.name=+userName);/开启两个开启两个session发出发出loa
32、d查询查询public void testCache4()Session session=null;session=HibernateSessionFactory.getSession();session.beginTransaction();TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();session.getTransaction().commit();session.close();session=HibernateSessionFactor
33、y.getSession();session.beginTransaction();/会发出查询语句,会发出查询语句,session间不能共享一级缓存的数据间不能共享一级缓存的数据 /因为它会伴随因为它会伴随session的生命周期存在和消亡的生命周期存在和消亡 TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();session.getTransaction().commit();session.close();/管理一级缓存管理一级缓存public
34、void testCache5()Session session=null;session=HibernateSessionFactory.getSession();session.beginTransaction();TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();/管理一级缓存,因为一级缓存无法取消,但可以管理,如:session.clear()session.evict();session.clear();/会发出sql,因为一级缓存中的实体
35、对象被清除了 user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();session.getTransaction().commit();session.close();Softeem Consultancy ServiceHibernate二级缓存二级缓存1.二级缓存的生命周期和二级缓存的生命周期和SessionFactory的生命周期一致,也称的生命周期一致,也称SessionFactory级或进程级的缓存。级或进程级的缓存。2.因为我们提到了,二级缓存是一个可插拔
36、的缓存插件,所以二级缓存一因为我们提到了,二级缓存是一个可插拔的缓存插件,所以二级缓存一定要先配置后使用。定要先配置后使用。3.二级缓存的配置二级缓存的配置:将将echcache.xml文件拷贝到文件拷贝到src下下开启二级缓存,修改开启二级缓存,修改hibernate.cfg.xml文件文件true指定缓存产品提供商,修改指定缓存产品提供商,修改hibernate.cfg.xml文件文件org.hibernate.cache.EhCacheProvider指定哪些实体类使用二级缓存(两种方法)指定哪些实体类使用二级缓存(两种方法)*在映射文件中采用在映射文件中采用标签标签*在在hiberna
37、te.cfg.xml文件中,采用文件中,采用标签标签Softeem Consultancy Service二级缓存的一些基本特性:二级缓存的一些基本特性:/开启两个开启两个sessionsession,分别调用,分别调用loadloadpublic void testCache1()Session session=null;session=HibernateSessionFactory.getSession();session.beginTransaction();TbUser user=(TbUser)session.load(TbUser.class,1);System.out.print
38、ln(user.name=+user.getUserName();session.getTransaction().commit();session.close();session=HibernateSessionFactory.getSession();session.beginTransaction();/不会发出sql,因为开启了二级缓存,session是共享二级缓存的TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();session.getTr
39、ansaction().commit();session.close();/开启两个开启两个sessionsession,分别调用,分别调用load,load,中间使用中间使用SessionFactorySessionFactory清除二级缓存清除二级缓存public void testCache2()Session session=null;session=HibernateSessionFactory.getSession();session.beginTransaction();TbUser user=(TbUser)session.load(TbUser.class,1);System
40、.out.println(user.name=+user.getUserName();session.getTransaction().commit();session.close();/管理二级缓存管理二级缓存SessionFactory factory=HibernateSessionFactory.getSessionFactory();factory.evict(TbUser.class,1);session=HibernateSessionFactory.getSession();session.beginTransaction();/会发出查询会发出查询sql,因为二级缓存中的数据
41、被清除了,因为二级缓存中的数据被清除了TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();session.getTransaction().commit();session.close();/一级缓存和二级缓存的交互一级缓存和二级缓存的交互public void testCache3()Session session=null;session=HibernateSessionFactory.getSession();/仅向二级缓存读数据,而不向二级缓存
42、写数据仅向二级缓存读数据,而不向二级缓存写数据session.setCacheMode(CacheMode.GET);TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();session=HibernateSessionFactory.getSession();/发出发出sql语句,因为语句,因为session设置了设置了CacheMode为为GET,所以二级缓存中没有数据,所以二级缓存中没有数据TbUser user=(TbUser)session.l
43、oad(TbUser.class,1);System.out.println(user.name=+user.getUserName();session=HibernateSessionFactory.getSession();/只向二级缓存写数据,而不从二级缓存读数据只向二级缓存写数据,而不从二级缓存读数据session.setCacheMode(CacheMode.PUT);TbUser user=(TbUser)session.load(TbUser.class,1);System.out.println(user.name=+user.getUserName();Softeem Con
44、sultancy Service在项目中使用在项目中使用HibernateUserDAOHibImpl中中add方法代码如下方法代码如下:public void add(User item)Session session=HibernateSessionFactory.getSession();Transaction tx=null;try tx=session.beginTransaction();session.save(item);mit();catch(Exception e)if(null!=tx)tx.rollback();e.printStackTrace();finally s
45、ession.close();蓝色的代码和蓝色的代码和del、update方法的代码方法的代码存在重复,可以采取存在重复,可以采取什么方法精简呢?什么方法精简呢?Softeem Consultancy Service使用使用BaseHibernateDAO简化编码简化编码public abstract class BaseHibernateDAO protected void add(Object item)Transaction tx=null;Session session=HibernateSessionFactory.getSession();try tx=session.beginT
46、ransaction();session.save(item);mit();catch(Exception e)if(null!=tx)tx.rollback();e.printStackTrace();finally session.close();/update,delete,get 方法与之类似方法与之类似 BaseHibernateDAOpublic class UserDAOHibImpl extends BaseHibernateDAO implements UserDAO public User get(int id)super.get(User.class,id);public
47、 void add(User User)super.add(User);public void del(int id)super.del(User.class,id);public void update(User User)super.update(User);最终的最终的UserDaoHibImplDAO层的代码大大精简层的代码大大精简这就是我们使用这就是我们使用Hibernate的目的的目的演示示例:使用演示示例:使用BaseHibernateDAO简化开发简化开发Softeem Consultancy Service介绍:介绍:Hibernate配置属性配置属性 1.1.hiberna
48、te.dialecthibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL.2.2.hibernate.show_sqlhibernate.show_sql 输出所有SQL语句到控制台.3.3.hibernate.order_updateshibernate.order_updates 强制Hibernate按照被更新数据的主键,为SQL更新排序。4.4.hibernate.max_fetch_depthhibernate.max_fetch_depth 为单向关联(一对一,多对一)的外连接抓取(outer jo
49、in fetch)树设置最大深度.值为0意味着将关闭默认的外连接抓取.取值 建议在0到3之间取值Softeem Consultancy Service介绍:延迟加载介绍:延迟加载CGLIB1.CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。2.它底层使用字节码处理框架ASM。其原理是,生产一个要代理类的子类,子类覆盖要代理的类的所有不是final的方法。3.它比使用java反射的JDK动态代理要快。通常情况下,你可以使用JDK的动态代理创建代理,当你要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。Softeem Consultancy Service总结总结为什么要使用为什么要使用Hibernate?Hibernate是什么?是什么?使用使用Hibernate的的“3个准备,个准备,7个步骤个步骤”指的是?指的是?使用什么方法可以简化使用什么方法可以简化“3个准备个准备”?使用什么方法可以简化使用什么方法可以简化“7个步骤个步骤”?使用使用Hibernate实现实现DAO层,比单纯使用层,比单纯使用JDBC实现优实现优越在哪儿?越在哪儿?
限制150内