




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Softeem Consultancy Service第一章第一章Hibernate入门入门Softeem Consultancy Service预习检查预习检查为什么需要为什么需要Hibernate?Hibernate是什么?是什么?使用使用Hibernate的步骤是?的步骤是?Softeem Consultancy Service本章任务本章任务了解了解Hibernate基本原理基本原理 学会编写实体映射文件学会编写实体映射文件 学会使用学会使用Hibernate完成数据增、删、改操作完成数据增、删、改操作 学会在项目中使用学会在项目中使用Hibernate一级缓存与二级缓存一级缓存与二级
2、缓存Softeem Consultancy Service为什么使用为什么使用Hibernate?在编写在编写DAO层代码时,容易出现哪些问题?层代码时,容易出现哪些问题?思考:这部分思考:这部分代码规律性很代码规律性很强,是否可以强,是否可以采用采用“通用通用”的方法的方法“集中集中”解决?解决?代码繁琐代码繁琐容易出错容易出错纯纯“体力体力”劳劳动动工作量大工作量大占用大量开发占用大量开发时间时间public void insert(HouseDTO dto) try PreparedStatement ps = con.prepareStatement(insert into house
3、 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=?
5、,hireprice=?,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
6、, dto.getRoom();ps.setInt(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
7、* from house where hid=?);ps.setString(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); / 联系
8、人联系人dto.setRoom(rs.getInt(room); / 室室dto.setSid(rs.getInt(sid); / 街道街道dto.setAid(rs.getInt(aid); / 区域区域 catch (SQLException e) e.printStackTrace();return dto;Softeem Consultancy Service为什么使用为什么使用Hibernate?使用使用Hibernate后的后的DAO层代码:层代码:代码精简易读代码精简易读封装了封装了JDBC操作,操作,以面向对象的方式以面向对象的方式操作数据操作数据开发工作量小,可开发工作量小,
9、可以以集中集中精力精力处理处理业业务逻辑务逻辑public class HouseDAOHibImpl extends 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)
10、; Hibernate就是用来就是用来解决这些问题的解决这些问题的!Softeem Consultancy Service为什么使用为什么使用Hibernate?屏蔽数据库之间的差异性屏蔽数据库之间的差异性HibernateJDBCJNDI文本JTA数据库类型数据库类型访问方式访问方式Softeem Consultancy ServiceHibernate是什么?是什么?Hibernate之父:之父:Gavin KingJBoss核心成员之一核心成员之一EJB3.0专家委员会成员专家委员会成员Hibernate In Action作者作者2001年开始开发年开始开发Hibernate2003年
11、年Hibernate发展为发展为Java世界主流持久层框架世界主流持久层框架充满激情充满激情脾气倔强脾气倔强永不言败永不言败Softeem Consultancy Service基于关系数据库的持久层可选方案基于关系数据库的持久层可选方案优点缺点SQL/JDBC成熟,流行,使用成熟,流行,使用DAO模式模式代码烦杂,可读性差,维护困难,移代码烦杂,可读性差,维护困难,移植困难植困难Entity BeanCMP(EJB1.1之后),后来的之后),后来的EJB3错误的设计。不可移植,依赖性强,错误的设计。不可移植,依赖性强,不可序列化,不支持多态的关联查询不可序列化,不支持多态的关联查询JDO简单
12、、透明、标准简单、透明、标准不够成熟不够成熟Softeem Consultancy Service基于关系数据库的持久层可选方案基于关系数据库的持久层可选方案优点缺点Apache OJB性能、稳定性,属于性能、稳定性,属于Apache 基金组织基金组织文档资源太少,支持标准太多成了负文档资源太少,支持标准太多成了负担(担(ODMG 3.0,JDO1.0)iBATIS可以控制更多的数据库操作细可以控制更多的数据库操作细节。实用于遗留系统的改造和节。实用于遗留系统的改造和对既有数据库的对既有数据库的复用。复用。持久层封装不够彻底,只是一个持久层封装不够彻底,只是一个DBHelper。Hiberna
13、te成熟、流行、功能强大。并逐成熟、流行、功能强大。并逐渐发展成渐发展成Java 持久层事实上的持久层事实上的标准。标准。不够透明不够透明Softeem Consultancy Service一个优秀的持久化框架一个优秀的持久化框架什么是持久化?什么是持久化?内存内存姓名:小颖姓名:小颖性别:女性别:女特长:英语、程序设计特长:英语、程序设计瞬时状态瞬时状态磁盘磁盘持久状态持久状态用用JDBC完成数据在完成数据在瞬时瞬时和和持久持久状状态间的转换态间的转换:stmt.execute ( ).瞬时状态:瞬时状态:保存在内存的程序数据,程保存在内存的程序数据,程序退出后,数据就消失了,序退出后,数
14、据就消失了,称为瞬时状态称为瞬时状态持久状态:持久状态:保存在磁盘上的程序数据,保存在磁盘上的程序数据,程序退出后依然存在,称为程序退出后依然存在,称为程序数据的持久状态程序数据的持久状态持久化:持久化:将程序数据在瞬时状态和将程序数据在瞬时状态和持久状态之间转换的机制持久状态之间转换的机制持久化持久化Softeem Consultancy Service一个主流的一个主流的ORM产品产品什么是什么是ORM?对象数据(对象数据( )name:小颖:小颖sex:女:女skill:英语、程序设计:英语、程序设计User对象对象持久化层持久化层业务逻辑层业务逻辑层表现层表现层数据库层数据库层tbl_
15、user表表关系型数据(关系型数据( )tbl_user表记录表记录 映射信息映射信息() 类类: User表表: tbl_user属性属性字段字段nameuser_namesexuser_sexskilluser_skillORM(对象(对象-关系映射):关系映射):完成对象数据到关系型数据映射的完成对象数据到关系型数据映射的机制称为对象机制称为对象-关系映射,简称关系映射,简称ORM。Softeem Consultancy Service如何使用如何使用Hibernate?使用使用 Hibernate 的的“3个准备,个准备,7个步骤个步骤”Softeem Consultancy Serv
16、ice如何使用如何使用Hibernate?使用使用 的的3个准备:个准备:1.导入导入Hibernate库库(jar包)包)2.添加核心配添加核心配置文件置文件 hibernate.cfg.xml3.添加对应表添加对应表的实体类和映的实体类和映射文件射文件Softeem Consultancy Service jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=crm ;SelectMethod=cursor sa 123 com.microsoft.jdbc.sqlserver.SQLServerDriver org.hibernate
17、.dialect.SQLServerDialect true 配置数据源配置数据源数据库数据库“方言方言”运行时在控制台显示运行时在控制台显示SQL语句语句映射文件,可以有多个映射文件,可以有多个准备准备2:添加核心配置文件:添加核心配置文件 - hibernate.cfg.xmlSofteem Consultancy Servicepackage com.softeem.entity;public class User implements java.io.Serializable private Integer uid; private String uname; private Stri
18、ng upass; public User() / 默认构造方法默认构造方法 / Getter and setter准备准备3:添加实体类和映射文件(添加实体类和映射文件(User.hbm.xml)实现实现Serializable接口接口添加默认构造方添加默认构造方法法实体类到表的映射实体类到表的映射主键主键属性到字段的映射属性到字段的映射主键生成器:主键生成器:native 由数据库由数据库生成生成assigned 在程序在程序中指定中指定Softeem Consultancy Service如何使用如何使用Hibernate?使用使用Hibernate的的7个步骤:个步骤: Softeem
19、 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 t
20、x = 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 执行结果执
21、行结果Softeem Consultancy ServiceConfiguration SessionFactory SessionTransaction创建创建创建创建开始开始save delete update get mit() session.close()执行执行Hibernate.cfg.xmlHouse.cfg.xmlUser.hbm.xml结束结束创建和销毁都相当耗费创建和销毁都相当耗费资源,通常一个系统内资源,通常一个系统内一个数据库只创建一个一个数据库只创建一个类似于类似于JDBC中的中的Connection 查询操作稍后介绍查询操作稍后介绍 Hibernate执行过程执行
22、过程Softeem Consultancy Service程序代码程序代码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
23、Name);session.update(user);mit();修改修改tx = session.beginTransaction();User user = (User) session.load(User.class, id);session.delete(user);mit();删除删除没有更新数据,没有更新数据,不需进行事务不需进行事务控制控制先加载,再更新先加载,再更新先加载,再删除先加载,再删除使用使用Hibernate实现数据的加载实现数据的加载/删除删除/修改修改Softeem Consultancy Service程序代码程序代码Session session = sf.o
24、penSession();Query query = session.createQuery(“from User user”);List list = query.list();for(User user : list) System.out.println(user.getUname() + , +user.getUpass();session.close();使用使用Hibernate实现数据的查询实现数据的查询Softeem Consultancy ServiceHibernate延时加载延时加载1. 延时加载概念:只有真正使用该对象时,才会创建,延时加载概念:只有真正使用该对象时,才
25、会创建,对于对于hibernate而言,真正使用的时候才会发出而言,真正使用的时候才会发出sql。2. hibernate支持支持lazy策略只有在策略只有在session打开状态下才打开状态下才有效。有效。3. hibernate lazy策略可以使用在:策略可以使用在:标签上,可以取值:标签上,可以取值:true/false注:标签上的lazy特性只对普通属性起作用标签上,可以取值:标签上,可以取值:true/false需要类增强工具需要类增强工具标签上,可以取值:标签上,可以取值:true/false/extra单端关联上,可以取值:单端关联上,可以取值:false/proxy/nopr
26、oxySofteem Consultancy Service延时加载演示示例:延时加载演示示例:/设置设置标签上的标签上的lazy=truelazy=true,也就是默认配置,也就是默认配置, ,可以不加可以不加 public void testLoad1() Session session = null;session = HibernateUtils.getSession();session.beginTransaction();/不会发出不会发出sqlGroup group = (Group)session.load(Group.class, 1);/不会发出不会发出sqlSystem.
27、out.println(group.id= + group.getId();/会发出会发出sqlSystem.out.println(= + group.getName();session.getTransaction().commit();session.getTransaction().rollback();HibernateUtils.closeSession(session);public void testLoad2() Session session = null;Group group = null;session = HibernateUtils.getSe
28、ssion();session.beginTransaction();group = (Group)session.load(Group.class, 1);session.getTransaction().commit();session.getTransaction().rollback();HibernateUtils.closeSession(session);/不能正确输出,抛出不能正确输出,抛出LazyInitializationException 异常,因为异常,因为session已经关闭已经关闭/hibernate支持支持lazy策略只有在策略只有在session打开状态下有效
29、打开状态下有效System.out.println(= + group.getName(); /hibernatehibernate在集合上的在集合上的lazylazy策略,可以取值:策略,可以取值:true/false/extratrue/false/extra Softeem Consultancy ServiceHibernate一级缓存一级缓存1. 缓存是指一组数据的集合,这些数据储存在其他地方,缓存是指一组数据的集合,这些数据储存在其他地方,因为获取这些数据代价昂贵,所以把这些结果数据保因为获取这些数据代价昂贵,所以把这些结果数据保存起来,让下一次需要这些数据的时
30、候直接使用,这存起来,让下一次需要这些数据的时候直接使用,这就大大提高了系统效率。就大大提高了系统效率。2. 一级缓存很短和一级缓存很短和session的生命周期一致,一级缓存也的生命周期一致,一级缓存也叫叫session级或事务级缓存。级或事务级缓存。3. 哪些方法支持一级缓存及一级缓存的管理:哪些方法支持一级缓存及一级缓存的管理:get()load()Iterate () (查询实体对象)(查询实体对象)session.clear(),session.evict() (管理一级缓存)(管理一级缓存)Softeem Consultancy Service哪些方法支持一级缓存哪些方法支持一级缓
31、存(设置断点方式判断设置断点方式判断)/在同一个在同一个session中发出两次中发出两次load查询查询public void testCache1() Session session = null; try session = HibernateSessionFactory.getSession(); session.beginTransaction(); /load()方法不会发出SQL语句,因为他返回一个代理类 TbUser user = (TbUser)session.load(TbUser.class, 1); System.out.println(= + use
32、r.getUserName(); /不会发出sql,因为load使用缓存 user = (TbUser)session.load(TbUser.class, 1); System.out.println(= + user.getUserName(); session.getTransaction().commit(); session.close(); catch(Exception e) e.printStackTrace(); /在同一个在同一个session中发出两次中发出两次iterate查询属性,不使用一级缓存查询属性,不使用一级缓存public void test
33、Cache3() Session session = null; session = HibernateSessionFactory.getSession(); String userName = (String)session.createQuery(select userName from TbUser where userId=1).iterate().next(); System.out.println(= + userName); /iterate查询普通属性,没有用到一级缓存 /从这个例子可以看出,一级缓存是缓存实体对象的 userName = (String)s
34、ession.createQuery(select userName from TbUser where userId=1).iterate().next(); System.out.println(= + userName); /开启两个开启两个session发出发出load查询查询public void testCache4() Session session = null; session = HibernateSessionFactory.getSession(); session.beginTransaction(); TbUser user = (TbUser)s
35、ession.load(TbUser.class, 1); System.out.println(= + user.getUserName(); session.getTransaction().commit(); session.close(); session = HibernateSessionFactory.getSession(); session.beginTransaction(); /会发出查询语句,会发出查询语句,session间不能共享一级缓存的数据间不能共享一级缓存的数据 /因为它会伴随因为它会伴随session的生命周期存在和消亡的生命周期存在和消亡
36、TbUser user = (TbUser)session.load(TbUser.class, 1); System.out.println(= + user.getUserName(); session.getTransaction().commit(); session.close(); /管理一级缓存管理一级缓存public void testCache5() Session session = null; session = HibernateSessionFactory.getSession(); session.beginTransaction(); TbUse
37、r user = (TbUser)session.load(TbUser.class, 1); System.out.println(= + user.getUserName(); /管理一级缓存,因为一级缓存无法取消,但可以管理,如:session.clear() session.evict();session.clear(); /会发出sql,因为一级缓存中的实体对象被清除了 user = (TbUser)session.load(TbUser.class, 1); System.out.println(= + user.getUserName(); s
38、ession.getTransaction().commit(); session.close(); Softeem Consultancy ServiceHibernate二级缓存二级缓存1.二级缓存的生命周期和二级缓存的生命周期和SessionFactory的生命周期一致,也称的生命周期一致,也称SessionFactory级或进程级的缓存。级或进程级的缓存。2.因为我们提到了,二级缓存是一个可插拔的缓存插件,所以二级缓存一因为我们提到了,二级缓存是一个可插拔的缓存插件,所以二级缓存一定要先配置后使用。定要先配置后使用。3.二级缓存的配置二级缓存的配置:将将echcache.xml文件拷贝
39、到文件拷贝到src下下开启二级缓存,修改开启二级缓存,修改hibernate.cfg.xml文件文件true指定缓存产品提供商,修改指定缓存产品提供商,修改hibernate.cfg.xml文件文件org.hibernate.cache.EhCacheProvider指定哪些实体类使用二级缓存(两种方法)指定哪些实体类使用二级缓存(两种方法)* 在映射文件中采用在映射文件中采用标签标签* 在在hibernate.cfg.xml文件中,采用文件中,采用标签标签Softeem Consultancy Service二级缓存的一些基本特性:二级缓存的一些基本特性:/开启两个开启两个sessionse
40、ssion,分别调用,分别调用loadloadpublic void testCache1() Session session = null;session = HibernateSessionFactory.getSession();session.beginTransaction();TbUser user = (TbUser)session.load(TbUser.class, 1);System.out.println(= + user.getUserName();session.getTransaction().commit();session.close();se
41、ssion = HibernateSessionFactory.getSession();session.beginTransaction();/不会发出sql,因为开启了二级缓存,session是共享二级缓存的TbUser user = (TbUser)session.load(TbUser.class, 1);System.out.println(= + user.getUserName();session.getTransaction().commit();session.close(); /开启两个开启两个sessionsession,分别调用,分别调用load,lo
42、ad,中间使用中间使用SessionFactorySessionFactory清除二级缓存清除二级缓存public void testCache2() Session session = null; session = HibernateSessionFactory.getSession();session.beginTransaction();TbUser user = (TbUser)session.load(TbUser.class, 1);System.out.println(= + user.getUserName();session.getTransaction(
43、).commit();session.close();/管理二级缓存管理二级缓存SessionFactory factory = HibernateSessionFactory.getSessionFactory();factory.evict(TbUser.class, 1);session = HibernateSessionFactory.getSession();session.beginTransaction();/会发出查询会发出查询sql,因为二级缓存中的数据被清除了,因为二级缓存中的数据被清除了TbUser user = (TbUser)session.load(TbUser.
44、class, 1);System.out.println(= + user.getUserName();session.getTransaction().commit();session.close(); /一级缓存和二级缓存的交互一级缓存和二级缓存的交互public void testCache3() Session session = null;session = HibernateSessionFactory.getSession();/仅向二级缓存读数据,而不向二级缓存写数据仅向二级缓存读数据,而不向二级缓存写数据session.setCacheMode(CacheM
45、ode.GET);TbUser user = (TbUser)session.load(TbUser.class, 1);System.out.println(= + user.getUserName();session = HibernateSessionFactory.getSession();/发出发出sql语句,因为语句,因为session设置了设置了CacheMode为为GET,所以二级缓存中没有数据,所以二级缓存中没有数据TbUser user = (TbUser)session.load(TbUser.class, 1);System.out.println(u
46、= + user.getUserName();session = HibernateSessionFactory.getSession();/只向二级缓存写数据,而不从二级缓存读数据只向二级缓存写数据,而不从二级缓存读数据session.setCacheMode(CacheMode.PUT);TbUser user = (TbUser)session.load(TbUser.class, 1);System.out.println(= + user.getUserName(); Softeem Consultancy Service在项目中使用在项目中使用Hi
47、bernateUserDAOHibImpl中中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 session.close(); 蓝色的代码和蓝色的代码和del、update方法的代码方法的代码存在重复,可以采取存在重复,可以采取什么方法精简呢?什么方法精简呢?Softeem Consultancy Service使用使用BaseHibernateDAO简化编码简化编码public abstract class BaseHibernateDAO pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商场店面转让合同范本
- 公司劝退员工合同范本
- 共同管理合同范本
- 商贸公司策划合同范本
- 水费收取维护合同范本
- 吉林省吉林市蛟河市2023-2024学年八年级上学期期末考试数学试卷(含解析)
- 中国传统节日-端午节73
- 2025年生猪交易合同标准范本
- 2025版租赁合同样书
- 语文课程标准与教材研究知到课后答案智慧树章节测试答案2025年春内江师范学院
- 2024年湖南省高等学校对口招生考试英语试卷试题真题
- 公司2025年工会工作要点
- 2025年中国煤炭地质总局社会招聘20人笔试参考题库附带答案详解
- 广东省深圳市宝安区10校联考2023-2024学年八年级下学期期中数学试题(含答案)
- 2024外研社英语七年级(下)词汇表
- 绿色建筑能源管理
- 每天坚持一小时体育锻炼
- 铝合金压铸件典型内部缺陷
- 场地移交确认书
- 河北省分公司联通公司员工退出管理办法(征求意见稿)
- 辽宁计价定额2008计算规则
评论
0/150
提交评论