收藏 分享(赏)

hibernate知识点详解_王成敏.doc

上传人:HR专家 文档编号:6048982 上传时间:2019-03-25 格式:DOC 页数:67 大小:1.48MB
下载 相关 举报
hibernate知识点详解_王成敏.doc_第1页
第1页 / 共67页
hibernate知识点详解_王成敏.doc_第2页
第2页 / 共67页
hibernate知识点详解_王成敏.doc_第3页
第3页 / 共67页
hibernate知识点详解_王成敏.doc_第4页
第4页 / 共67页
hibernate知识点详解_王成敏.doc_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、1 框架介绍2 回顾2.1 JDBC2.2 DBUtils3 ORM 框架 hibernate 就是一个 ORM 框架4 hibernate 介绍 版本:hibernate-distribution-3.6.10.Final-dist4.1 分析4.2 什么是 hibernate Hibernate 是轻量级 JavaEE 应用的持久层解决方案,是一个关系数据库 ORM 框架轻量级:使用 hibernate 较少的依赖 hibernate 框架,只使用少量的 api 进行操作。 Hibernate 提供了对关系型数据库 增删改查操作 流行数据库框架1 JPA Java Persistence

2、API.JPA 通过 JDK 5.0 注解或 XML 描述对象关系表的映射关系(只有接口规范)sun 对 ORM 框架推出一个规范(接口,没有实现) ,hibernate 支持 jpa2 Hibernate 最流行 ORM 框架,通过对象-关系映射配置,可以完全脱离底层 SQL3 MyBatis 本是 apache 的一个开源项目 iBatis,支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架4 Apache DBUtils 、Spring JDBCTemplate4.3 优点5 hello world(重要)5.1 编写流程 导入 jar 包 核心配置文件:hibernate.cf

3、g.xml java 对象:javabean 映射文件:*.hbm.xml需要将 hbm.xml 映射文件 添加到核心配置 hibernate.cfg.xml 中 操作 api,进行添加操作:save5.2 导入 jar 包5.3 核心配置文件 位置:src 名称:hibernate.cfg.xml 约束: 正文内容com.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/h_day01root1234org.hibernate.dialect.MySQL5Dialectupdate5.4 java 对象:JavaBeanpackage cn.itcast

4、.a_hello;public class Book private Integer bid; /注意:类型必须是整形private String title;private String author;5.5 映射文件 位置:和 javabean 同包 名称:Book.hbm.xml 约束: 正文内容: 注意:将映射文件 添加到 核心配置文件(hibernate.cfg.xml)中5.6 操作 apiTestpublic void demo01()Book book = new Book(); /注意:必须要手动bid的值book.setTitle(“宝典“);book.setAuthor(

5、“关系“ );/1 加载核心配置文件Configuration config = new Configuration().configure();/2 获得sessionFactory,相当于连接池SessionFactory factory = config.buildSessionFactory();/3 获得session ,相当于jdbc 连接Session session = factory.openSession();/4开启事务Transaction transaction = session.beginTransaction();/ 操作:添加session.save(book

6、);/5 提交或回滚 commit() | rollback()mit();/6 释放资源session.close();factory.close();6 整合日志 log4j 6.1 java 项目提示 日志没有生效6.2 日志框架介绍6.3 整合 log4j log4j 核心 jar 过滤 jar log4j 核心配置文件注意:只需要添加文件,不需要读懂内容,之后讲解。7 CURD 操作7.1 添加Testpublic void demo01()/添加 Book book = new Book(); /注意:必须要手动bid的值book.setTitle(“宝典“);book.setAu

7、thor(“关系“ );/1 加载核心配置文件Configuration config = new Configuration().configure();/2 获得sessionFactory,相当于连接池SessionFactory factory = config.buildSessionFactory();/3 获得session ,相当于jdbc 连接Session session = factory.openSession();/4开启事务Transaction transaction = session.beginTransaction();/ 操作:添加session.save

8、(book);/5 提交或回滚 commit() | rollback()mit();/6 释放资源session.close();factory.close();7.2 更新Test public void demo02()/更新 bid=3 title=葵花Book book = new Book();book.setBid(3);book.setTitle(“葵花“);Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Se

9、ssion session = factory.openSession();Transaction transaction = session.beginTransaction();/操作session.update(book); /通过id更新所有的数据,如果没有设置值,将更新默认值mit();session.close();factory.close();7.3 删除Test public void demo03()/ 删除 bid=2 Book book = new Book();book.setBid(2);Configuration config = new Configuratio

10、n().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Transaction transaction = session.beginTransaction();/删除 ,通过id删除session.delete(book);mit();session.close();factory.close();7.4 通过 id 查询Test public void demo04()/ 通过 bid=4Integer bid = 4;Conf

11、iguration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Transaction transaction = session.beginTransaction();/通过id查询Book book = (Book)session.get(Book.class, bid);System.out.println(book);mit();session.close();f

12、actory.close();7.5 查询所有Test public void demo05()/ 查询所有Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Transaction transaction = session.beginTransaction();/需要hibernate提供hql语句进行查询/ * hql : hibernate q

13、uery language 查询语言,面向对象的查询语言,类似与sql语句。/ * sql语句查询所有:select * from t_book -sql语句使用的表/ * hql语句查询所有:from Book -hql语句使用的对象Query query = session.createQuery(“from Book“);List allBook = query.list();for (Book book : allBook) System.out.println(book);mit();session.close();factory.close();7.6 分页查询Test publi

14、c void demo06()/分页查询/ * sql语句分页:select * from t_book limit ?,?/ * 开始索引: startIndex,从0开始 。算法:startIndex = (pageNum - 1) * pageSize/ * 每页显示个数: pageSizeConfiguration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Tr

15、ansaction transaction = session.beginTransaction();/分页,在查询所有基础上Query query = session.createQuery(“from Book“);/ # 第一页/ * 设置开始索引/query.setFirstResult(0);/ * 设置每页显示个数/query.setMaxResults(2);/ # 第二页/ * 设置开始索引query.setFirstResult(2); / (2 - 1) * 2/ * 设置每页显示个数query.setMaxResults(2);List allBook = query.l

16、ist();for (Book book : allBook) System.out.println(book);mit();session.close();factory.close();8 api 详解8.1 体系结构vo:value object ,值对象,使用在 web 层,用于显示数据。bo:business object,业务对象,使用在 service 层,根据不同页面封装对象,可能包含多个 PO。po:persistent object,持久对象,与数据库进行数据交互的。一般情况使用 javabean 将三个对象统一。8.2 Configuration 对象8.2.1 构造 用

17、于加载 src 下的 hibernate.properties 文件,此文件为 hibernate 老版本中的核心配置文件,但现在已经不使用。内容:properties 中 key =value 方式例如:hibernate.connection.driver_class = com.mysql.jdbc.Driver hibernate 提供参考文件%hiberante%/project/etc/hibernate.properties8.2.2 方法 核心配置文件,加载的 src 下, hibernate.cfg.xmlconfigure(“/资源文件路径“) , 加载指定目录下的资源文件

18、 映射文件hbm.xml 后缀固定的,必须与 javabean 同包。addResource(“xml 文件“) 加载指定位置的映射文件核心配置加载时,hibernate 将执行 addResource 加载配置的映射文件8.2.3 总结开发中,必须将 hbm.xml 配置到 hibernate.cfg.xml 文件中学习中,使用 addClass 加载执行类的 hbm.xml 文件,简化配置操作。8.3 SessionFactory 对象 SessionFactory 相当于连接池,可以提供操作数据的 Session 对象。 SessionFactory 是线程安全,及不同的线程都可以使用。

19、且可以保存,不同的线程获得 session 必须不同。8.3.1 获得方式SessionFactory factory = config.buildSessionFactory();8.3.2 方法/3.1 获得一个新的session , 每执行一次openSession() 将获得一个新的sessionSession session = factory.openSession();/3.2 获得当前线程中绑定的session,同一个线程共享一个session/ * 注意:默认情况下不能使用,必须进行配置(暂时不用)Session session2 = factory.getCurrentSe

20、ssion();8.3.3 工具类public class H3Utils / 获得SessionFactory。相当于连接池,只有一个private static SessionFactory factory;staticfactory = new Configuration().configure().buildSessionFactory();/* 获得一个新的session* return*/public static Session openSession()return factory.openSession();/* 获得线程中绑定的session* return*/public

21、 static Session getCurrentSession()return factory.getCurrentSession();8.4 Session 对象 相当于 JDBC 的连接 Connection ,用于操作 PO(持久)对象 session 线程不安全的,及不同的线程必须使用不同的 session。 常用方法:save:将指定 PO 保存数据库,底层将触发一条 insert 语句。persist 是 jpa 提供的保存对象的方法,与 save 等效的。update:通过 id 更新所有的数据,底层将触发一条 update 语句。saveOrUpdate:如果没有 id 值

22、,将执行 save 及 insert 语句。如果有 id 值,将执行 update 及 update 语句。delete : 通过 id 删除get : 通过 id 查询对象,立即查询,当执行 get 方法之后,马上触发 select 语句。如果没有查询到,返回nullload : 通过 id 查询对象,延迟查询,当执行 load 方法之后,不触发 select 语句,直到使用了查询对象的具体的数据时,才触发 select 语句。如果没有查询到,将抛异常。createQuery: 执行 HQL 语句createSQLQuery:执行 sql 语句createCriteria : hiberna

23、te 提供 QBC 语句。 (不研究)merge : 与 saveOrUpdate 非常相似,如果没有 id 值将执行 insert 语句如果有 id 值,将执行 select 语句,如果数据没有变化,将不触发任何语句。如果数据变化了,将触发 update 语句。8.5 事务 transaction 对象 开启事务:session.beginTransaction(); 提交事务:mit(); 回滚事务:transaction.rollback(); 获得当前事务:session.getTransaction();/开启session.beginTransaction();/获得当前事务并提交

24、session.getTransaction().commit();9 核心配置文件详解 位置:src 名称:hibernate.cfg.xml9.1 创建数据基本配置# MySQL#hibernate.dialect org.hibernate.dialect.MySQL5Dialect#hibernate.connection.driver_class com.mysql.jdbc.Driver#hibernate.connection.url jdbc:mysql:/localhost:3306/test#hibernate.connection.username gavin#hiber

25、nate.connection.password# Oracle#hibernate.dialect org.hibernate.dialect.Oracle8iDialect#hibernate.dialect org.hibernate.dialect.Oracle9iDialect#hibernate.dialect org.hibernate.dialect.Oracle10gDialect#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver#hibernate.connection.username or

26、a#hibernate.connection.password ora#hibernate.connection.url jdbc:oracle:thin:localhost:1521:orcl9.2 内容com.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/h_day01root1234org.hibernate.dialect.MySQL5Dialectupdatetruetruenone10 映射文件详解10.1 基本配置内容根标签* package 用于配置包。如果配置了包之后使用同包下面的类时,就可以只写类名,而不需要全限定名称。# 没有配置

27、 # 配置 用于配置 对象 和表 之间的关系的* name : 用于确定对象。默认使用的类的全限定名称* table : 数据库中的表名。一般建议:表都应该有前缀* catalog : 用于确定数据库的名称,默认使用hibernate.cfg.xml 配置url设置的数据库名称。例如:h_day01子标签 , 用于配置主键* name : 对象的字段名称* 用于配置主键生成策略用于配置 PO类的普通属性* name : 默认情况使用的是属性名称 (通过getter或setter方法获得)* column : 确定表中对应字段(列)名称。默认值name的值* length : 确定字段的长度。如

28、果 varchar 默认值255* type : 确定字段类型1 使用hibernate类型:type=“string“ 注意大小写2 使用java类型:type=“java.lang.String“3 使用sql 类型:例如:varchar* not-null 是否为null* unique 是否唯一注意:如果配置文件存在sql关键字,建议使用重音符修饰字段的名称托马斯穆勒10.2 主键生成策略主键生成策略,hibernate根据不同策略用于生成数据库的主键值的。#1 increment , hibernate 自己维护主键的增强。通过执行select max(id) from .查询最大值

29、,加1. 建议:一般不使用,存在线程并发访问问题#2 identity ,hibernate 将采用数据库底层的自动增强。例如:mysql auto_increment#3 sequence ,hibernate 将采用数据库底层的序列。例如:oracle 不支持自动增强,但支持序列#4 hilo,高低位算法,如果数据库不支持序列,也不支持自动增强,hibernate将采用算法机制。#5 native ,根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】* 以上5个策略 主键字段类型,必须是整形( long, short 或者 int )#6 uuid

30、 使用随机字符串 【】* 以上6个策略 代理主键( hibernate维护的)#7 assigned 自然主键(程序自己维护)【】11 持久对象唯一标记符:OID 数据库中的数据,根据主键的值不同进行区分。 java 对象,根据内存中地址不同进行分区。 PO 对象,根据对象的用于存放主键的字段的值进行区分。用于存放表中主键的 javabean 的字段称为:OID例如:user1 = new User(); user1.setUid(1);user2 = new User(); user2.setUid(1);user1 和 user2 两个 java 对象,但是一个 PO 对象(oid 相同)

31、12 持久对象状态12.1 分类 hibernate 规定三种状态瞬时态:transient,session 没有缓存,数据库没有数据。例如:new 对象OID 没有值持久态:persistent,session 缓存,数据库中最终会有数据。例如:save(obj)OID 有值脱管态:detached,session 没有缓存,但数据库中有数据。例如: new User() , user.setUid(1)OID 有值12.2 状态的转换 瞬时 持久:当执行 save() 或 saveOrUpdate() 将瞬时转换持久 脱管:手动设置 OID 持久 瞬时:执行 delete() 脱管:ses

32、sion.close() 关闭session.clear() 清空缓存session.evict(obj) 将执行的 PO 对象从 session 移除 脱管 持久:执行 update() 或 saveOrUpdate() 瞬时:手动删除 OID13 一级缓存13.1 介绍 Session 接口对象实现类,提供很多集合用于存放一个连接中的数据,此类集合将其称为:一级缓存。 一级缓存:session 级别的缓存,如果 session 销毁,一级缓存不存在了。 缓存:介于应用程序和数据库之间,一般情况存在内存中,如果内存有效将被持久化到硬盘中。缓存一般用于提高系统的性能。减少应用程序直接访问数据库

33、。 hibernate 执行的所有的查询数据,都将数据缓存在一级缓存中。13.2 存在Testpublic void demo02() /证明一级缓存的存在Session session = factory.openSession();session.beginTransaction();/ 1 通过oid查询 ,将触发select语句,进行查询,并将结果存放在一级缓存。Student student = (Student) session.get(Student.class, 1);System.out.println(student.getSname();/ 2 通过oid再查询,通过 O

34、ID从一级缓存获取,如果一级缓存有将直接使用。Student student2 = (Student) session.get(Student.class, 1);System.out.println(student2.getSname();session.getTransaction().commit();session.close();13.3 操作:清空缓存Testpublic void demo03() /证明一级缓存的存在Session session = factory.openSession();session.beginTransaction();/ 1 通过oid查询 ,存放

35、一级缓存(session)Student student = (Student) session.get(Student.class, 1); /持久态System.out.println(student.getSname();/ 2 将student从一级缓存移除session.evict(student); /student 为脱管态/ 3 通过oid再查询,默认从一级缓存获得,如果一级缓存没有将执行select语句Student student2 = (Student) session.get(Student.class, 1); /另一个持久System.out.println(stu

36、dent2.getSname();session.getTransaction().commit();session.close();13.4 快照 默认情况下,当执行 commit()提交,hibernate 将 一级缓存内容 与 快照的内容进行 对比* 如果一样,不进行任何操作* 如果不一样,将执行 update 语句,将一级缓存中的数据,同步到数据库中。# 快照为保证:一级缓存和数据库中的数据一致。Testpublic void demo04() / 快照:就是一个数据备份。快照不能修改Session session = factory.openSession();session.beg

37、inTransaction();/1 查询Student student = (Student) session.get(Student.class, 1);/2 通过setter修改student 的内容 , 一级缓存的数据被修改了student.setSname(“jack2“);session.getTransaction().commit();session.close(); 面试题:快照的刷新是否可以修改?可以修改,通过 FlushMode 进行修改修改刷新时机三个地方:session.createQuery() 查询、mit() 提交事务、session.flush() 手动刷新F

38、lushMode 是使用设置三种情况是否生效。manual,手动,执行 flush()才刷新commit,提交时,执行 flush() 或 commit() 进行刷新always,总是,三种情况都刷新auto:默认值,与 always 配置一样。14 关联关系映射14.1 介绍 开发中,需求阶段,通过业务的数据分析,生成 E-R 图(实体-关系图) 实体之间关系:3 种14.2 关联关系-一对多14.2.1实例 国家(1) - (*) 城市 老子(1) - (*) 儿女 客户(1) - (*) 订单14.2.2分析14.2.2.1 javabean 分析14.2.2.2 映射文件分析14.2.

39、3实现(多练)14.2.3.1 订单 Order 实现 javabeanpublic class Order private Integer xid;private String price;/多对一:多个订单 属于 【一个客户】private Customer customer; hbm.xml14.2.3.2 客户 Customer 实现 javabeanpublic class Customer private Integer cid;private String cname;/一对多:一个客户 拥有 【多个订单】- 确定容器Set (无序,不重复)private Set orderSe

40、t = new HashSet();/建议实例化 hbm.xml14.2.3.3 测试结果private SessionFactory factory = new Configuration().configure().addClass(Customer.class).addClass(Order.class).buildSessionFactory();Testpublic void demo01()/创建表Session session = factory.openSession();session.close();14.2.4操作14.2.4.1 保存客户Testpublic void

41、demo01()/ #1 : 只有客户,并保存 - 成功Session session = factory.openSession();session.beginTransaction();Customer customer = new Customer();customer.setCname(“jack“);session.save(customer);session.getTransaction().commit();session.close();14.2.4.2 保存订单Testpublic void demo02()/ #2 : 只有订单,并保存 - 成功,但订单外键值为 nullS

42、ession session = factory.openSession();session.beginTransaction();Order order = new Order();order.setPrice(“123“);session.save(order);session.getTransaction().commit();session.close();14.2.4.3 客户关联订单,保存客户Testpublic void demo03()/ #3 : 提供客户和订单,客户关联订单,仅保存客户 - 异常,持久态Customer 引用 瞬时态orderSession session

43、= factory.openSession();session.beginTransaction();/1 客户Customer customer = new Customer();customer.setCname(“rose“);/ 订单Order order = new Order();order.setPrice(“100“);/2 客户管理订单 (将订单添加到客户对象 订单集合中)customer.getOrderSet().add(order); /2 客户管理订单,将触发一条update语句,更新订单的外键信息/3 仅保存客户session.save(customer); /1

44、将触发一条insert语句,customer转换持久态session.getTransaction().commit();session.close();Testpublic void demo031()/ #31 : 提供客户和订单,客户关联订单,仅保存客户 - 异常,持久态Customer 引用 瞬时态order/ * 方案1:将瞬时的Order 转换 持久态 - save(order)Session session = factory.openSession();session.beginTransaction();/1 客户Customer customer = new Custome

45、r();customer.setCname(“rose“);/ 订单Order order = new Order();order.setPrice(“100“);/2 客户管理订单 (将订单添加到客户对象 订单集合中)customer.getOrderSet().add(order);/3 仅保存客户session.save(customer);session.save(order);session.getTransaction().commit();session.close();14.3 级联 cascade 操作 一个对象 A 关联另一个对象 B,当对 A 进行操作时,一并对 B 进行

46、操作。 需要 hbm.xml 映射文件 在关联配置中使用 cascade 属性进行设置客户关联订单 , 订单关联客户, 取值:save-update : 级联保存或更新。在保存客户时,关联瞬时态的订单,将执行级联保存操作,去保存订单。delete : 级联删除。当一个持久态客户,执行 delete()进行删除了,一并将关联的所有订单进行删除。delete-orphan :孤儿删除。当客户解除了订单之间关系,将删除订单。解除关系就是将外键值更新 nullall : save-update 和 delete 合并all-delete-orphan : save-update /delete / delete-orphan 合并none : 不级联(默认)14.3.1级联保存或更新 配置客户映射 Customer.hbm.xml 测试:Testpublic void demo032()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报