《2022年hibernate基本知识点.docx》由会员分享,可在线阅读,更多相关《2022年hibernate基本知识点.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -名师精编 优秀资料Hibernate 基本学问点Hibernate 介绍 Hibernate 的 Hello World Hibernate 原理的模拟,重点讲思路,代码不全部实现 Hibernate 的基本配置 Hibernate 常用类介绍与对象三种状态 Hibernate 数据库连接池配置 Hibernate 关系映射 一对一一对多 多对多Hibernate 关系映射的增删改查 Hibernate 查询( HQL语句的使用)Hibernate 条件查询( Criteria Queries )1. Hib
2、ernate 介绍1 参考我画的 hibernate结构图,结合官方文档结构图去懂得2是一个对象关系映射框架,对jdbc 进行了轻量级的封装,可以让开发者以面OOP编程思维去长久化数据库2. Hibernate 的 Hello World1 xml 配置形式i. 新建 java 项目 hibernate01ii. 引入 hibernate4 的相关包iii. 引入 oracle 驱动包,建立 student 表iv. 新建 hibernate 配置文件 hibernate.cfg.xmla 从官方文档中 copy 样例b 修改相应的数据库连接,修改数据库方言v. 新建实体类 Studentvi
3、. 新建实体类 Student 对应的映射文件vii. 将映射文件添加到 hibernate.cfg.xml 中viii. 编写测试类, 留意 hibernate3 和 hibernte4 的写法不同i. Hibernate3 :参考文档i. Hibernate4 :Configuration cfg = new Configuration.configure;ServiceRegistry sr = new ServiceRegistryBuilder.applySettingscfg.getProperties.buildServiceRegistry;cfg.buildSessionFa
4、ctorysr 3. Hibernate 原理模拟 (明白)1 思路:客户新建了一个实体对象例如 Student ,调用 session.save 方法,就帮我们把对象储存到了数据库中去,Hibernate 框架中确定是对这一块进行了封装,帮我们构造了 sql 语句;2 模拟步骤:(1)模拟 sql 语句的创建(2)直接通过 jdbc 猎取 connection(3)模拟 sql 语句参数的注入,重点关注如何通过反射得到实体类属性的返回值;(4)进行模拟测试细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 6 页 - - - - - - -
5、 - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -名师精编 优秀资料4. Hibernate 基本配置 (重点)1 配置 hibernate.cfg.xml: hbm2ddl.autoavalidate: 加载 hibernate时验证数据库表结构,例照实体类某个属性的类型和表里列的类型不一样时,加载Hibernate会报错;或者实体类的属性个数比表里的列数多一个也会报错;b create: 每次加载 hibernate 重新创建表结构,数据会丢失c create-drop:加载 hibernate 创建表, session 关闭时删除表结构d u
6、pdate: 加载 hibernate 时自动更新数据库表结构2 配置 hibernate 日志环境 (明白)i. hibernate4 采纳的 SLF4JSimple Logging Fa.ade for Java, 已集成到框架里ii. hibernate3 需要手动添加日志 jia 包3 hibernate.cfg.xml:show_sql、format_sql4 注解和 xml 文件具体1 表名和类名不一样2 字段名和属性名一样,注解默认是 Basic,xml 形式参考文档3 字段名和属性名不一样,注解:在方法上加上 Column;xml:在 property中加上 column 属性
7、4) transient ,注解为 transient 的属性都不被长久化,参考 5.1.4.1 5 hibernate 基本数据类型,参考 docuemntation/manual/index.html/5.25. Hibernate 主键生成策略 (重点)常见的主键生成策略有 increment 、identity 、sequence、 uuid;具体参见 5.1.2.2.1 a increment :在内存中生成主键,每次增量为 1,不建议在集群中使用;b identity: 自动增长,适用于 DB2,Mysql,Sql server ,Sybase ;c sequence: 适用于 O
8、racle 、DB2;d uuid: 主键类型为 String, 通过算法生成 32 位的字符串,适用全部数据库;e native: 由 hibernate 依据数据库挑选 identity 、 sequence 保护主键;注解:GeneratedValuestrategy=GenerationType.AUTO ,strategy 属性指定生成策略;GenericGeneratorname=system-increment,strategy=increment 自定义主键SequenceGeneratorname=seq_gen,sequenceName=seq_teacher,initia
9、lValue=1,allocationSize=1指定序列的属性XML: xml 文件中这样使用: xml 指定序列的名字 seq_student 留意各个主键生成策略的特点及使用范畴 Uuid 注解: GenericGeneratorname=idGenerator,strategy=uuid GeneratedValuegenerator=idGenerator sequence 名字,请参考当使用 sequence 时,数据库生成同一个sequence;需要自定义5.1.2.2 细心整理归纳 精选学习资料 Hibernate 常用类介绍与对象三种状态(重点) 第 2 页,共 6 页 1C
10、onfiguration.configure,默 认 读 取hibernate.cfg.xml,可 以 重 载configure方法,如 configure“ hibernate_.cfg.xml” 2SessionFactory.openSession与SessionFactory.getCurrentSession,openSession重新开一个session,getCurrentSession为 如 果 上 下 文 中 有session , 就 用 原 来 的session, 否就就新建一个session3对象的三种状态:Transient(瞬态), Persisent长久态 , De
11、tached (游离态),参考 11.11.Transient:使用构造方法构造出来的对象,没有和hibernate session - - - - - - - - - - - - - - - - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -名师精编 优秀资料关联45 6 72.Persisent:在数据库中存在记录,在session范畴内3.Detached :已被长久化,但session关闭 , 不在 session范畴内,有id三种状态如何区分1.有没有主键id, 没有主键id就是Transient状态没有和hib
12、ernate session关联2.有主键 id ,在 session缓存中也有就是Persisent状态有 id3.有主键 id ,在 session缓存中没有就是Detached 状态save 方法,参考hibernate APIdelete方法,参考hibernate APIload 与 get 方法,参考文档11.2 及 API1.load 方法加载指定id 对应的实体 ,当猎取实体的某个属性时才发出sql语句;猎取实体的属性必需在commit 方法之前,由于猎取的实体是放在 session缓存中的2.get 方法依据指定查询对应的实体3.load 与 get 的异同点a均是先从缓存中
13、开头查找,假如没有再去数据库中查询bload 方法是在猎取对象的某个属性时才发动身出sql 语句,get 方法是在调用 get 方法时就发出sql 语句c假如使用 load ()方法,必需在commit ()方法之前d如 果 查 询 一 条id不 存 在 的 记 录 , load( ) 方 法 报org.hibernate.ObjectNotFoundException, get( ) 方 法 报java.lang.NullPointerException8update 9) SaveOrUpdate 方法6. Hibernate 数据库连接池配置 (重点把握怎么配置)1 数据库连接池的说明参
14、考我画的连接池结构图2Hibernate可使用的数据库连接池C3P0、Proxool 、 JNDI, 重点把握 C3P0,其余只做明白3 C3P0的配置a 添加 C3P0所需的 jar 包b 注释掉 hibernate.cfg.xml 的 connection.pool_size 属性c 在 hibernate.cfg.xml 中添加 C3P0配置,参考文档 3.3 ,其余保持不变7. Hibernate 关系映射 (重点)1 一对一( one-to-one )a 单向( unidirectional)i. b 双向( bidirectional)i. 在 另 外 一 方 加 上 细心整理归纳
15、 精选学习资料 2多对一( many-to-one ) 第 3 页,共 6 页 3a单向( unidirectional)1.在多的一方加上many-to-one name= ” ” column=” ”b双向( bidirectional)1.参考帮忙文档8.4.1一对多( one-to-many )a单向( unidirectional) - - - - - - - - - - - - - - - - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -名师精编 优秀资料1. 在一的一方加上 b 双向( bidirectio
16、nal)i. 同多对一的双向关联4 多对多( many-to-many )a 单向( unidirectional)1. 具体参考文档 8.4.3b 双向( bidirectional1. 参考文档 8.5.38. Hibernate 关系映射的增删改查( CRUD)(重点)a. 新增1. 单向多对一1. 设置对象之间的关系,储存两个对象;2. 设置对象之间的关系,在多的一方添加级联,储存从表对象;2. 双向多对一1. 设置对象之间的关系,在多的一方添加级联,储存全部从表对象;2. 设置对象(双向)之间的关系,在一的一方设置级联,储存主表对象;b. 查询1. 单向多对一1. 查询多的一方,默认
17、也把一的一方查出来了;2. 设置多的一方的 lazy 为 false ,就不会查出一的一方的数据;3. 查询一的一方,不会把多的一方的数据查出来;2. 双向多对一1. 设置多的一方的 fetch 为 true ,可查出的多的一方的数据;3. xmlfetch=select: 简洁查询(单表)fetch=join: 连接查询cascade:all/save-update c.修改 第 4 页,共 6 页 - - - - - - - - - 1.在同一事物内,可直接修改长久态对象的属性,不用储存;2.在不同事物内,由长久态到游离态,级联更新;d.删除1.删除一条不存在的记录需要做判定2.级联删除1
18、.解除关系2.hql 语句9. HQLHibernate Query Languagea.Hibernate举荐的查询方法,是一种面对对象的查询方法;b.from 语句c.关联查询d.selecte.条件查询f.insertg.deleteh.updatei.怎样执行 hql 语句:1.session.createQuery.list细心整理归纳 精选学习资料 - - - - - - - - - - - - - - -名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -2.名师精编优秀资料session.createQuery.iterate3. sessio
19、n.executeUpate; 请参考文档 16 章 10. Criteria Queries 1 查询全部Criteria crit = sess.createCriteriaCat.class; crit.setMaxResults50; List cats = crit.list; 2 条件查询 List cats = sess.createCriteriaCat.class .add Restrictions.likename, Fritz% .add Restrictions.betweenweight, minWeight, maxWeight .list; 关于条件参考:Rest
20、rictions 里的方法 3 分页查询(请参考文档 11.4 及 17)Query q = sess.createQueryfrom DomesticCat cat; q.setFirstResult20; q.setMaxResults10; List cats = q.list; 4 参数绑定 / /named parameter preferred Query q = sess.createQueryfrom DomesticCat cat where cat.name = :name; q.setStringname, Fritz; Iterator cats = q.iterate
21、; /positional parameter Query q = sess.createQueryfrom DomesticCat cat where cat.name = .; q.setString0, Izi; Iterator cats = q.iterate; /named parameter list List names = new ArrayList; names.addIzi; names.addFritz; Query q = sess.createQueryfrom DomesticCat cat where cat.name in :namesList; q.setP
22、arameterListnamesList, names; List cats = q.list; 11.Hibernate 一级缓存、二级缓存、查询缓存 第 5 页,共 6 页 a.一级缓存: session级别的缓存b.二级缓存 SessionFactory级别的缓存细心整理归纳 精选学习资料 1.将 hibernate发行包 liboptionalehcache下的包拷贝到工程里2.在 hibernate.cfg.xml中打开二级缓存 - - - - - - - - - - - - - - - - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - -
23、 - - - - - - -1.名师精编优秀资料属性注释掉 2.添加true3.org.hibernate.cache.ehcache.EhCacheRegionFactoryc.1.4.在要缓存的类上添加Cache 注解,或在class节点下添加cache 节点5.测试查询缓存开启查询缓存1.true2.setCacheabletrue添加缓存结果集3.与 session无关,缓存的是一般属性,对于对象只缓存id ,query.list不使用查询缓存;引入 C3P0数据库连接池之后报错:Disabling contextual LOB creation as createClob method threw error : java.lang.reflect.InvocationTargetException 可在 hibernate.cfg.xml 中加上 false细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 6 页 - - - - - - - - -