`
wanglihu
  • 浏览: 918482 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
阅读更多



持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到以下目标:
 代码可重用性高,能够完成所有的数据库访问操作
 如果需要的话,能够支持多种数据库平台
 具有相对独立性,当持久化层的实现发生变化,不会影响上层的实现。
那么到底如何来实现化持久化层呢?对于复杂的数据模型,这接通过JDBC编程来实现健壮的持久化层需要有专业的知识,对于企业应用的开发人员,花费大量时间从头开发自己的持久化层不是很可行。
幸运的是,目前在持久化层领域,已经出现了很多优秀的ORM软件,有的是商业性的,有的是开放源代码的。Hibernate就是一种越来越受欢迎的开放源代码的ORM软件。ORM软件具有中间件的特性。中间件是在应用程序和系统之间的连接管道。Hibernate可看成是连接Java应用和关系数据库的管道。中间件和普通的应用程序代码的区别在于,前者具有很高的可重用性,对于各种应用领域都适用;后者和特定的业务功能相关,不同业务领域的应用程序代码显然不一样。
Hibernate作为中间件,可以为任何一个需要访问关系数据库的Java应用服务,下图显示了Hibernate的通用性。中间件的另一个特定是透明性,作为Hibernate的使用者,无需关心它是如何实现的,只需要知道如何访问它的接口就行了。


ORM并不是一种具体的产品,而是一类框架的总称,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系数据库的映射。基于ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。
面向对象程序设计语言与关系数据库发展不同步时,需要一种中间解决方案,ORM框架就是这样的解决方案。
软件的模型
在软件开发领域,模型用来表示真实世界的实体。在软件开发的不同阶段,需要为目标系统创建不同类型的模型。在分析阶段,需要创建概念模型。在设计阶段,需要创建域模型和数据模型。

概念模型


 Customer和Order实体,一对多。一个客户有多个订单,而一个订单只能属于一个客户。
 Category和Item实体:多对多。一个商品类别包含多个商品,而一个商品可以属于多个商品类别。
 Order和Item实体,多对多。一个订单包含多个商品,而一个商品可以属于多个订单。
 Customer和ShoppingCart实体:一对多,一个客户有多个购物车,而一个购物车只能属于一个客户。
 ShoppingCart和Item实体:多对多。一个购物车包含多个商品,而一个商品可以属于多个购物车。
关系数据模型





与对象之间的关系
1.关联关系
关联指的是类之间的引用关系,这是实体域对象之间最普遍的一种关系。关联可分为一对一、一对多和多对多关联。例如Customer对象与Order对象之间就存在一对多的关联关系,一个客户有多个订单,而一个订单只能属于一个客户。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。
Public class Order{
private Long id;
private String orderNumber;
private double price;
private Customer customer;
   ………………………
}


2.依赖关系
依赖指的是类之间的访问关系。如果类A访问类B的属性或方法,或者类A负责实例化类B。和关联关系不同,无需把类B定义为类A的属性。一般用在过程域中多些。
Public Customer loadCustomer(long customerId){
Customer customer=new Customer();
String userName=customer.getUserName();
……………….
}

3.聚集
聚集指的是整体与部分之间的关系,在实体域对象之间也很常见。例如人与手就是聚集关系。

public class Person{
private Set hands=new HashSet();
}
生命周期:可见聚集关联和关联关系在类的定义上有相同的形式,不过两者有不同的语义,对于聚集关系,部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。
4.一般化
一般化指的是类之间的继承关系。


雇员  按小时拿工资的雇员  按月拿工资的雇员









Hibernate
面向对象概念 面向关系概念
类 表
对象 表的行(即记录)
属性 表的列(即字段)


Configuration接口:配置Hibernate,启动Hibernate,创建SessionFactory对象。
SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建Session对象。
Session接口:负责保存、更新、加载和查询对象。
Transaction:管理事务。
Query和Criteria接口:执行数据库查询。


Hibernate 用到的jar包

cglib.jar:
  CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包

  dom4j.jar:
  dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。
  commons-collections.jar:
  Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。

  commons-beanutils.jar:
  Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。

  commons-lang.jar:
  Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。

  commons-logging.jar:
  Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。

  后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。

  使用Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。

  ant.jar:
  Ant编译工具的jar包,用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码,那么就没有什么用,可选的jar包

  optional.jar:
  Ant的一个辅助包。

  c3p0.jar:
  C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。

  proxool.jar:
  也是一个连接池,同上。

  commons-pool.jar, commons-dbcp.jar:
  DBCP数据库连接池,Apache的Jakarta组织开发的,Tomcat4的连接池也是DBCP。

  实际上Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面3个,你实际上可以在Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中使用Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。

  connector.jar:
  JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。

  jaas.jar:
  JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。

  jcs.jar:
  如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用。

  jdbc2_0-stdext.jar:
  JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。

  jta.jar:
  JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。

  junit.jar:
  Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。

  xalan.jar, xerces.jar, xml-apis.jar:
  Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。




hibernate.cfg.xml 配置
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- 数据库连接设置 -->
<property name="connection.driver_class">
org.gjt.mm.mysql.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/mywebshop?autoReconnect=true
</property>
<property name="connection.username">root</property>
<property name="connection.password">1234abcd</property>
<!-- 数据库方言 -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>

<!-- 在控制台输出sql -->
<property name="show_sql">true</property>
<mapping resource="com/mywebshop/daos/Users.hbm.xml" />

</session-factory>

</hibernate-configuration>


#jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver


#jdbc.url=jdbc:microsoft:sqlserver://192.168.2.110:1433;
DatabaseName=WSZYHZ
Users.hbm.xml
<?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="com.mywebshop.daos.hibernat3.user">
<class
name="User"
table="users"
>
<id
name="Id"
type="integer"
column="UserId"
>
<generator class="org.hibernate.id.IdentityGenerator"/>
</id>

<property
name="UserName"
column="UserName"
type="string"
not-null="true"
length="30"
/>
<property
name="UserPassword"
column="UserPassword"
type="string"
not-null="true"
length="30"
/>
<property
name="UserAddress"
column="UserAddress"
type="string"
not-null="true"
length="30"
/>
<property
name="UserPhone"
column="UserPhone"
type="string"
not-null="true"
length="30"
/>
<property
name="UserNo"
column="UserNo"
type="boolean"
not-null="true"
length="1"
/>
<property
name="UserEmail"
column="UserEmail"
type="string"
not-null="false"
length="30"
/>
<property
name="UserLike"
column="UserLike"
type="string"
not-null="false"
length="30"
/>
<property
name="UserClass"
column="UserClass"
type="string"
not-null="true"
length="10"
/>


</class>
</hibernate-mapping>




Hibernate标识符生成器
标识符生成器 描述
increment 适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增量为1
identity 适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。
sequence 适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。
hilo 设用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为”high”值。在默认情况下选用hibernate_unique_key表的next_hi字段。
uuid.hex 适用于代理主键。Hibernate采用128位的UUID(Universal Unique Identification)算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。Char(32).占用数据库空间。
assigned 适用于自然主键。由java应用程序负责生成标识符,为了能让java应用程序设置OID,不能把setId()方法声明为private类型。应该尽量避免使用自然主键。




Hibernate映射类型、对应的Java基本类型或者他们的包装类及相应的SQL类型
Hibernate映射类型 Java类型 标准SQL类型
integer或者int int
java.lang.Integer INTEGER
long long
java.lang.Long BIGINT
short short
java.lang. SMALLINT
Byte Byte
java.lang.Byte TINYINT
float float
java.lang. FLOAT
double double
java.lang. DOUBLE
big_decimal java.lang.BigDecimal NUMERIC
character char
java.lang.Character
java.lang.String CHAR
String java.lang.String VARCHAR
boolean boolean
java.lang.Boolean BIT
binary byte[] BLOB
text java.lang.String CLOB
clob java.sql.Clob CLOB
blob java.sql.Blob BLOB

分享到:
评论

相关推荐

    ORM

    ORM(Object-Relational Mapping,对象关系映射)是软件开发中的一个重要概念,它提供了一种在关系数据库和面向对象编程之间架起桥梁的方法。通过ORM技术,开发者可以使用面向对象的方式来操作数据库,而无需直接编写...

    Java面试题55.ORM是什么?ORM框架是什么?.mp4

    Java面试题55.ORM是什么?ORM框架是什么?.mp4

    Doctrine ORM for PHP

    什么是 ORM? ORM 全称 Object-Relational Mapping, 是一种程序设计技术,它使得程序员可以使用面向对象的方法来访问和操作关系数据库。ORM 技术可以将对象模型转换为关系数据库模型,从而实现数据的持久化存储。 ...

    55.ORM是什么?ORM框架是什么?.avi

    java面试宝典

    Hibernate数据持久层框架.rar

    什么是ORM? ORM(Object-Relational Mapping) 表示对象关系映射。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作...

    mybatis面试题(经典问答)

    3.什么是ORM? 全称是对象关系映射。对象映射关系数据库。对象关系映射(ORM,或O/RM,或O/R映射)用于实现面向对象编程语言中不同类型系统之间的数据转换。简而言之,ORM就是用元数据来描述对象与数据库的映射关系...

    Hibernate面试问题大全

    1. 什么是ORM? ORM(Object-Relational Mapping)是一种技术,它将Java应用程序中的对象自动持久化到关系数据库的表中。通过ORM,开发者可以使用面向对象的方式处理数据库操作,无需直接编写SQL语句。 2. ORM包含...

    java知识点,面试题总结

    - 什么是ORM?Hibernate如何实现ORM? - 描述Hibernate的Session生命周期和状态转换。 - Hibernate的延迟加载(Lazy Loading)是什么?有何优缺点? - 解释Hibernate的级联操作(Cascade),有哪些级联类型? -...

    ORM Framework

    4. **orm??**:这个文件名可能是ORM的某种简写或特定实现,具体细节无法确定,需要查看源码来了解详情。 5. **Simple.Data-master**:Simple.Data是一个轻量级的ORM框架,它提供了一种简单的方式来访问数据库,无需...

    ORM思想的深入学习ORM.zip

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据模型映射到面向对象的软件应用中。在Java领域,Hibernate和MyBatis是两种广泛应用的ORM框架,它们极大地简化了数据库...

    cpp-SQLiteORM用于现代C的SQLiteORM库只有header

    标题中的"cpp-SQLiteORM用于现代C++的SQLite ORM库只有header"表明这是一个关于C++的SQLite对象关系映射(ORM)库,且该库仅包含头文件,这意味着开发者无需链接任何库文件,只需包含相应的头文件即可使用。ORM是一...

    hsweb-easy-orm, 简单的orm工具,为动态表单而生.zip

    HSWeb-Easy-ORM 是一个开源的简单对象关系映射(ORM)工具,设计初衷是为了简化动态表单的处理。ORM 工具的核心作用在于桥接数据库与编程语言,允许开发者通过面向对象的方式操作数据库,避免了直接编写 SQL 语句的...

    sqlite3的ORM框架

    SQLite3的ORM(Object-Relational Mapping)框架是一种在C++编程中将数据库关系模型与对象模型进行对应的技术。ORM框架使得开发者可以使用面向对象的方式来操作数据库,避免了直接编写SQL语句,提高了开发效率和代码...

    K-ORM 自定义ORM工具

    《K-ORM自定义ORM工具详解》 ORM(Object-Relational Mapping)是现代软件开发中的一种重要技术,它将数据库中的数据与程序中的对象进行映射,使得开发者可以使用面向对象的方式操作数据库,而无需关注底层SQL语句...

    ORM对象关系映射

    对象关系映射(ORM) 对象关系映射(ORM)是一种概念性的、易于理解的模型化数据的方法,基于三个核心原则:简单、传达性、精确性。ORM 方法论提供了概念性的模型化数据的方法,基于数据模型创建正确标准化了的结构...

    Moon.Orm下载

    Moon.Orm是一个专门为.NET开发者设计的轻量级ORM(对象关系映射)框架,它具有强大的功能和良好的可扩展性,能够支持多种不同的数据库系统,包括但不限于MySQL、SQL Server、Oracle、SQLite等。ORM框架的主要目标是...

    eform集成开发手册

    eform集成开发手册 eform集成开发手册是专门为eform开发人员设计的指南,旨在帮助开发者快速了解eform的集成开发流程和技术细节。该手册涵盖了eform集成开发的各个方面,包括系统文件说明、系统表结构说明、eform ...

    php中的orm

    在IT行业中,ORM(Object-Relational Mapping)是一种软件设计技术,它允许程序员用面向对象的方式来操作数据库,而无需直接编写SQL语句。在PHP中,ORM被广泛应用于Web开发,使得开发人员能够以更加抽象和高效的方式...

    orm的详细解释概念

    对象关系映射(ORM,Object-Relational Mapping)是一种编程技术,它旨在解决面向对象编程语言与关系数据库管理系统之间的不匹配问题。ORM 提供了一种方式,使得开发者可以用面向对象的方式来处理数据库,而无需直接...

Global site tag (gtag.js) - Google Analytics