




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate学习笔记Java相关课程系列笔记之十四笔记内容说明Hibernate(梁建全老师主讲,占笔记内容100%);目 录一、 Hibernate的概述11.1 Hibernate框架的作用11.2 Hibernate访问数据库的优点11.3 JDBC访问数据库的缺点11.4 Hibernate的设计思想1二、 Hibernate的基本使用22.1 Hibernate的主要结构22.2 Hibernate主要的API22.3 Hibernate使用步骤22.4 HQL语句(简要介绍)6三、 数据映射类型73.1映射类型的作用73.2 type映射类型的两种写法7四、 Hibernate主键生成方式84.1五种生成方式8五、 Hibernate基本特性95.1对象持久性95.2处于持久状态的对象具有的特点95.3三种状态下的对象的转换95.4批量操作:注意及时清除缓存95.5案例:三种状态下的对象使用105.6一级缓存机制(默认开启)105.7一级缓存的好处105.8管理一级缓存的方法105.9延迟加载机制115.10具有延迟加载机制的操作115.11常犯的错误125.12延迟加载的原理125.13 Session的get和load方法的区别125.14延迟加载的好处125.15案例:测试延迟加载125.16案例:重构NetCTOSS资费管理模块135.17 Java Web程序中如何用延迟加载操作(OpenSessionInView)15六、 关联映射186.1一对多关系one-to-many186.2多对一关系many-to-one196.3多对多关联映射many-to-many196.4关联操作(查询join fetch/级联cascade)216.5继承关系映射24七、 Hibernate查询方法277.1 HQL查询277.2 HQL和SQL的相同点277.3 HQL和SQL的不同点277.4 HQL典型案例277.5 Criteria查询307.6 Native SQL原生SQL查询31八、 Hibernate高级特性328.1二级缓存328.2二级缓存开启方法及测试328.3二级缓存管理方法338.4二级缓存的使用环境338.5查询缓存338.6查询缓存开启方法及测试338.7查询缓存的使用环境33九、 Hibernate锁机制349.1悲观锁349.2悲观锁的实现原理349.3悲观锁使用步骤及测试349.4乐观锁359.5乐观锁的实现原理359.6乐观锁使用步骤及测试35十、 其他注意事项3610.1源码服务器管理工具3610.2利用MyEclipse根据数据表自动生成实体类、hbm.xml3610.3根据实体类和hbm.xml生成数据表3710.4 Hibernate中分页查询使用join fatch的缺点3710.5 Hibernate的子查询映射381、 Hibernate的概述1.1 Hibernate框架的作用Hibernate框架是一个数据访问框架(也叫持久层框架,可将实体对象变成持久对象,详见第5章)。通过Hibernate框架可以对数据库进行增删改查操作,为业务层构建一个持久层。可以使用它替代以前的JDBC访问数据。1.2 Hibernate访问数据库的优点1)简单,可以简化数据库操作代码。2)Hibernate可以自动生成SQL,可以将ResultSet中的记录和实体类自动的映射(转化)。3)Hibernate不和数据库关联,是一种通用的数据库框架(支持30多种数据库),可以方便数据库移植。任何数据库都可以执行它的API。因为Hibernate的API中是不涉及SQL语句的,它会根据Hibernate的配置文件,自动生成相应数据库的SQL语句。1.3 JDBC访问数据库的缺点1)需要编写大量的复杂的SQL语句、表字段多时SQL也繁琐、设置各个问号值。2)需要编写实体对象和记录之间的代码,较为繁琐。3)数据库移植时需要修改大量的SQL语句。1.4 Hibernate的设计思想Hibernate是基于ORM(Object Relation Mapping)思想设计的,称为对象关系映射。负责Java对象和数据库表数据之间的映射。Hibernate是一款主流的ORM工具,还有其他很多ORM工具,如:MyBatis(以前叫iBatis)、JPA。Hibernate功能比MyBatis强大些,属于全自动类型,MyBatis属于半自动。但全自动会有些不可控因素,因此有些公司会用MyBatis。ORM工具在完成Java对象和数据库之间的映射后:1)在查询时,直接利用工具取出“对象”(不论是查询一条记录还是多条记录,取出的都是一个个对象,我们不用再去转化实体了)。2)在增删改操作时,直接利用工具将“对象”更新到数据库表中(我们不用再去把对象转成数据了)。3)中间的SQL+JDBC细节,都被封装在了工具底层,不需要程序员参与。u 注意事项:v Java程序想访问数据库,只能通过JDBC的方式,而Hibernate框架也就是基于ORM思想对JDBC的封装。v Hibernate是以“对象”为单位进行数据库的操作。2、 Hibernate的基本使用2.1 Hibernate的主要结构1) hibernate.cfg.xml(仅1个):Hibernate的主配置文件,主要定义数据连接参数和框架设置参数。u 注意事项:就是个xml文件,只是名字比较奇葩!2) Entity实体类(n个,一个表一个):主要用于封装数据库数据。3)hbm.xml映射文件(n个):主要描述实体类和数据表之间的映射信息。描述表与类,字段与属性的对应关系。u 注意事项:hbm.xml是个后缀,如:命名可写Cost.hbm.xml。2.2 Hibernate主要的API1)Configuration:用于加载hibernate.cfg.xml配置信息。用于创建SessionFactory。2)SessionFactory:存储了hbm.xml中描述的信息,内置了一些预编译的SQL,可以创建Session对象。3)Session:负责对数据表执行增删改查操作。表示Java程序与数据库的一次连接会话,是对以前的Connection对象的封装。和JSP中的session不是一回事,就是名字一样而已。4)Query:负责对数据表执行特殊查询操作。5)Transaction:负责Hibernate操作的事务管理。默认情况下Hibernate事务关闭了自动提交功能,需要显式的追加事务管理(如调用Transaction对象中的commit();提交事务)!u 注意事项:v 这些API都是在Hibernate包下的,导包别导错!v 第一次访问数据库比较慢,比较耗资源,因为加载的信息多。2.3 Hibernate使用步骤step1:建立数据库表。step2:建立Java工程(Web工程也可),引入Hibernate开发包和数据库驱动包。必须引入的包:hibernate3.jar、cglib.jar、dom4j.jar、commons-collections.jar、commons-logging.jar等step3:添加hibernate.cfg.xml配置文件,文件内容如下:org.hibernate.dialect.OracleDialectjdbc:oracle:thin:localhost:1521:dbchangsystemchangoracle.jdbc.driver.OracleDrivertrue trueu 注意事项:应该放在源文件的src目录下,默认为hibernate.cfg.xml。文件内容是Hibernate工作时必须用到的基础信息。step4:编写Entity实体类(也叫POJO类),例如:资费实体类Cost private Integer id; /资费 ID private String feeName; /资费名称 private Integer baseDuration; /基本时长 private Float baseCost; /基本定费 private Float unitCost; /单位费用 private String status; /0:开通;1:暂停; private String descr; /资费信息说明 private Date createTime; /创建日期 private Date startTime; /启用日期 private String costType; /资费类型getter/setter方法u 注意事项:POJO类表示普通类(Plain Ordinary Old Object),没有格式的类,只有属性和对应的getter/setter方法,而没有任何业务逻辑方法的类。这种类最多再加入equals()、hashCode()、toString()等重写父类Object的方法。不承担任何实现业务逻辑的责任。step5:编写hbm.xml映射(文件)描述信息:映射文件用于指明POJO类和表之间的映射关系(xx属性对应xx字段),一个类对应一个映射文件。例如:Cost.hbm.xml内容如下:!- - !- 表明此为主键列,且必须写否则xml报错,主键映射 - !- 或双标签 - COST_SEQ_CHANG !-也可写成 ,主键列同理!- 其他省略 u 注意事项:v 映射文件默认与POJO类放在一起;命名规则为:类名.hbm.xml。v hbm.xml中已写出的属性与字段的映射要一一对应,若表中没有某个字段,却写了映射关系,则报错:找不到实体类。step6:利用Hibernate API实现DAO1) 新建HibernateUtil类,用于封装创建Session的方法。如下:每个用户会对应一个Session,但是SessionFactory是共享的。public class HibernateUtil private static SessionFactory sf;static/不用每次都加载配置信息,所以放static块中,否则每次都加载会耗费资源Configuration conf=new Configuration();/加载主配置hibernate.cfg.xmlconf.configure(/hibernate.cfg.xml);sf=conf.buildSessionFactory();/获取SessionFactorypublic static Session getSession()/获取SessionSession session =sf.openSession();return session; 2) 新建CostDAO接口 public Cost findById(int id);public void save(Cost cost);public void delete(int id);public void update(Cost cost); public List findAll();3) 新建CostDAOImpl类,用于实现CostDAO接口public class CostDAOImpl implements CostDAO private Session session;public CostDAOImpl () /不想老写获得session的方法,就写在构造器中session=HibernateUtil.getSession();/* get方法执行查询,按主键当条件查询,如何判断是主键,是根据写的描述文件来定,get方法就是findById,就是按主键去查,需指定:操作哪个类和id(主键)条件值即可,其他条件查询做不了 */ public Cost findById(int id) /Session session=HibernateUtil.getSession();Cost cost=(Cost)session.get(Cost.class,id);session.close(); return cost; /* save方法执行增加操作,注意1:获取事务并开启,增删改要注意,查询可以不管事务,因为没对数据库进行修改;注意2:主键值根据hbm.xml中的定义生成,执行后,会先获取序列值,再去做insert操作。即先:select COST_SEQ_CHANG.nextval from dual; 然后:insert into */public void save(Cost cost) /Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();/打开事务session.save(cost);mit();/提交事务session.close();/释放 /* delete方法执行删除操作,由于Hibernate以“对象”为单位进行数据库操作,所以这里要传进去一个对象,虽然是个对象,但还是按主键做条件删除,只要把主键值设置上就行,其他非主键值不用管。也可先通过id查再删 */ public void delete(int id) /Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();Cost cost=new Cost();cost.setId(id); session.delete(cost); mit(); session.close(); /* update方法执行修改操作, */public void update(Cost cost) /Session session=HibernateUtil.getSession();Transaction tx=session.beginTransaction();session.update(cost);/将cost对象更新到数据库mit();session.close(); /* 特殊查询,SQL语句:String sql=select * from COST_CHANG; HQL语句:String hql=from Cost; (Hibernate Query Language)是面向对象的查询语句。from后写映射的类名,它是Hibernate中特有的查询语句,根据映射的类去查询。 */public List findAll() /Session session=HibernateUtil.getSession();String hql=from Cost;/HQL语句Query query=session.createQuery(hql);List list=query.list();/执行查询,返回List集合session.close();return list; 4) 新建TestCostDAO类,使用junit测试 Testpublic void testFindById()/当get方法没有记录时,返回nullCostDAO costDao = new CostDAOImpl(); Cost cost = costDao.findById(1);System.out.println(cost.getName();System.out.println(cost.getBaseDuration();System.out.println(cost.getBaseCost();System.out.println(cost.getUnitCost();System.out.println(cost.getDescr();Testpublic void testSave()/id主键列由Hibernate管理,这里不用设置Cost cost=new Cost();cost.setName(2013计时);cost.setUnitCost(0.8f);cost.setDescr(2013-08-09计时,0.8元/小时。);cost.setStatus(0);cost.setCreaTime(new Date(System.currentTimeMillis();CostDAO costDao = new CostDAOImpl();costDao.save(cost);Testpublic void testUpdate()/开通某个资费,把状态由0变为1CostDAO costDAO=new CostDAOImpl();/* 注意事项:更新部分字段,不能和实现类中的删除那样,做一个对象出来!否则没设置的字段将被改为空! 即不能:Cost cost=new Cost(); cost.setId(90); cost.setStatus(1); cost.setStartTime(new Date(System.currentTimeMillis(); */Cost cost=costDAO.findById(90);/只能先通过id找到带有所有值的对象cost.setStatus(1);/然后再对部分字段进行更新,才能避免把其他字段更新为空cost.setStartTime(new Date(System.currentTimeMillis();costDAO.update(cost);Testpublic void testDelete()CostDAO costDAO=new CostDAOImpl(); costDAO.delete(90);Testpublic void testFindAll()CostDAO costDAO=new CostDAOImpl();List list=costDAO.findAll();for(Cost c:list)System.out.println(c.getName();2.4 HQL语句(简要介绍)简要介绍见2.3节中step6中的3)特殊查询(本页最上)。详细介绍见第七章。3、 数据映射类型hbm.xml在描述字段和属性映射时,采用type属性来指定映射类型。3.1映射类型的作用主要负责实现属性和字段值之间的相互转化。3.2 type映射类型的两种写法1)指定Java类型,例如:java.lang.String、java.lang.Integer ,不能写成String 2)指定Hibernate类型,例如:整数:byte、short、integer、long;浮点数:float、double; 字符串:string;日期和时间:date(只处理年月日),time(只处理时分秒),timestamp(处理年月日时分秒);布尔值:true/falsechar(1)(数据库存Y/N,显示时自动转为true/false)、true/falsechar(1)(数据库存T/F,显示时自动转为true/false)、true/falsebit(数据库存1/0,显示时自动转为true/false);其他:blob(以字节为单位存储大数据)、clob(以字符为单位存储大数据)、big_decimal、big_integer;u 注意事项:Hibernate类型都是小写!建议使用Hibernate类型。3)所以2.3节中step5的Cost.hbm.xml内的type也可这样写: u 注意事项:v java.util.Date有年月日时分秒毫秒,但如果用date映射,则只把年月日存进数据库;java.sql.Date只有年月日。java.sql.Timestamp有年月日时分秒毫秒。v 若在页面显示按特定格式显示则用Struts2标签:4、 Hibernate主键生成方式Hibernate负责管理主键值。它提供了多种主键生成方式。4.1五种生成方式1)sequence:可以按指定序列生成主键值。只适用于Oracle数据库。不担心并发量!例如: 序列名字u 注意事项:创建序列时如果不指定参数,默认从1开始,步进是1。2)identity:按数据库自动增长机制生成主键值。一般适用于MySql、SQLServer数据库。例如:3) native:Hibernate会根据方言类型不同,选择不同的主键生成方式。如果是OracleDialect则会选择sequence,如果是MySQLDialect则会选择identity。例如:u 注意事项:如果是MySql数据库,序列名字是不起作用的,但也不会出错;如果是Oracle数据库,序列名字就会起作用,所以一般我们会加上这句话,这样通用性更强。4) assigned:Hibernate会放弃主键生成,采用此方法,需要在程序中指定主键值。例如:5)increment:Hibernate先执行select max(id).语句获取当前主键的最大值,执行加1操作,然后再调用insert语句插入。Oracle和MySQL都可用。但不适合并发量很大的情况!例如:6)uuid/hilo:uuid:按UUID算法生成一个主键值(字符串类型);hilo:按高低位算法生成一个主键值(数值类型)。例如:u 注意事项:v 主键一般都是自动生成的。我们一般不使用业务数据作为主键,因为业务逻辑的改变有可能会改变主键值。v 主键生成方式是枚举类型,只能从一个有限的范围内选择,不能自定义。其中,sequence是使用序列生成主键(Oracle数据库经常使用)。5、 Hibernate基本特性5.1对象持久性在Hibernate使用过程中,实体对象可以具有以下三种状态:1) 临时状态:采用new关键字创建的对象,该对象未与Session发生关联(未调用Session的API)。也叫临时对象。临时状态的对象会被Java的垃圾回收机制回收。2) 持久状态:实体对象与Session发生关联(调用了Session的get、load、save、update等API)。也叫持久对象。3) 游离状态:原来是持久状态,后来脱离了Session的管理。如:Session被关闭,对象将从持久状态变为游离状态,同时垃圾回收机制可以回收掉,不再占用缓存空间了。5.2处于持久状态的对象具有的特点1)对象生命期持久,垃圾回收机制不能回收。2)对象的数据可以与数据库同步(即对象中的数据发生改变,则数据库中的数据自动同步)。由Session对象负责管理和同步。3)对象在Session的一级缓存中存放(或者说在Session缓存中的对象都是持久对象)。u 注意事项:Session.close();有两个作用:关闭连接、释放资源使对象变为游离状态,当对象的引用不存在时,对象才被回收。没被回收时,对象中的数据还在!5.3三种状态下的对象的转换5.4批量操作:注意及时清除缓存 Transaction tx = session.beginTransaction(); for(int i=0;i *.class - 载入类加载器 - 执行 延迟加载:javassist.jar/cglib.jar(生成新类型)- 类加载器 - 执行5.13 Session的get和load方法的区别1)相同点:两者都是按“主键”做条件查询。2)不同点:get是立刻加载;load是延迟加载。 get返回的对象类型是实体类型;load返回的是动态生成的一个代理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 激励学生社团创新计划
- 2024年河南省三支一扶招募笔试真题
- 2024年广州市南石头街招聘雇员笔试真题
- 提升急诊满意度的实践计划
- 2025届四川省部分地区七年级数学第二学期期末达标检测模拟试题含解析
- 企业创新与风险管理的关系试题及答案
- 北京市丰台区第十二中学2025届数学八下期末预测试题含解析
- 系统集成的挑战与策略试题及答案
- 互联网架构与设计原则试题及答案
- 法学概论的理论探讨与实务应用试题及答案
- GB/T 34016-2017防鼠和防蚁电线电缆通则
- GB/T 22026-2008气雾剂级丙烷(A-108)
- GB/T 14140-2009硅片直径测量方法
- 尾矿库重大风险及管控措施
- 国家义务教育质量监测科学模拟测试题附答案
- 康复训练类辅助器具课件
- PUMA560机器人运动学分析
- UI界面设计交互设计教学
- 2021版检定和校准实验室程序文件
- 钢箱梁计算分析与案例详解
- 人工挖孔安全检查记录表
评论
0/150
提交评论