1. JDO框架简介
Java数据对象(Java Data Objects,JDO)是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL)语句。JDO是作为Java数据库连接(JDBC)的一个补充来介绍的,而JDBC是一个支持使用SOL语句对流行的数据库程序进行访问的接口。有了 JDO,程序员就可以使用类来定义数据对象,然后支撑程序就会根据类的定义来管理对给定数据库的实际的数据访问了。
JDO中创建一个持久化(persistence)类就像创建一个序列化类一样简单。JDO支持批量数据的存储,数据一致性,并发处理和JDBC的查询功能。就像对象-关系映射软件和对象数据库一样,它允许使用面向对象的高级特性比如“继承”。
JDOHelper :javax.jdo.JDOHelper类拥有一些静态的助手(helper)方法。这个方法可以获得一个持久对象的生命周期还可以用来创建一个与具体实现厂商无关的PersistenceManagerFactory的实例,这里使用了工厂(factory)模式。
PersistenceManagerFactory:javax.jdo.PersistenceManagerFactory类可以通过JDOHelper类的助手方法获得,这是一个标准的工厂类,他可以创建PersistenceManager类。
PersistenceManager:javax.jdo.PersistenceManager接口是应用程序经常要使用的一个主要的JDO接口。每一个PersistenceManager负责控制一组持久化对象而且他还可以创建新的持久化对象或删除现有的持久化对象。Transaction和 PersistenceManager之间存在这一对一的关系,同时PersistenceManager又是Extent和Query的工厂类,也就是说这两个对象可以通过PersistenceManager创建。
PersistenceCapable:用户定义的持久化类都必须扩展实现PersistenceCapable接口。大多数JDO实现的供应商都提供一种“增强器”(enhancer)的功能,它可以向你要实现的持久化类中增加PersistenceCapable接口的实现。也就是说,其实你根本不会自己去实现这个接口。
Transaction:每一个PersistemceManager和javax.jdo.Transaction都是一一对应的。Transactions用来处理事务,它使得持久化数据可以成批的一次性添加到数据表中,如果出现异常就将数据回滚。
Extent:java.jdo.Extent是映射数据库中具体表的类的一个逻辑视图。Extent可以拥有自己的子类,它通过PersistenceManager获得。
Query:java.jdo.Query接口用具体的厂商JDO来实现,它负责处理JDO查询语言(JDOQL),这些JDOQL最终被解释为实际的数据库SQL语言。同样这个接口也是通过PersistenceManager获得的。
目前JDO框架:JPOX ,apache JDO, TJDO, DataNucleus等等.
2. DataNucles框架搭建步骤
创建eclipse maven项目
1.向pom.xml添加所需依赖包(使用Oracle需自行添加JAR)
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bugong</groupId>
<artifactId>DataNucleus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
<!-- JDO API -->
<dependencies>
<dependency>
<groupId>javax.jdo</groupId>
<artifactId>jdo-api</artifactId>
<version>3.1-rc1</version>
</dependency>
<!-- mysql数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
-->
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<!-- 下面为DataNucleus所需jar包 -->
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-enhancer</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jdo</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-jdo-query</artifactId>
<version>3.0.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-cache</artifactId>
<version>3.0.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-rdbms</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-management</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
</project>
- 类路径下新建一个 META-INF/persistence.xml文件,文件名称必须为persistence.xml且必须放在META-INF目录中,这是JDO规范中规定死的.
以下为项目目录结构
persistence.xml文件内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
<!-- 一个配置文件中可以有多个持久化单元(persistence-unit) RESOURCE_LOCAL表示本地事务 -->
<persistence-unit name="bugong" transaction-type="RESOURCE_LOCAL">
<class>com.bugong.Persons</class>
<exclude-unlisted-classes/>
<properties>
<property name="datanucleus.ConnectionDriverName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="datanucleus.ConnectionURL" value="jdbc:oracle:thin:@//192.168.111.137:1521/ORCL"/>
<property name="datanucleus.ConnectionUserName" value="scott"/>
<property name="datanucleus.ConnectionPassword" value="tiger"/>
<property name="datanucleus.autoCreateSchema" value="true"/>
</properties>
</persistence-unit>
</persistence>
datanucleus.autoCreateSchema=true表示在操作JDO API的时候对应的数据库表还没有创建的话会根据实体的元数据自动创建表
实体类Persons.java代码如下
package com.bugong;
import java.io.Serializable;
import javax.jdo.annotations.Column;
import javax.jdo.annotations.PersistenceCapable;
@PersistenceCapable(table="JDO_PERSON") --括号内可规定表名,不写默认实体类名
public class Persons implements Serializable {
@Column(name="P_NAME")
private String Name ;
@Column(name="P_SEX")
private String Sex ;
@Column(name="P_AGE")
private int Age ;
@Column(name="P_LEVEL")
private String Level;
protected Persons() {
}
public Persons(String name, String sex, int age, String level) {
Name = name;
Sex = sex;
Age = age;
Level = level;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public String getLevel() {
return Level;
}
public void setLevel(String level) {
Level = level;
}
@Override
public String toString() {
return "Persons{" +
"Name='" + Name + '\'' +
", Sex='" + Sex + '\'' +
", Age=" + Age +
", Level='" + Level + '\'' +
'}';
}
}
配置元数据即可以既使用XML配置文件,也可以使用注解,但个人习惯使用注解。要使一个类能够被JDO操作,必须在类上加上@PersistenceCapable注解,其table属性用于设置该实体对应的数据库表名称。@PrimaryKey用于表示这是主键,@Column(name=“P_AGE”)用于指定表字段名称,@Column不是必须的,这些注解即可放置在字段上,也可以放置在相应的getter方法上.JDO提供的注解有很多,有些注解还有很多属性,具体请参看:http://db.apache.org/jdo/annotations.html。
操作JDO
package com.bugong;
import javax.jdo.*;
public class MakePersistent {
public static void main(String[] args) {
//通过助手类获得PersistenceManagerFactory
PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory("bugong");
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
tx.begin();
Persons au = new Persons("swj","男",24,"登峰造极");
//Persons au = new Persons();
System.out.println("Persons: " + au.getName() + "/" + au.getLevel()
+ " Level");
pm.makePersistent(au);
tx.commit();
// tx.rollback();
// Can not read fields outside of transactions. Or set:
// pmf.setNontransactionalRead(true);
// System.out.println("Author: " + au.getName() + "/t" + au.getBooks()
// + " Books");
tx.begin();
String name = au.getName();
System.out.println("Persons: " + name);
tx.commit();
pm.close();
pmf.close();
}
}
- 下载eclipse datanucleus并配置
DataNucleus采用了一种增强机制,这正是引入datanucleus-enhancer包的原因。如果不进行增强直接运行会报:Found Meta-Data for class com.xtayfjpk.jdo.entity.Person but this class is not enhanced!! Please enhance the class before running DataNucleus.异常
右键项目>DataNucleus>add DataNucleus support
右键项目>DataNucleus>Enable Auto-Enhancement 勾选
勾选下方选择框
运行项目即可
参考资料
DataNucleus搭建指南
https://blog.csdn.net/xtayfjpk/article/details/25320499
https://github.com/hugua/huguaTicket
JDO介绍
http://db.apache.org/jdo/jdo_v_jpa_orm.html
https://blog.csdn.net/liuzhigang1237/article/details/6305113
ECLIPSE插件地址
http://www.datanucleus.org/downloads/eclipse-update/
集成sping框架
https://blog.csdn.net/cwfjimogudan/article/details/53646635