资源描述
程序设计实用技术 - Hibernate 目标: 深入理解持久层框架 掌握 Hibernate配置方法、开发流程 掌握 Hiberate性能优化 学习对象: 具备一定 Java编程能力的初级程序员 。 预备知识: 了解数据库的基本概念 熟悉常用 SQL语言,具备一定的 Java编 程能力 课程内容: 持久层和 ORM Hibernate基础 Hibernate性能优化 程序设计实用技术 JAVA方向 第一讲 持久层和 ORM 章节目标: 理解持久层和 ORM 持久层概述: 什么是 持久化 ? 什么是 持久层 ? “ 持久化 ” 与 “ 持久层 ” 之间的 关系 ? 持久层概述: 什么是持久化? 将数据保存到物理的储存器(硬盘、磁带 等)上的过程叫持久化。 什么是持久层? 专门负责处理与物理数据相关操作(持久化 数据,以供日后使用)的独立层次。 之间的关系? 持久化是动词,表示将内存中的数据存储到 数据库或其他媒介。 持久层是名词,实现数据持久化的一个相对 独立的领域(层)。 消费者 /前 端 仓库 /数据库系统 消费者 /前 端 仓库 /数据库系统 商场 /业务类 消费者 /前 端 仓库 /数据库系统 超市 /业务类 物流公司 /持久层 现实模型与持久层 ? Application上层应用层 Transaction Layer 事务层 Data Access Logic 数据访问逻辑 Persistence Layer 持久层 Database 数据层 持久层逻辑边界 ? View Control Model JSP Action 持久层 Database 业务逻辑 持久层在 MVC中: 持久层解决了 MVC什么问题? 当发生以下三种情况: ( 1)表示层发生变化 ( 2)业务逻辑层发生变化 ( 3)底层数据格式或持久化机制发生变化 数据 持久化代码 不需要重新编译 为什么可以达到上述目标?是什么来的? 解耦合 持久层概述: 什么是解耦合? 采用某种方法将紧密耦合的关 系转换为松散耦合的关系的过程 什么是耦合度? 两个事物之间的耦合程度 什么是耦合度适中? 事物之间的耦合度符合实际情况 或要求 紧耦合 耦合适中 太松耦合 持久层概述: 现实中还有哪些解耦合的实例? 电脑 ,各个组件(显示器、 CPU、硬盘、内存)之间 相互独立,组合在一起又能一起工作,连接它们的是 共同实现的标准接口;(思考集成显卡、网卡?) 电脑上的 USB接口与原来的串口之间存在耦合度区别; 建筑中的砖混结构、框架结构; 社会上各行各业的产生,也是一种解耦合的过程。发 电厂的建立,使工厂不必为了开动机器去发电; 工程化也可以说就是一个解耦合的过程 。 现实中的解耦合的实例: 持久层概述: 软件设计中解耦合的自然进化 实例:记录论坛用户登录次数 public boolean addLoginCount(String id,int count) Connection conn = null; Statement stmt = null; try Class.forName(“oracle.jdbc.driver.OracleDriver”); conn = DriverManager.getConnection( “ jdbc:orcle:thin:dbServer:1521:forum”, “ MyUserName”, “ MyPassword”); String sqlStr = “update BBSUser set loginCount=loginCount+1” + “ where id=”+id+”; stmt = conn.createStatement(); return stmt.execute(sqlStr); catch(ClassNotFoundException e) e.printStackTrace(); public boolean addLoginCount(String id,int count) Connection conn = null; Statement stmt = null; try Class.forName(Config.getValue(“JDBC_DRIVER”); conn = DriverManager.getConnection( Config.getValue(“DB_URL”), Config.getValue(“DB_USER”), Config.getValue(“DB_PWD”); String sqlStr = “update BBSUser set loginCount=loginCount+1” + “ where id=”+id+”; stmt = conn.createStatement(); return stmt.execute(sqlStr); catch(ClassNotFoundException e) e.printStackTrace(); 实例:记录论坛用户登录次数 从编写代码的角度看他们的优点: ()第一段代码很容易掌握,容易理 解,直截了当,可以很好的执行。 ()第二段代码要引入一个外部文件, 用来保存数据库连接信息,不大容易实现, 但也比较好理解,也可以很好的执行。 从耦合度的角度看,比较其优缺点? 如数据库密码泄露,管理员要修改数据库 密码 : 第一段代码: ()找到所有的与数据库连接相关的代码,修 改密码; ()重新编译修改后的文件; ()重新部署软件。 第二段代码: ()修改外部文件中配置的密码; ()不需要重新编译; ()不需要重新部署软件。 进一步改进的方法? Connection conn = DBHelper.getConnection(); 再进一步改进的方法? ? 软件设计中解耦合的目标 为什么要解耦合? 从 MVC理解软件设计中的解耦合 软件系统解耦合的目标: 数据访问 操作系统 数据库系统 应用系统 应用逻辑 应用程序层内部解耦合? 业务逻辑与数据访问逻辑分离 应用程序与资源层解耦合? 应用层逻辑与底层数据库、操作系统结构分离 程序设计实用技术 JAVA方向 第二讲 DAO模式解耦合 解耦合实例 : DAO模式 示例:银行转帐 现有 账户 A 账户 B 转帐金额 amount 由账户 A转给账户 B。 编写一个方法,实现转帐。 public boolean zhuanzhang(String user1,String user2,int amount) Connection conn = DBHelper.getConnection(); /获得数据库连接 PrearedStatement stmt = conn.prepareStatement( “ select * from user where username=?”); stmt.setString(1,user1); ResultSet user1_Set = stmt.executeQuery(); if (user1_Set.next() /检查 账户 A 余额是否够转帐 , 够则减掉要转帐的金额 if (user1_Set.getInt(“amount”)=amount) PrearedStatement stmt = conn.prepareStatement( “ update user set amount = amount-“ stmt.executeUpdate(); else return false; /余额不足 else return false; /找不到 账户 A /将 账户 B 加上转帐金额 PrearedStatement stmt = conn.prepareStatement( “ update user set amount=amount+” stmt.setString(1,user2); stmt.executeUpdate(); return true; 示例:银行转帐 上例实现了三个操作: ()检查账户 A的余额是否够转帐; ()在账户 A中减掉要转帐的金额; ()在账户 B中加上要转帐的金额。 最后 DAO模式下的代码: public boolean zhuanzhang(String user1,String user2,int amount) User userA = UserProxy.getUser(user1); /分离数据访问逻辑 User userB = UserProxy.getUser(user2); return userA. accord(userB , amount); Factory模式 Proxy模式 DAO模式: Data Accessor Object(数据访问对象 DAO) Data 数据 Data Accessor 数据访问器 Domain Object 领域对象 (数据抽象 ) DAO模式分解 DAO模式解耦合的目标: Application 应用逻辑 Data Accessor 数据访问抽象 Domain Object业务对象 Database Accessor Abstract 数据访问接口 Database Accessor Imp 数据访问实现 DAO模式实现的层次 数据存储逻辑与业务逻辑分离 数据存储逻辑与数据底层实现 分离 ( 资源层解耦合 ) 封装业务对象 Database 在 DAO模式中引入 Factory模式: 如何理解 Factory工厂模式 ? 根据给定的模具( 类名称 ), 从仓库里取出相应原料( 类代码 ), 加工成产品( 类实现或对象 )。 Factory模式: Factory模式: UserDAO userDAO = DAOFactory.getDAO(UserDAO.class); User userA = userDAO.getUser(User1); Factory在 DAO的作用? 根据需要加载相应的实现,具体点说就是: 给定 UserDAO.class类名,产生 UserDAO类实现。 之前的实现 完成银行转帐: public boolean zhuanzhang(String user1,String user2,int amount) UserDAO userDAO = DAOFactory.getDAO(UserDAO.class); User userA = UserDAO.getUser(user1); User userB = UserDAO.getUser(user2); return userA. accord(userB,amount); 最终版本 现实生活中的 Proxy代理? 软件开发中的 Proxy代理? 在 DAO模式中引入 Proxy模式 在 DAO模式中引入 Proxy模式 public class UserProxy public static User getUser(String userid) UserDAO userDAO = (UserDAO)DAOFactory.getDAO(UserDAO.class); return userDAO.getUser(userid); public static void sava(User user) UserDAO userDAO = (UserDAO)DAOFactory.getDAO(UserDAO.class); userDAO.save(user); 最终版本 为什么要引入 Proxy? 、使得代码看起来更整洁 、为附加其他功能留接口 、? 为什么要引入 Proxy? 思考类比房屋建筑中的代理层? 最终版本 DAO模式总结: Client DAOFactory UserDAO UserObject UserProxy UserData/Table DBHelper 应用层 数据访问层 数据层 对象 /关系映射 DAO模式总结: 对象 描述 Client 业务逻辑,相对与数据库层来说是客户 UserProxy 执行代理,执行业务逻辑需要的针对数据库的操作 DAOFactory DAO工厂,根据配置文件产生 DAO对象类 UserDAO DAO对象,使用 DBHelper连接数据库,加载数据 /实例 化 DAO DBHelper 连接数据库帮助类,使用配置文件连接数据库 UserObject 数据封装类,具有属性和 get/set方法,对表 /关系数 据进行封装 UserDate/Table 数据库表,表记录是 UserObject的属性,实例化 UserObject DAO模式总结: Client Object/业务逻辑 DAOProxy/代理 DAOFactory/DAO工厂 Implementation/DAO实现 DAOConfiguration 调用服务方法 获得服务实现接口 获得 DAO配置 获得 DAO/服务实现 执 行 方 法 返回结果 ( 1) interface接口,在实现解耦合中的作用? ( 2) Java Class动态加栽? ( 3) XML配置文件? 回顾与 DAO相关的知识: 提升持久层性能 软件系统中有哪些性能指标? 提升持久层性能: 数据库容量 执行某次业务的时间 同时并发访问数 等等 软件系统中有哪些性能指标? 系统性能低下有哪些原因? 提升持久层性能: 硬件环境、网络环境差 软件配置环境低(操作系统、数据库 系统)达不到系统使用要求 设计本身存在缺陷 系统性能低下有哪些原因? 设计本身存在缺陷,主要表现在: 、算法不科学合理 、资源的管理和调配失当 哪一个是最主要因素? 提升持久层性能: 从前有一个钢铁工厂,有个车间,每个车间的 生产效率都很高(工人技能高、生产管理科学、设备 先进); 每个车间都设立有自己的原料采购车队,以保障生产 所需的原料。 (存在的问题?如何解决?) 提升持久层性能: 从前有一个 DAO模式的系统,有个子过程,每 个子过程的执行效率都很高(代码非常简练,并经过 代码优化); 每个子过程都包含有自己的数据库连接,以保障有效 的数据存取。 (存在的问题?如何解决?) 提升持久层性能: 问题出现的前提: “ 大量 ” 提升持久层性能: 市场对钢铁的需求 “ 大量 ” 增 长 用户同时登陆的数量 “ 大量 ” 增 长 会出现什么大问题? 提升持久层性能: 措施: Connection Pool 数据库连接池 请求获得连接 数据库连接池 判断是否 有 有 没有 创建一个连接 移除返回连接 提升持久层性能: Connection Pool 数据库连接池 请求返回连接 数据库连接池 判断是否满 满 不满 加入到池中 关闭连接 提升持久层性能: 数据库连接池技术带来的优势? ( 1)资源重用 ( 2)更快的响应速度 ( 3)控制资源分配 ( 4)避免连接泄露 提升持久层性能: 措施:缓存 计算机领域的缓存有哪些? 缓存什么东西?为什么要缓存?缓存 到什么地方? 软件系统中的缓存主要缓存什么? 提升持久层性能总结回顾: 、数据库连接池引入的原因? 提升系统性能。 、数据库连接池与持久层的关系? 持久层负责数据访问。 数据库连接池负责统一管理和调 度数据库连接。 有了数据库连接才能访问数据。 提升持久层性能: 理解持久层、 DAO、数据库连接池这些 概念的目的是什么? 是: 对现有持久层来历和发展方向有深入的理解,为 应用开发打下理论基础。 不是: 使用这些理论知识实现软件项目中的持久层。 因为: 不必为了吃面包,就要去种小麦。无论是商业领 域还是开源社区,都为我们提供了丰富的、久经 考验的持久层组件,比如 Hibernate。 程序设计实用技术 JAVA方向 第三讲 Hibernate基础开发 回顾 现有持久层框架: Hibernate Apache OJB Cayenne Jaxor iBatis jRelationFramework mirage SMYLE TopLink( oracle,非 开 源 产 品) Hibernate是什么 : 持久层框架? ORM映射理论? 提供强大、高性能的对象到关系型数据库持久化服务 的框架产品(开源) Hibernate的起源 : Hibernate的设计者: Gavin King 2001年末,正式发布第一个版本 2003年中,发布 Hibernate2 2003年末, Hibernate被开源组织 JBoss收纳 2005年初,发布 Hibernate3 为什么如此快速的成功 : 快速发布、即时响应 全面的回归测试 避免过渡设计 集权 文档 避免标准化 5分钟内成功运行 Hibernate 开发人员的责任感 快速起步 快速起步准备工作 : 下载: Hibernate Hibernate-Extension Middlegen-Hibernate JUnit Mysql 准备开发工具: Eclipse MyEclipse4 准备数据库环境: Mysql/Oracle Hibernate配置 : Hibernate日志 : 第一程序 : 代码解释 : ()初始化 Hibernate配置管理类: Configuration。 ()通过 Configuration类实例创建 Session的工厂类: SessionFactory。 ()通过 SessionFactory得到: Session。 图释 : Hibernate hibernate.hbm.xml SessionFactory Session Database Configuration 理解 : Hibernate完成了什么配置工作 ? 如何完成的 ? Hibernate在数据操作中起到了什么作用 ? 如何做的 ? 基础语法 Configuration SessionFactory Session hibernate.hbm.xml hibernate.properties (myHibernate.hbm.xml) Session.save(user) Session.close() User.hbm.xml H I B E R N A T E 基础语法 : Configuration类 负责管理 Hibernate的配置信息 Configuration config = new Configuration().configure(); File file = new File(“D:oramyHibernate.hbm.xml”); Configuration config = new Configuration().configure(file); 基础语法 : SessionFactory类 负责创建 Session实例 。 是线程安全的 , 可并发同时访问 。 Configuration config = new Configuration().configure(); SessionFactory factory = config.buildSessionFactory(); 基础语法 : SessionFactory类 SessionFactory实例是 Configuration实 例 config根据当前的配置信息构造的 。 多个数据库就有多个 config实例,并构 造不同的 SessionFactory。 SessionFactory中保存着数据库配置的 所有映射关系,也维护缓存等,消耗巨大, 应重点考虑重用策略。 基础语法 : Session类 持久化操作的基础 Configuration config = new Configuration().configure(); SessionFactory factory = config.buildSessionFactory(); Session session = factory.openSession(); 基础语法 : Hibernate Session与 HttpSession的区别 ? 基础语法 : Session数据持久化方法: Save Get/Load flush Delete Query、 Criteria 基础配置 基础配置 : Hibernate基础配置 主要针对 SessionFactory展开 Hibernate内部配置 与应用服务器(或容器)的相关配置 基础配置 : Hibernate配置方法 主要针对 SessionFactory展开 使用配置文件 ( hibernate.hbm.xml/hibernate.propert ies) ,在 Hibernate启动时加栽配置属性。 使用 Configuration类在程序中,指定 配置属性。 基础配置 : Hibernate配置属性分类: 数据库连接 数据库连接池 事务属性 对象 /关系映射文件 其他属性 Hibernate O/R Mapping Hibernate O/R Mapping? Hibernate O/R Mapper? 基本数据类型映射 : Java数据类型 数据库字段类型 O/R映射定义 Hibernate类型转换 基本实体映射 : Java对象与数据库表关系之间的映射: 类名 表名 主键映射 字段 属性 基本数据类型映射 : Java对象 /POJO 数据库表关系 O/R映射定义 Hibernate数据交换 基本实体映射 : Id int (pk) Name varchar(20) sex varchar(4) group_id int (fk) 学生表 Id int (pk) Code varchar(50) createTime time 学生证表 private int id; private String name; private String sex; private int group; Card card; Student private int id; private String code; private time createtime Student student; Card 自定义数据类型 映射 : Hibernate自定义数据类型,接口: UserType CompositeUserType 将数据库中复杂的数据格式转换成业务层 易于操作的类型对象 复合主键 映射 : 注意:有驳于业务逻辑和数据逻辑分离的原则 复合主键类: 基于实体类属性的复合主键 基于主键类的复合主键 需要实现: Serializable接口及 equals、 hashCode方法 Blob、 Clob字段映射: 不同的数据库对应的大对象类型不同 实体映射策略 : Component组件映射 继承映射 Component组件映射 : id int firstName vchar(20) lastName vchar(20) sex int age int homeAdd vchar(100) officeAdd vchar(100) telZone vchar(4) telPhone vchar(11) telPerson vchar(4) Name对象 Tel对象 通过将复杂的表字段分类,实现面向对象的领域划分,使 系统逻辑更加清晰。 继承映射 : 学生表 id 姓名 性别 年龄 班级 老师表 id 姓名 性别 年龄 职务 Person类 Student类 Teacher类 继承映射 : 用户表 id 姓名 性别 年龄 班级 学生表 id Person类 Student类 Teacher类 老师表 id 职务 继承映射 : 用户表 id 姓名 性别 年龄 班级 用户类别 Person类 Student类 Teacher类 职务 级联关系 关系映射类别 : 一对一关联 /one-to-one 一对多关联 /one-to-many 多对一关联 /many-to-one 多对多关联 /many-to-many ORM(对象 /关系映射),不但包括对单独的数据库表和对象 的映射,还包括对表之间的关联的影射。 一对一关联 : 主键关联 Id int (pk) Name varchar(20) sex varchar(4) group_id int (fk) 学生表 Id int (pk) Code varchar(50) createTime time 学生证表 private int id; private String name; private String sex; private int group; Card card; Student private int id; private String code; private time createtime Student student; Card 一对一关联 : 外键关联 Id int (pk) Name varchar(20) sex varchar(4) group_id int (fk) 学生表 Id int (pk) name varchar(50) 组表 private int id; private String name; private String sex; private Group group; Student private int id; private String name; Group Student.hbm.xml Group.hbm.xml 一对多关联 : Id int (pk) Name varchar(20) sex varchar(4) group_id int (fk) 学生表 Id int (pk) address varchar(50) zipcode varchar(6) userid int 地址表 private int id; private String name; private String sex; private Group group; private Set address; Student private int id; private String address; private String zipcode; private int userid; private Student student; Address Student.hbm.xml Address.hbm.xml 多对多关联 : Id int (pk) role varchar(20) 角色表 Id int (pk) group varchar(20) 组 (岗位 )表 private int id; private String role; private Set groups; Role private int id; private String group; private Set roles; Group Role.hbm.xml Group.hbm.xml Role_id Group_id 角色 _组表
展开阅读全文