java对象持久化
- 格式:doc
- 大小:696.00 KB
- 文档页数:13
PO:全称是persistant object持久对象最形象的理解就是一个PO就是数据库中的一条记录。
好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
BO:全称是business object:业务对象主要作用是把业务逻辑封装为一个对象。
这个对象可以包括一个或多个其它的对象。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。
VO :value object值对象ViewObject表现层对象主要对应界面显示的数据对象。
对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。
DTO :Data Transfer Object数据传输对象主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VOPOJO :plain ordinary java object 简单java对象个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。
一个POJO持久化以后就是PO直接用它传递、传递过程中就是DTO直接用来对应表示层就是VODAO:data access object数据访问对象这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要.主要用来封装对数据库的访问。
通过它可以把POJO持久化为PO,用PO组装出来VO、DTOO/R Mapping 是Object Relational Mapping(对象关系映射)的缩写。
JDO是Java对象持久化的新的规范。
JDO经SunJava Community Process认定。
1)一、历史JDO是对象持久化工作的综合成果,试图提供一个对象持久化的完全版本。
JDO同时继承于ODMG(对象数据管理小组,标准化对象数据库的一个独立委员会)和对象关系映射工具提供商。
JSR #000012 approved in July 19991999-8组建的专家小组:包括Sun、Apple、BEA、IBM、Oracle、SAP、WebGain等2000-5 完成公开评论草案2000-6 在JavaOne上引入2001-3 最终草案0.932001-5 最终草案0.96公布2001-6 在JavaOne上启动2001-11 最终草案0.982)二、目标定义对象级的持久化。
∙完全支持对象模型,包括引用、集合、接口、继承∙完全透明持久化:这使得业务对象完全独立于任何数据库技术,这使用了一个字节码增强机制(a byte-code enhancement mechanism)。
∙缩短开发周期(不再需要映射)∙在开发小组中清晰地划分业务人员和数据库人员。
∙通用持久性JDBC限于RDBMS,JDO潜在地可以处理任何类型的数据源,包括RDBMS,ODBMS,TP监控处理,ASCII无格式文件,xml文件,properties文件,大机上的Cobol数据库,等JDO是面向大型信息系统的一个完全的解决方案,在这样的系统中,信息存储于多种异质数据源∙涵盖J2EE、J2SE、J2ME的广泛实现∙强壮的事务模型∙同时支持C/S和多层体系结构3)三、体系JDO 包PersistentCapable:拥有持久实例的类必须实现这个接口。
管理对象生命周期。
PersistenceManager :代表了到数据源的连接。
一个应用可以打开一个或多个PersistenceManagers。
PersistenceManagerFactory:允许从数据源中得到一个PersistenceManager的实例,这个工厂也可以作为一个连接池。
jpa 自动持久化原理JPA(Java Persistence API)是Java中一种持久化框架,它提供了一种简单而强大的方式来将Java对象映射到关系数据库中。
JPA 的自动持久化原理是通过将Java对象与数据库表进行映射,实现对象的自动保存、更新和删除。
JPA的自动持久化原理主要是通过注解或XML配置来实现的。
在Java类中,我们可以使用@Entity注解将该类标记为实体类,使用@Id注解将该类的某个属性标记为主键。
通过这样的标记,JPA就能够自动将该实体类与数据库表进行关联。
当我们对实体对象进行操作时,JPA会自动将操作转化为对数据库的增删改操作。
例如,当我们调用EntityManager的persist方法将一个实体对象持久化时,JPA会自动将该对象保存到数据库中。
当我们修改实体对象的属性时,JPA会自动更新数据库中对应的记录。
当我们调用EntityManager的remove方法删除一个实体对象时,JPA会自动删除数据库中对应的记录。
JPA的自动持久化还支持事务管理。
通过使用注解或XML配置,我们可以将一系列的数据库操作组织成一个事务。
在事务提交或回滚时,JPA会自动将对应的操作应用到数据库中。
JPA的自动持久化原理还包括了一些其他特性,如缓存管理、延迟加载等。
通过使用这些特性,我们可以提高系统的性能和效率。
总的来说,JPA的自动持久化原理是通过将Java对象与数据库表进行映射来实现的。
通过使用注解或XML配置,我们可以将实体类与数据库表进行关联,并实现对实体对象的自动保存、更新和删除。
同时,JPA还提供了事务管理、缓存管理等特性,以提高系统的性能和效率。
如何在Java中进行数据的持久化和读取操作数据的持久化是指将程序中的数据存储在持久存储介质中(如文件、数据库等)以便下次程序运行时能够重新读取和使用。
在Java中,数据的持久化和读取操作可以通过文件操作、数据库操作、序列化和反序列化等方式实现。
本文将重点介绍在Java中进行数据的持久化和读取操作的几种方法。
一、文件操作1.1文件写入在Java中进行文件数据的持久化操作可以使用FileOutputStream 或者BufferedWriter等类来实现。
通过FileOutputStream类,可以将数据以字节的形式写入文件,示例代码如下:```javatry {String data = "Hello, World!";FileOutputStream fos = new FileOutputStream("data.txt");fos.write(data.getBytes());fos.close();} catch (IOException e) {e.printStackTrace();}```上述代码中,首先定义了一个字符串数据并赋值给data变量,然后通过FileOutputStream类打开文件输出流,并将字符串数据以字节形式写入文件中,最后关闭文件输出流。
1.2文件读取使用FileInputStream或者BufferedReader类可以实现对文件数据的读取操作。
示例代码如下:```javatry {FileInputStream fis = new FileInputStream("data.txt");int content;while ((content = fis.read()) != -1) {System.out.print((char) content);}fis.close();} catch (IOException e) {e.printStackTrace();}```上述代码中,首先使用FileInputStream类打开文件输入流,并定义一个整型变量content用于存储读取的字节数据。
java项⽬中VO和DTO以及Entity,各⾃是在什么情况下应⽤的j2ee中,经常提到⼏种对象(object),理解他们的含义有助于我们更好的理解⾯向对象的设计思维。
POJO(plain old java object):普通的java对象,有别于特殊的java对象(含继承约束等)和EJB。
POJO⼀般只有⼀系列的属性和相应的get、set⽅法。
PO(persistant object):持久化对象,有别于POJO,必须对应数据库中的实体。
⼀个PO对应数据库的⼀条记录。
持久化对象的⽣命周期与数据库密切相关,只能存在于connection之中,连接关闭后,PO就消失了。
PO相对于POJO有诸多不同,⽐如PO中会有保存数据库entity状态的属性和⽅法。
但是ORM(object-relation mapping)追求的⽬标是PO和POJO的⼀致,所以在程序员的⽇常开发中,都是将POJO作为PO使⽤,⽽将POJO转化为PO的功能交给hibernate等框架来实现。
DTO(data transfer object):数据传输对象,以前被称为值对象(VO,value object),作⽤仅在于在应⽤程序的各个⼦系统间传输数据,在表现层展⽰。
与POJO对应⼀个数据库实体不同,DTO并不对应⼀个实体,可能仅存储实体的部分属性或加⼊符合传输需求的其他的属性。
DAO(data access object):数据访问对象。
提供访问数据库的抽象接⼝,或者持久化机制,⽽不暴露数据库的内部详细信息。
DAO提供从程序调⽤到持久层的匹配。
BO(business object):业务对象。
主要是将业务逻辑封装为⼀个对象,该对象可以包含⼀个或多个其他对象。
如,"Principal"(委托⼈),有"Name","Age"等属性,同时和"Employee"(雇员)有1对多的关系,这个"Principal"就可以作为⼀个与业务相关的PO。
JPA标准详解一、简介Java持久化API(Java Persistence API,简称JPA)是一种用于执行SQL数据库操作的Java API。
它为面向对象的开发人员提供了一种将Java对象映射到关系数据库的方式,并提供了在Java应用程序和数据库之间进行数据交互的方法。
二、JPA的历史和发展JPA最初是由EJB 3.0规范中的CMP(容器管理持久性)模块发展而来的。
后来,这个规范被独立出来,形成了现在的JPA标准。
JPA的主要目标是简化Java 应用程序与数据库之间的交互,使得开发人员可以专注于业务逻辑的开发,而不需要关心底层的数据访问细节。
三、JPA的特性1. 简单易用:JPA提供了一种简单的方法来定义对象-关系映射(ORM),使得开发人员可以快速地将Java对象映射到数据库表。
2. 类型安全:JPA支持泛型和注解,可以在编译时检查类型错误,提高代码的健壮性和可维护性。
3. 透明性:JPA可以将复杂的数据访问逻辑隐藏在抽象层之下,使得开发人员可以专注于业务逻辑的开发。
4. 跨平台:JPA是基于Java的,因此它可以在任何支持Java的平台上运行。
四、JPA的核心概念1. 实体(Entity):实体是数据库中的一张表,它是JPA中的基本单位。
每个实体都有一个唯一的标识符,通常是主键。
2. 持久化单元(Persistence Unit):持久化单元是一组实体、存储库和其他持久化配置的集合。
它定义了应用程序与数据库之间的连接信息。
3. 存储库(Repository):存储库是一个接口,它定义了对实体进行CRUD操作的方法。
存储库可以是本地的,也可以是远程的。
4. 查询语言(Query Language):JPA支持多种查询语言,包括JPQL(Java Persistence Query Language)、Criteria API和原生SQL。
五、JPA的使用步骤1. 定义实体:使用@Entity注解定义实体类,并使用@Table注解指定对应的数据库表。
entitymanager中的persist方法在Java持久化框架中,EntityManager的persist方法是一个非常重要的功能,它用于将实体类对象保存到数据库中。
以下将详细介绍EntityManager 中的persist方法的使用方法和注意事项。
一、概述entitymanager中的persist方法EntityManager是Java持久化框架(如Hibernate、MyBatis等)中的核心组件,负责管理实体类与数据库之间的映射关系。
persist方法是将实体类对象持久化到数据库的关键方法,它会将实体类对象的状态保存到数据库中,同时维护实体类与数据库表之间的关联关系。
二、使用场景和注意事项1.使用场景:当需要将一个新创建的实体类对象保存到数据库中时,可以使用persist方法。
此外,当需要更新一个已存在的实体类对象时,也可以使用persist方法。
2.注意事项:- 确保实体类已经完成了映射配置,包括类与数据库表的映射、属性与字段的映射等。
- 确保实体类中的主键属性已经设置正确,以便在保存时能够唯一标识一个记录。
- 如果有事务管理需求,可以将persist方法放入事务中进行处理。
三、具体实现步骤1.创建实体类,并完成映射配置。
2.初始化EntityManager实例。
3.使用EntityManager的persist方法将实体类对象保存到数据库中。
4.如果需要,可以调用EntityManager的flush方法,强制将缓冲区的更改刷新到数据库。
5.关闭EntityManager实例。
四、示例代码及解析以下是一个简单的示例,演示了如何使用Hibernate框架中的EntityManager的persist方法将实体类对象保存到数据库中:```java// 1.创建实体类,完成映射配置@Entity@Table(name = "user")public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private Integer age;// 省略getter和setter方法}// 2.初始化EntityManager实例EntityManager entityManager = ...; // 获取EntityManager实例// 3.使用persist方法保存实体类对象User user = new User();user.setName("张三");user.setAge(25);entityManager.persist(user);// 4.调用flush方法,强制刷新缓冲区entityManager.flush();// 5.关闭EntityManager实例entityManager.close();```总之,EntityManager中的persist方法是一个实用的功能,可以帮助我们轻松地将实体类对象保存到数据库中。
jpa底层原理JPA(Java Persistence API)是Java平台上的一种ORM(对象关系映射)规范,用于将Java对象持久化到数据库中。
底层原理主要涉及JPA的架构,数据映射过程,事务管理和性能优化等方面。
一、JPA架构JPA的架构包括三个核心组件:实体类(Entity)、持久化单元(Persistence Unit)和实体管理器(EntityManager)。
实体类:映射数据库中表的Java类,使用注解或XML配置属性与表中列的映射关系。
持久化单元:用来管理实体类和数据库之间的关系。
可以通过persistence.xml文件在应用程序中定义持久化单元的属性,如数据库的连接信息、事务的管理方式等。
实体管理器:用于操作实体类的对象,提供了CRUD(创建、读取、更新、删除)等操作方法。
二、数据映射过程JPA通过一个叫做ORM的过程将实体类映射到数据库表。
1.实体类与表的映射关系:使用注解或XML配置,向JPA提供关于实体类和数据库表之间的映射关系的信息。
2.对象识别:将实体类的对象标识为持久状态,并将其关联到实体管理器。
3. 查询与更新:使用JPQL(Java Persistence Query Language)进行数据库操作,JPQL是一种面向对象的查询语言,类似于SQL语言。
三、事务管理JPA支持两种事务管理方式:容器管理事务(Container-Managed Transaction,CMT)和应用程序管理事务(Application-Managed Transaction,AMT)。
1.CMT:交由应用服务器负责事务管理,开发人员不需要显式地控制事务的起始和结束。
四、性能优化JPA提供了一些性能优化的机制,以提高数据库操作的效率。
1.缓存:JPA中包含两级缓存,一级缓存是实体管理器的缓存,二级缓存可以是进程内或跨进程共享的。
2.懒加载:通过延迟加载关联实体类的方式,减少数据库查询次数,提高性能。
JPA(Java Persistence API)是Java评台上的一种ORM(对象关系映射)规范,它提供了一种将Java对象持久化到关系数据库中的方式。
在JPA中,我们通常使用EntityManager来执行数据库操作。
其中,createNativeQuery是EntityManager中的一个方法,用于执行原生的SQL查询。
1. createNativeQuery方法的基本用法在JPA中,通过EntityManager的createNativeQuery方法可以执行原生的SQL查询。
该方法接受一个表示原生SQL查询的字符串作为参数,并且可以选择性地指定返回的结果类型。
例如:```javaString sql = "SELECT * FROM user WHERE id = :userId";Query query = entityManager.createNativeQuery(sql, User.class); query.setParameter("userId", 1);List<User> result = query.getResultList();```在上面的例子中,我们首先构造了一个表示SQL查询的字符串,然后通过createNativeQuery方法创建了一个Query对象。
这个Query对象被指定为返回类型为User.class,表示返回的结果将会被封装为User对象。
接着我们使用setParameter方法设置了SQL查询中的参数,并最终调用了getResultList方法获取查询结果。
2. createNativeQuery方法的高级用法createNativeQuery方法还可以接受第二个参数,用于指定返回结果的映射关系。
这个参数通常是一个ResultSetMapping对象。
例如:```javaString sql = "SELECT u.id, , a.street, a.city FROM user u, address a WHERE u.address_id = a.id";Query query = entityManager.createNativeQuery(sql, "UserAddressMapping");List<Object[]> result = query.getResultList();```在上面的例子中,我们首先构造了一个表示SQL查询的字符串,然后通过createNativeQuery方法创建了一个Query对象。
Hibernate概述1. 持久化技术简介持久化,即“Persistence”。
所谓将数据持久化就是将数据从内存中保存到磁盘中,也就是我们所说的将Java代码中的数据写入到数据库中,这样的话,哪怕系统掉电也能重新恢复数据。
虽然持久化数据的方式多种多样,比如我们可以将数据以文本文件、XML文件的形式保存到磁盘中,但通常是将数据保存到数据库中,这样可以快捷地对数据进行增、删、改、查操作。
1.1 持久层概念我们已经知道持久化是将内存中的数据保存到磁盘中的操作,而持久层则是软件体系结构的一个独立组成部分。
典型的软件体系结构是由表示层、业务逻辑层、数据层组成的三层体系结构,如图1-1所示。
三层体系结构实现了业务逻辑层和表示层的分离,有利于系统的升级和维护。
图1-1:三层体系结构在三层体系结构中,各层的功能如下:l表示层:用来向用户显示系统执行时的有关信息。
l业务逻辑层:用来处理业务逻辑以及进行数据的持久化操作。
l数据层:用来保存需要进行持久化的数据。
我们所说的持久层是在三层体系结构的基础上划分出来的,它将原来三层体系结构中的业务逻辑层划分出一个独立的持久层,专门负责进行数据的持久化操作,如图1-2所示,即通常所指的四层体系结构。
图1-2:四层体系结构在四层体系结构中,各层的功能如下:l表示层:用来向用户显示系统执行时的有关信息。
l业务逻辑层:用来处理业务逻辑。
l持久层:用来进行数据的持久化操作。
l数据层:用来保存需要进行持久化的数据。
四层体系结构降低了业务逻辑层的复杂度,使其只关心业务逻辑处理,而将数据的持久化操作交给持久层来进行,从而实现了业务逻辑与数据的持久化操作的分离。
利用持久层可以使系统容易地做到,当业务逻辑发生改变或数据层的存储机制发生改变时,持久层的代码不需要进行修改和重新编译,这将会降低我们对系统进行升级和维护的难度。
数据持久层的主要职责是提供数据库访问方法,能够使程序员避免手工编写程序来操纵数据库,而使其专注于业务逻辑的开发,从而大大简化了对数据进行增、删、改、查等功能的开发过程。
利用Hibernate对象持久化服务简化Java 数据库访问作者:李强来源:《计算机光盘软件与应用》2013年第24期摘要:随着社会经济的快速发展,网络信息技术的进步,出现了一种Java语言。
在开发J2EE标准时,若直接用JDBC来操作系统数据库,在一方面不仅工程大和代码冗长,同时也不便于维护,易产生较大影响与危险。
为有效地解决这些问题,必须要以一种完全面向对象自身业务意识以及概念来开发,在这一过程中,产生了很多的对象持久化技术,如Hibernate、JDO以及OJB等。
下面文章就利用Hibernate对象持久化服务简化Java数据库访问进行研究和分析。
关键词:Hibernate;简化;Java;数据库;方位;持久化服务中图分类号:TP311.131 Hibernate的概述基于Java这一大语言环境下,在开发各种标准时,可借助于Hibernate这一技术的应用来解决映射方面的问题,这种技术支持所用的全部Java思想,能够直接映射大部分JavaBean,且不需对其进行任何的修改。
即便是要实施修改,也只是在系统的Bean中添加相应的私有访问方式,就能够把某一用户所定义的不同实例映射至同一张表同一行。
同时还可借助于代理模式的应用将载入类过程进行简化,从而降低Hibernate QL的应用率,并且还可在数据库中进行数据代码编写量的提取,以此达到节约开发成本以及时间的目的。
除此之外,借助于该技术的应用,还可有效解决在开发过程中所遇到的各种问题,使生产力得到相应的提高。
在Hibernate中对于每种数据库均有相对应的Dialect来实施操作优化,以此提升其在不同情况下的工作效率。
Hibernate工作原理图如图1所示,从图1可知,Hibernate所实施的这一持久化服务作用于某一数据库,应用程序借助于Hibernate和数据库之间发生关系,并操作数据,而Hibernate则借助于类与properties的映射文件把类映射至相应的数据库中,以此Application就可借助于这一持久化对象类来进行数据库的直接访问。
Java中的数据持久化选择合适的存储方案在Java中,数据持久化是一个重要的概念。
它指的是将应用程序的数据保存在存储介质中,以便在程序结束后或者重启后能够恢复数据。
选择合适的存储方案对于数据的安全性、性能以及可扩展性都至关重要。
本文将介绍Java中常用的数据持久化存储方案,并分析它们各自的优点和不足。
一、文件存储文件存储是最基本的数据持久化方式之一,它可以将数据以文本或二进制的形式保存到文件中。
在Java中,我们可以使用File类和相关的IO流来实现文件存储。
文件存储的优点是简单易用,适合存储小型数据。
但是对于大规模数据的读写操作来说,文件存储的性能较差。
二、关系型数据库关系型数据库是Java中广泛使用的数据持久化方案之一。
它使用表格的形式来组织数据,并使用SQL语言进行查询操作。
常见的关系型数据库有MySQL、Oracle、SQL Server等。
关系型数据库的优点是数据结构清晰,支持复杂的查询操作,具有较强的数据一致性和完整性。
但是在大数据量和高并发的场景下,关系型数据库存在性能瓶颈。
三、非关系型数据库非关系型数据库也称为NoSQL数据库,它以非结构化的形式来储存数据,可以更好地适应大数据量和高并发的需求。
常见的非关系型数据库有MongoDB、Redis、Hbase等。
非关系型数据库的优点是性能优秀,可扩展性强,适合处理半结构化和非结构化数据。
但是非关系型数据库在复杂查询和事务管理方面的支持相对较弱。
四、对象数据库对象数据库是一种基于面向对象思想的数据持久化方案。
它能够直接将对象保存到数据库中,不需要进行对象和关系的映射。
常见的对象数据库有db4o、Versant等。
对象数据库的优点是对于对象的操作更加简便,能够提高开发效率。
但是对象数据库的使用较为复杂,对于复杂查询和数据一致性的支持相对较弱。
五、内存存储内存存储是将数据保存在内存中的一种方式。
在Java中,我们可以使用缓存框架如Ehcache、Redis等来实现内存存储。
Java持久化框架:MyBatis和JPA引言在Java开发领域,持久化是一个非常重要的概念。
它指的是将数据存储到数据库中,以便在程序重新运行时能够恢复数据。
为了实现持久化,开发人员通常使用一种持久化框架来简化数据库操作。
本文将重点介绍两个流行的Java持久化框架:MyBatis和JPA。
1. MyBatisMyBatis是一个开源的持久化框架,它通过将SQL语句和Java代码进行映射,从而实现数据库操作的简化。
MyBatis的核心思想是将SQL语句与Java代码分离,使得开发人员能够更灵活地对数据库进行操作。
1.1 映射文件在MyBatis中,开发人员需要编写映射文件来定义SQL语句与Java代码之间的映射关系。
映射文件通常包含SQL语句、参数映射和结果映射等信息。
通过使用映射文件,开发人员可以实现灵活的数据库操作。
1.2 SQL语句的执行MyBatis提供了丰富的API来执行SQL语句。
开发人员可以通过SqlSessionFactory创建SqlSession对象,然后使用SqlSession对象执行SQL 语句。
SqlSession提供了诸如insert、update、delete和select等方法来执行不同类型的SQL语句。
1.3 动态SQLMyBatis支持动态SQL,开发人员可以根据不同的条件生成不同的SQL语句。
通过使用动态SQL,开发人员可以实现更灵活的数据库操作。
1.4 缓存MyBatis支持缓存机制,可以提高数据库访问的性能。
MyBatis提供了一级缓存和二级缓存两种类型的缓存。
一级缓存是指SqlSession级别的缓存,而二级缓存是指SqlSessionFactory级别的缓存。
2. JPAJPA是Java持久化API的缩写,它是一种Java规范,旨在简化数据库操作。
JPA 提供了一系列的API和注解,使得开发人员能够更加方便地进行数据库操作。
2.1 实体类在JPA中,开发人员需要定义实体类来映射数据库中的表。
第1章对象持久化什么是持久化?简单地说,持久化就是把数据同步保存到数据库或某些存储设备中。
在软件的分层体系结构中,持久化层是与数据库打交道的逻辑层。
在数据库中对数据的增加、删除、查找和修改操作由持久化层来处理。
最常见的操作是在ASP或JSP的页面代码中混杂了很多连接数据库、操作数据库的语句,这实际上是把持久层和展现层耦合到了一起,使得代码的编写和维护都很困难,程序结构非常不清晰。
对于大型应用,这个问题尤为突出,因此,对系统结构进行分层,是解决这种耦合问题的前提保障。
Java程序员对使用JDBC进行数据库编程不会感到陌生。
实际上,使用JDBC对数据库中的数据进行增加、删除、修改的操作就是持久化的过程。
然而,直接使用JDBC作为持久层有一些难以解决的问题。
1.1 JDBC面临的一些问题常规访问数据库的方法是直接使用JDBC。
而在实际的应用中它有一些缺点,详细的解释见下面内容所述。
1.1.1 JDBC简介JDBC是一种用于执行SQL语句的Java API(JDBC本身是个商标名而不是一个缩写字,然而,JDBC常被认为是代表“Java数据库连接(Java Database Connectivity)”),它由一组用Java编程语言编写的类和接口组成。
JDBC为工具/数据库开发人员提供了一个标准的API,使他们能够用纯Java API来编写数据库应用程序。
有了JDBC,向各种关系数据库发送SQL语句就是一件很容易的事。
换言之,有了JDBC API,就不必为访问Sybase 数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,为访问Informix 数据库又写另一个程序等。
只需用JDBC API写一个程序即可,它可向相应数据库发送SQL语句。
而且,使用Java编程语言编写的应用程序无需去考虑要为不同的平台编写不同的应用程序。
将Java和JDBC结合起来将使程序员只需写一遍程序就可让它在任何平台上运行。
简单地说,JDBC可做3件事:❑与数据库建立连接。
❑发送SQL语句。
处理结果。
1.1.2 繁琐的代码问题看一个插入对象的基本例子,这里增加一个用户对象。
public void addAccount(final Account account) throws DAOException,AccountAlreadyExistException {final Connection conn = getConnection();PreparedStatement pstmt=con.prepareStatement("insert into account values(?,?,?,?,?,?,?,?,?)");pstmt.setString(1, account.getUserName());pstmt.setInt(2, account.getPassWord());pstmt.setString(3, account.getSex());pstmt.setString(4, account.getQq());pstmt.setString(5, account.getMsn());pstmt.setString(6, account.getTel());pstmt.setString(7, account.getAddress());pstmt.setString(8, account.getHeight());pstmt.setString(9, account.getEnglevel());pstmt.execute();conn.Close();}这个操作很简单,就是把增加一个Account对象的对象逻辑转化为一个insert操作,即实现最简单的Account对象到数据库表account的映射。
上面是由开发人员手工编写JDBC 代码来实现。
如果Account对象的属性有上百个,就要写上百行的pstmt.setString()语句,很容易出错。
如果有另一个对象Person,也要写相近的代码来实现增加一个Person的操作。
类似的例子和代码在大量的项目中都存在。
从1996年JDBC出现到目前已经9年,大量的项目开发还在重复地编写这样的代码来实现这些每个项目都需要的基本操作。
开发数据访问层的工作量(开发和测试)极大,对开发人员的要求也很高。
最不幸的是,在大量的项目开发中都需要重复这种繁复的数据访问层的开发,从而导致大量的人力、物力和财力都浪费在这种人力密集型的数据访问层重复开发中,而数据库操作也恰恰是项目开发中最容易出错和消耗大量时间的部分。
如果在项目需要面对不同的数据库,则还需要为每个数据库开发一个专门的数据访问层。
显然这种每个项目都重复但却具备相同模式的代码是一种明显的浪费。
这就催生了O/R Mapping技术的产生。
ORM即Object-Relation Mapping,它的作用是在关系型数据库和对象之间作一个自动映射,这样在具体的操作数据库时,就不需要再与复杂的SQL语句打交道,只要像操作对象即可,O/R Mapping工具会自动地将对象的操作转换为SQL语句操作。
这样就只需要关注业务逻辑中的对象架构,而不是底层的重复性SQL和JDBC代码。
1.1.3 多表连接问题比如一个学校,在数据库中建立多张表,分别命名为班级表、学生基本信息表、学生成绩表、学生选课表、老师基本信息表和老师教授班级表,如果有一个条件查询,需要得知学生基本信息、成绩和选课信息,则要在SQL语句中用连接查询3个表。
这无可非议。
关键这种复杂的SQL语句相当难以维护。
当彻底删除一个学生资料时,需要把数据库中有关此学生的资料都删除,在此需要根据学生id把学生基本信息表、学生成绩表、学生选课表中的学生资料都删除,程序员必须知道关于学生的表有哪几张,并且对这几张表进行操作。
工作原理是比较简单的,但真正实施起来,编写和维护代码都非常不便。
1.1.4 表间级联问题仍然使用1.1.3小节中学校的例子来讲解。
相关对象通俗一点讲,学校是爷爷,班级是父,学生是子。
如果要删除一个班级,直接使用JDBC的话,这种操作对于程序员来说极其繁琐。
需要按照以下的操作进行:(1)首先在班级信息表中找到班级,取得班级id,然后删除此班级的基本信息。
(2)根据班级id删除此班级所有学生的基本信息。
(3)删除每个学生所对应的资料(例如成绩表、选课表等)。
(4)如果还有级联,则递归地把级联信息删除。
使用JDBC非常熟练的程序员,也不得不花费很多精力在这种级联关系的数据库操作上,而真正需要关心的业务逻辑在精力花费中的比重就降低了。
这不得不说是JDBC让人头痛的地方。
1.1.5 层与层之间的耦合严重不管是面向过程/结构的开发方法还是面向对象的开发方法,几乎所有的项目和产品的软件开发中都必须涉及关系数据库的数据存取更新等问题。
和关系数据库打交道是所有项目产品开发中首先需要面对的,目前的开发技术需要为每个项目开发一个数据访问层(Data Access Layer)来作为商业逻辑代码的基础,如图1-1所示。
用户界面业务逻辑层数据访问层OB2Oracle SQL Server Sybase图1-1 系统的分层结构JDBC实际上是数据访问层,通过它访问和操作数据层的数据库。
然而,作为数据访问层的编程人员,必须要很熟悉SQL语句,并且对底层的数据表了如指掌,例如哪个表中有什么字段以及字段的意义等程序员都必须知道。
这样的话,经常的做法是,程序员本身兼职DBA。
因为此时数据访问层和数据层是密不可分的。
使用ORM技术则不会存在这个问题。
数据层完全被隐藏了,暴露在程序员面前的只是一些JavaBean对象,在程序中通过JavaBean的属性来间接操作数据表中的字段。
当然这种操作的转换是由ORM产品来完成的,对于程序员来说,只是简单地做了一些getXXX和setXXX方法就可以完成对关系数据表的操作。
程序员不用知道什么时候数据库从MySQL移到DB2,或是移到SQL Server 2000,也不用知道数据库名是什么,表名是什么,字段是什么,对于他来说这没有关系。
甚至程序员可以不用知道SQL语句,可以不懂数据库的任何知识。
只需要在适当的时候,调用JavaBean的setXXX和getXXX方法,就可以取得和改变数据表字段的值;对于程序员来说,JavaBean就是存储信息的实体,对JavaBean的操作,就是对信息实体的操作(实际上是数据表)。
如此一来,设计人员只要把系统框架搭出来,把一些JavaBean交给程序员去实现业务逻辑即好。
这样的结构比程序员调用JDBC去操作数据库要清晰优雅得多。
1.1.6 性能问题对于insert操作,普通JDBC程序员这样来写:pstmt = conn.prepareStatement("insert into user_info values(?,?)");for (int i=0; i< list.length; i++) {pstmt.setString(1,(User)list.get(i).getName());pstmt.setString(2, (User)list.get(i).getPwd());pstmt.executeUpdate();}如果批量插入n条记录,那么就是n次向数据库发送SQL语句。
而ORM技术的Hibernate 则是采用了JDBC 2.0的batch功能。
for (int i=0; i<list.length; i++) {pstmt.setString(1,(User)list.get(i).getName());pstmt.setString(2, (User)list.get(i).getPwd());pstmt.addBatch();}pstmt.executeBatch();只是1次向数据库发送SQL,性能高下判若分明。
update操作与此类似。
select操作可以使用JCS缓冲查询结果,重复查询比JDBC肯定要快很多;分页操作可以使用数据库的分页SQL,或者使用JDBC2.0的scroll result。
另外,Hibernate总是尽量延迟向数据发送SQL,它会先把SQL语句缓冲在Session的缓冲区中,最后在flush时一次性的向数据库发送。
总体来说,当使用Hibernate时,相当于有一个JDBC高手来帮你优化JDBC调用,那点封装了一层的损失可以忽略不计。
1.2 使用ORM在时下的软件开发中,ORM这个词组越来越多地被人们提起。
前面已经介绍了,ORM 是对象到关系的映射,它把对表直接进行的操作变成对持久化类的属性和方法的直接操作,ORM层作为分层体系中的持久层。