周甫(zoofchow@hotmail.com) 持久层设计技术(一) Hibernate(1) 快速入门 周甫(zoofchow@hotmail.com)

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

第 9 章 测试部署  9.1 测试  9.2 部署. 9.1 测试  应用测试:使用 JUnit 单元测试框架 测试的目的是检验开发结果是否满足规定需求,测试是保证软件质量的一个重要手段, 在软件开发过程中是不可缺少的组成部分。 单元测试与集成测试分别有各自的定义:在实际开发中,两者之间的界定是模糊的。
面向侧面的程序设计 方林博士 本文下载地址:
Chapter 3: SQL.
国家科学图书馆: 刘丹军、赵雅娟、王晓梅、胡正银等 创想通科技: 阎武鹏 等 2010年 洛阳
SAE Java 实际应用 在这里写上你的标题 作者名字/日期
基于SSH的web开发 AND 企业级WEB应用开发新技术
第六章 Hibernate 入门.
四資二甲 第三週作業 物件導向程式設計.
Tool Command Language --11级ACM班 金天行.
第一页是课程的标题 Spring入门示例.
MVC Servlet与MVC设计模式.
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
J2EE Struts 和Spring 的区别.
建设数字化的卫生监督体系 深 圳 市 卫 生 监 督 所 2006年4月.
转正述职报告 乐恩公司 史航
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
Google App Engine Google 應用服務引擎.
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
对象/关系映射—Hibernate
J2EE与中间件技术 ——Lab.
MariaDB Spider分库分表引擎调研
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
第9讲 Hibernate查询语言HQL.
对象/关系映射—Hibernate 学员要求:熟悉Java、SQL、JDBC,掌握面向对象的开发方法,并有实际项目开发经验
An Introduce to NHibernate
第10章 面向对象分析设计与对象模型 面向对象方法中,从分析到设计不像传统方法那样有明显的方法、工具的转换,而是平滑(无缝)过渡。分析设计过程具有良好的可跟踪、可修改和可扩展性。 面向对象设计是面向对象分析到实现的一个桥梁。面向对象分析是将用户需求经过分析后,建立问题域精确模型的过程,而面向对象设计则是根据面向对象分析得到的需求模型,建立求解域模型的过程。
SVN服务器的搭建(Windows) 柳峰
SQL Injection.
辅导课程六.
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
Visual Studio Team System 简介
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
第一讲 J2EE基础 博和利初级培训 —开发技能.
第17章 网站发布.
PaPaPa项目架构 By:Listen 我在这.
C/C++/Java 哪些值不是头等程序对象
DevDays ’99 The aim of this mission is knowledge..
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
程序设计工具实习 Software Program Tool
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
SQL 范引娣.
Hibernate原理与应用 讲师:李勇 北京传智播客教育
VisComposer 2019/4/17.
第十二章 学习使用Ant Apache Ant是一个基于Java的构建工具,它可以 会构建多种项目,但是目前主要被用于Java项目 的构建, Ant是用Java语言编写,可以在多个操 作系统中运行,目前在绝大部分的Java开源项目 中,都选择使用Ant作为构建项目的工具,Ant已 经成为Java开源项目构建的事实标准,而且越来.
OceanBase 0.4:从API到SQL 日照
商业分析平台-语义元数据 用友集团技术中心 边传猛 2013年 11月 06日.
VB与Access数据库的连接.
主编:钟元生 赵圣鲁.
Web安全基础教程
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
辅导课程十五.
Delphi 7.0开发示例.
CMP 讲义 2018 CMP设计哲学及基础概念 CMP推荐的4层代码结构.
基于列存储的RDF数据管理 朱敏
VB与Access数据库的连接.
JAVA 程式設計與資料結構 第三章 物件的設計.
WEB程序设计技术 数据库操作.
使用ADO访问数据库 李宝智 BonizLee 课程 10564A
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
JUDDI安装手册.
Presentation transcript:

周甫(zoofchow@hotmail.com) 持久层设计技术(一) Hibernate(1) 快速入门 周甫(zoofchow@hotmail.com)

周甫(zoofchow@hotmail.com) 课程介绍 本课程主要讲授Hibernate 3.x开发指南 适用于J2ee开发工程师 面向的学员是熟悉Java、SQL、JDBC,掌握面向对象的开发方法,并有10K以上Code实际项目开发经验 全部课程时间大约是150分钟 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 概 要 什么是 ORM ? 为什么我们要使用 Hibernate ? Hibernate快速入门 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 1 持久化层-O/R Mapping 基于B/S的典型三层架构 如何分层? 业务逻辑层和持久化层绝不要依赖于展现层。 使用假设法测试。 例子: 1、一个显示课程考试分数的列表。现在要将不及格的分数用红色字体显示(低于60分)。 2、搜索。 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 如何进行对象-关系数据库的匹配 public class User { private String name; private String password; private List address; ……… } create table tbl_user ( name varchar(255) not null , password varchar(255), ………. primary key (name) ) 如何进行对象-关系数据库的匹配? 对象 关系数据库 类的属性(基本类型) 表的列 类 表 1:n/n:1 外键 n:m 关联表 继承 单表继承、具体表继承、类表继承 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 对象—关系数据库的不匹配范式 粒度(granularity)的问题 子类型(subtypes)的问题 同一性(identity)的问题 与关联(associations)有关的问题 对象结构导航(navigation)的问题 范式不匹配的代价 花费很多时间和精力来手工实现对象和关系的匹配。 甚至要扭曲对象模型直到它与下层的关系技术匹配为止。 JDBC API本身的问题。JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。至少在三个时刻(Insert,Update,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 基于关系数据库的持久层可选方案 优点 缺点 SQL/JDBC 成熟,流行,使用DAO模式 代码烦杂,可读性差,维护困难,移植困难 Entity Bean CMP(EJB1.1之后),未来的EJB3 错误的设计。不可移植,依赖性强,不可序列化,不支持多态的关联查询 JDO 简单、透明、标准 不够成熟 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 基于关系数据库的持久层可选方案 优点 缺点 Apache OJB 性能、稳定性,属于Apache 基金组织 文档资源太少,支持标准太多成了负担(ODMG 3.0,JDO1.0) iBATIS 可以控制更多的数据库操作细节。实用于遗留系统的改造和对既有数据库的 复用。 持久层封装不够彻底,只是一个DBHelper。 Hibernate 成熟、流行、功能强大。并逐渐发展成Java 持久层事实上的标准。 不够透明 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 2018/11/23 O/R Mapping -What? Why? 什么是O/R Mapping? 对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。 O/R Mapping的优点 提高生产率(Productivity) 可维护性(Maintainability) 更好性能(Performance) 厂商独立性(Vendor independence) 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 2 Hibernate入门 Hibernate概述 Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。 Hibernate优势 开源(LGPL) 成熟 流行(约13 000 downloads/month) 自定义API JBoss 将用Hibernate3实现Entity Beans 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 持久化概念 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Hibernate开发步骤 一、持久化类的设计 二、持久化类和关系数据库的映射 三、应用的开发 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 持久化Java类必须遵循的原则 为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。 实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。 如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。 提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpdate()。 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 持久化类和关系数据库的映射 Middlegen: 从数据库中已有 的表结构中生成Hibernate映射文 件。当前版本是3.1可以去http://boss.bekk.no/boss/middlegen下载。 XDoclet:它通过在Java源代码中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件(http://xdoclet.sourceforge.net/)。 XDoclet提供了对Hibernate的支持,这样我们可以直接由Java代码生成Hibernate映射文件。 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Hibernate核心接口 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Configuration 概述:Configuration 类负责管理Hibernate 的配置信息。它包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。 Hibernate映射文件(*.hbm.xml)。 Hibernate配置的两种方法: 属性文件(hibernate.properties)。 调用代码:Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml)。 调用代码:Configuration cfg = new Configuration().configure(); 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Hibernate JDBC属性 属性名 用途 hibernate.connection.driver_class Jdbc 驱动类 hibernate.connection.url jdbc URL hibernate.connection.username 数据库用户名 hibernate.connection.password 数据库用户密码 hibernate.connection.pool_size 连接池容量最大数 周甫(zoofchow@hotmail.com) 2018/11/23

Configuration-例子(XML) 数据库连接的配置 hibernate.dialect net.sf.hibernate.dialect.MySQLDialect hibernate.connection.driver_class com.mysql.jdbc.Driver hibernate.connection.url jdbc:mysql://localhost/hibernate hibernate.connection.username root hibernate.connection.password 数据库连接池的配置-DBCP(App Server连接池首选) hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider 配置DBCP连接池 其它 hibernate.show_sql true hibernate.jdbc.fetch_size 50 hibernate.jdbc.batch_size 25 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) SessionFactory 概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。 调用代码: SessionFactory sessionFactory = cfg.buildSessionFactory(); 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Session(会话) 概述: Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。 Session也称为持久化管理器,因为它是与持久化有关的操作接口。 Session通过SessionFactory打开,在所有的工作完成后,需要关闭。 它与Web层的HttpSession没有任何关系。 调用代码 Session session = sessionFactory.openSession(); 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Transaction(事务) 概述: 它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。 调用代码: Transaction tx = session.beginTransaction(); 注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) Query 概述: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。 调用代码: Query query = session.createQuery(“from User”); 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 2018/11/23 用户的例子 映射文件-User.hbm.xml <hibernate-mapping> <class name=“net.demo.model.Users" table=“USERS"> <id name="id" column=“USERID"> <generator class="native"/> </id> <property name=“Username" column=“USERNAME"/> <property name=“Password" column=“PASSWORD"/> </class> </hibernate-mapping> 持久化类-User.java public class User { private Integer id; private String Username; private String Password; .....…Get/Set } <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="net.demo.model"> <class name="Users" table="USERS" > <meta attribute="sync-DAO">false</meta> <id name="Id" type="integer" column="USERID" <generator class="sequence"/> </id> <property name="Username" column="USERNAME" type="string" not-null="true" length="50" /> name="Password" column="PASSWORD" </class> </hibernate-mapping> 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 应用-Test.java public static void main(String[] args) { Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); String hql = "from Users"; List list = session.createQuery(hql).list(); for(int i = 0; i < list.size(); i++) Users u = (Users)list.get(i); System.out.println(u.getUsername() + u.getPassword()); } 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 2018/11/23 应用-Test.java* 保存用户:session.save(user); 修改用户:session.update(user); 保存或修改用户:session.saveOrUpdate(user); 查询用户名为“test”的用户: Query query = session.createQuery("from User where Username = ‘test'"); Users findUser = (User) query.list().get(0); 删除用户:session.delete(findUser); 删除所有用户:session.delete(“from Users”); public static void main(String[] args) { Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); //查询所有用户 String hql = "from Users"; List list = session.createQuery(hql).list(); for(int i = 0; i < list.size(); i++) Users u = (Users)list.get(i); System.out.println(u.getUsername() + " :" + u.getPassword()); } //增加新用户 Users newUser = new Users(); newUser.setUsername("jack"); newUser.setPassword("ctu"); session.save(newUser); //更新用户 Query query = session.createQuery("from Users where Username='jack'"); Users updateUser = (Users)query.iterate().next(); updateUser.setUsername("tony"); session.update(updateUser); //删除 query = session.createQuery("from Users where Username='jack'"); Users delUser = (Users)query.iterate().next(); session.delete(delUser); tx.commit(); 周甫(zoofchow@hotmail.com) 2018/11/23

周甫(zoofchow@hotmail.com) 习题 以Hibernate+struts构造一个j2ee登录程序. 周甫(zoofchow@hotmail.com) 2018/11/23