1、对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。域对象可代表业务领域中的人、地点、事物或概念。域对象分为以下几种:1, 实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java对象)。2, 过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发出订单、登陆等。3, 事件域对象:应用中的一些事件(警告、异常)。1.2.2. 域对象间的关系关联:类间的引用关系。以属性定义的方式表现。依赖:类之间访问关系。无需定义成属性。在A中访问B中的方法或属性,或者A负责实例化B。聚集(Aggregation):整
2、体与部分的关系。例人与手的关系。部分类的对象不能单独存在,他的生命周期依赖于整体类的对象的生命周期,整体消失时,部分也随之消失。一般化(Generalization):类之间继承关系。1.2.3. 域对象(Domain)的持久化概念 实体域对象在内存中创建后,不能永久存在。将实体域对象永久保存起来,就是持久化的过程。通常只有实体域对象需要持久化,过程域对象和事件域对象一般不需要持久化。广义持久化指增、删、改、查。1.3. ORM与ORM框架1.3.1. ORM(Object/Relation Mapping) 对象关系映射(Object Relational Mapping,简称ORM)是一种
3、为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。ORM 主要解决对象-关系的映射面向对象概念面向关系概念类表对象表的行(记录)属性表的列(字段)ORM的实现思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。ORM 采用元数据来描述对象-关系映射细节元数据通常采用 XML 格式,并且存放在专门的对象-关系映射文件中。ORM中间件的使用方法采用元数据来描
4、述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对象-关系映射文件中。只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参照映射文件的信息,把域对象持久化到数据库中。例(Hibernate):1.3.2. 流行的ORM框架Hibernate:非常优秀、成熟的 ORM 框架。提供强大的对象和关系数据库映射以及查询功能。Hibernate是面向对象的程序设计语言和关系型数据库之间的桥梁,允许开发者采用面向对象的方式来操作关系数据库。Hibernate 的目标是释放开发者通常的与数据库持久化相关的编程任务的 95%。消除那些针对特定数据库厂商的SQL代码。Ibatis:相比
5、Hibernate 灵活高,运行速度快。开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能。TopLinkOJB1.3.3. Hibernate 与 Jdbc 代码对比1.4. 小结2. Hibernate入门(HelloWorld)2.1. Hibernate介绍Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑。Hib
6、ernate的主页为:http:/www.hibernate.org/Hibernate的下载地址:HibernateTools的下载地址: 我们所学的版本是3.6.02.2. Hibernate的体系结构与开发步骤Hibernate的体系结构Hibernate开发步骤2.3. 第一个Hibernate程序(HelloWorld)2.3.1. 创建Eclipse工程并引入相关的jar包新建Java工程,并添加如下jar包:1,hibernate_home/ hibernate3.jar2,hibernate_home/lib/required/*.jar3,hibernate_home/lib
7、/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar4, 数据库对应的JDBC驱动(例如mysql-connector-java-5.1.5-bin.jar)还可以加入日志相关的jar包(不加也可以):1, log4j-1.2.15.jar2, slf4j-log4j12-1.6.1.jar2.3.2. 创建持久化对象:User2.3.3. 创建对象-关系映射文件:User.hbm.xmlCustomer类属性Java类型Hibernate类型Cutomers字段名Sql类型Namejava.lang.StringstringNAMEVarchar(12)age
8、intINTSexcharcharacterSEXCHAR(1)MarriedbooleanmarriedbitDestextdesCLOBPicbytebinarypicBLOBBirthdayjava.sql.DatedateBIRTHDAYDATEregisteredTimejava.sql.TimeStamptimestampREGISTERED_TIMETIMESTAMP2.3.4. 创建 Hibernate 配置文件:hibernate.cfg.xml创建表、JavaBean、写映射文件2.3.5. 通过 Hibernate API 编写访问数据库的代码编程步骤1, 获取 Conf
9、iguration 对象。2, 获取 SessionFactory 对象。3, 获取 Session,打开事务。4, 用面向对象的方式操作数据库。5, 关闭事务,关闭 Session。增删改查功能的实现代码3. Hibernate API简介3.1. ConfigurationConfiguration 类负责管理 Hibernate 的配置信息包括如下内容:1,Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。2,持久化类与数据表的映射关系(*.hbm.xml 文件)。 创建
10、 Configuration 的两种方式1, 属性文件(hibernate.properties) Configuration cfg = new Configuration();2, Xml文件(hibernate.cfg.xml)a) 加载默认名称的配置文件(hibernate.cfg.xml)Configuration cfg = new Configuration().configure();b) 或加载指定名称的配置文件:Configuration cfg = new Configuration() .configure(“myhibernate.cfg.xml”);3.2. Ses
11、sionFactoryConfiguration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。 相关代码如下: Configuration cfg = new Configuration().configure(); SessionFactory sessionFactory = cfg.buildSessionFactory();
12、1, SessionFactory是线程安全的。2, 构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。3, SessionFactory是生成Session的工厂:Session session = sessionFactory.openSession();3.3. SessionSession 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 中有一个缓存,显式执行flush()方法之
13、前,所有的持久层操作的数据都缓存在 session 对象处。(相当于 JDBC 中的 Connection)。一般一个业务操作使用一个Session。 持久化类与 Session 关联起来后就具有了持久化的能力。 Session是线程不安全的,一般是一次业务操作使用一个Session。 Session 类的一些方法:取得持久化对象的方法: get() load()持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()开启事务: beginTransaction().管理 Session 的方法:isOpen(),flush(), clea
14、r(), evict(), close()等3.4. Transaction代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。 代表一次原子操作,它具有数据库事务的概念。Transaction tx = session.beginTransaction(); 常用方法:commit():提交相关联的session实例rollback():撤销事务操作wasCommitted():检查事务是否提交3.5. Query和Criteria接口都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。Cr
15、iteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。3.6. Hibernate的运行过程Hibernate的运行过程如下:1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,2、并用这些信息生成一个SessionFactory对象,3、然后从SessionFactory对象生成一个Session对象,4、并用Session对象生成Transaction对象; A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方
16、法对PO进行加载、保存、更新、删除、等操作; B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。4. 对象/关系数据库映射(一)基础4.1. 持久化对象与OID4.1.1. 对持久化对象的要求1. 提供一个无参的构造器。使Hibernate可以使用Constructor.newInstance() 来实例化持久化类。2. 提供一个标识属性(identifier property)。通常映射为数据库表的主键字段。如果没有该属性,一些功能将不起作用,如:Session.saveO
17、rUpdate()。3. 为持久化类的字段声明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。4. 使用非final类。在运行时生成代理是Hibernate的一个重要的功能。如果持久化类没有实现任何接口,Hibnernate 使用 CGLIB 生成代理。如果使用的是 final 类,则无法生成CGLIB代理。5. 重写eqauls()和hashCode()方法。如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。4.1.2. OID为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键
18、,而在对象术语中,则叫做对象标识(Object identifier-OID)。4.2. 对象/关系数据库映射文件(hbm.xml)Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射。在运行时 Hibernate 将根据这个映射文件来生成各种SQL语句映射文件的后缀为“.hbm.xml”。映射文件示例:4.3. 持久化类的属性及属性映射(普通属性)映射配置示例4.3.1. 持久化类的属性及访问方法Hibernate中持久化类的访问者有两个:1, Java应用程序2, hibernate(何时调用get、set方法?如下图所示)4.3.2. 使用基本数据类型和包装类型的区
19、别基本数据类型和包装类型对应的hibernate映射类型相同(映射是一样的),例:4.3.3. Hibernate访问持久化类属性的策略propertye (默认值):表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。提高域模型透明性。fieldhibernate通过java反射机制直接访问类属性。对于没有get与set方法的属性可设置该访问策略。noop它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。示例:在持久化类的方法中加入程序逻辑在Customer.hbm.xml文件中无
20、需映射firstname和lastname属性,而是映射name属性4.3.4. 设置派生属性(formula)利用元素的formula属性,用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。111111*11111111111111111111111111111111111111111111111111如果指定了formula 属性,则就会insert=”false” update=”false”4.3.5. 控制insert、update语句映射属性作用的insert属性若为false,在insert语句中不包含该字段,该字段永远不能被插入。默认值true。upda
21、te属性若为false,update语句不包含该字段,该字段永远不能被更新。默认值为true。classmutable属性若为false,等价于所有的元素的update属性为false,整个实例不能被更新。默认为true。dynamic-insert属性若为true,等价于所有的元素的insert为true,保存一个对象时,动态生成insert语句,语句中仅包含取值不为null的字段。默认false。dynamic-update属性元素的update为true,更新一个对象时,动态生成update语句,语句中仅包含取值不为null的字段。4.3.6. 处理sql引用表示符在SQL语法中,表示符
22、是指用于为数据库表、视图、字段或索引等名字的字符串,常规表示符不包括空格,也不包含特殊字符,因此无需使用引用符号。如果数据库表名或列名包含特殊字符,可以使用引用表示符(键盘下面的字符)。4.3.7. 设置类的包名如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置元素的package属性,以避免为每个类提供完整的类名。指定类的全限定名在 /idid元素说明:设定持久化类的 OID 和表的主键的映射,可以有以下属性: name: 标识持久化类 OID 的属性名 column: 设置标识属性所映射的数据列的列名(主键字段的名字). unsaved-value:若设定了该属性, Hib
23、ernate 会通过比较持久化类的 OID 值和该属性值来区分当前持久化类的对象是否为临时对象,在Hibernate3中几乎不再需要. type:指定 Hibernate 映射类型. Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁. 如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类型 Java 的基本数据类型和包装类型对应相同的 Hibernate 映射类型. 基本数据类型无法表达 null, 所以对于持久化类的 OID 推荐使用包装类型generator元素说明设定持久化类设定标识符生成器,可以有一个class属性: class: 指定使用的标识符生成器全限定类名或其缩写名。元素的class属性可以指定的值说明(主键生成策略)主键生成器描述increment适用于代理主键。由hibernate自动以递增的方式生成标识符,每次增量为1。ident
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1