`
wanglihu
  • 浏览: 909168 次
  • 性别: 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

    NULL 博文链接:https://fei-xiang.iteye.com/blog/526400

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

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

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

    java面试宝典

    Hibernate数据持久层框架.rar

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

    mybatis面试题(经典问答)

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

    Mybatis笔记1

    介绍hibernate之前,我们先了解一下什么是ORM?ORM(Object Relational Mapping):对象关系映射,简单点说就是将数据库中的表和

    ORM思想的深入学习ORM.zip

    这里面包括了Hibernate和MyBatis的实现ORM思想的原理,以及讲解了什么是ORM思想。仿照Hibernate自定义了一个简单的增删改查的ORM框架,还有测试代码。

    SqliteORM,一个很好的Sqlite ORM框架

    Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...

    ORM框架ORM框架ORM框架ORM框架

    能实现基本的数据库操作能实现基本的数据库操作

    Elasticsearch​的ORM工具orm4es.zip

    orm4es是一个Elasticsearch的ORM工具,它可以生成简单的查询对象.它本身非常简单,也很容易使用;代码生成通过freemark完成,它会自动解析es index 的mapping设置,根据mapping生成与index对应的java Bean,使用生成...

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

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

    .NET ORM框架

    ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架

    sqlite3的ORM框架

    简单易用的基于SQLite3的C++ ORM框架

    系统架构+ORM+设计模式

    系统架构+ORM+设计模式 系统架构+ORM+设计模式

    ORM一键还原系统 v4.1.25.1 官方版.zip

    今天小编要给大家介绍一款功能强大的Windows系统备份和还原工具——ORM一键还原系统。ORM一键还原系统备份速度比ghost还快,压缩率更出色,可以全自动备份系统数据到最大分区,ORM一键还原系统同时支持所有主流...

    Dos.ORM Demo

    选择Dos.ORM的理由:  1.上手非常简单,0学习成本。使用方便,按照sql书写习惯编写C#代码。功能强大。  2.轻量级,只有一个dll文件(不到200KB),相比于EF,NHibernate这些重量级的ORM框架,实在是太小。  3....

    spring-orm.jar

    spring-orm.jar

    ORM映射与WEB的应用

    ORM映射与WEB的应用ORM映射与WEB的应用ORM映射与WEB的应用ORM映射与WEB的应用ORM映射与WEB的应用ORM映射与WEB的应用

    SqlSugar ORM工具箱2.2.7z

    SqlSugar ORM工具箱2.2.7z

Global site tag (gtag.js) - Google Analytics