WHAT?
什么是Eclipselink?--请点击
什么是JPA?
JPA-Java Persistence API ,JPA通过JDK5.0注解或XML描述 对象-关系表 的映射关系,并将运行期的实体对象持久化到数据库中。 JPA是ORM的一种可能的方法,JPA是一个规范,有几个实现可用,流行的实现是Hibernate,EclipseLink和Apache OpenJPA!
JPA的由来:
SUN公司引入新的JPA ORM规范出于两个原因:
1、简化现有JAVA EE 和Java SE 应用开发工作
2、SUN希望整合ORM技术,实现天下归一。
JPA的技术实现:
1、ORM映射元数据
JPA支持 XML 和 JDK5.0注解2种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
2、API
用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
3、查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语句查询数据,避免程序的SQL语句紧密耦合。
WHY?
JPA特点:
1、JPA允许开发人员直接使用对象而不是SQL语句,JPA实现通常称为持久性提供程序。JPA可用于Java-EE、Java-SE应用程序。
2、通过JPA,开发人员可以将关系数据库中的数据映射,存储,更新和检索到Java对象,反之亦然。
3、通过持久性元数据定义JAVA对象和数据库表之间的映射。JPA提供程序将使用持久性元数据信息来执行正确的数据库操作。
HOW?
下面通过注解的方式来做Eclipselink对JPA的实现例子。
1、准备工作:
需要安装:
类库:Eclipselink,MySQL-connector-j
数据库:MYSQL
开发环境:我用的MyEclipse
JPA类库、
MySQL的jdbc驱动:mysql-connector-javax.jar
jar包需要:
目录结构如下:
其中:Eclipselink.jar和java.persistence.x.jar,定义代码里的映射关系对应的底层实现就是由这两个包实现。
数据库表:
2、代码实现:
Persistence.xml
备注:ORM,为了映射到数据库,这些配置,都写在这个文件里。
<?xml version="1.0" encoding="UTF-8"?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">
<!--persistence-unit:定义了这个unit的名字以及详细的数据库连接驱动,数据库用户名,密码。 -->
<!--这个employeeService跟main方法里的createEntityManagerFactory值一致 -->
<!-- 如果我们需要访问多个库的话,在配置文件里也可以定义多个persistence-unit。有了这个factory之后我们再创建一个EntityManager对象 -->
<persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
<!-- <class>里面定义的是需要映射到数据库的具体实体类 -->
<!-- PersonInformation对应model的.java文件-->
<class>model.PersonInformation</class>
<properties>
<!--因为我们要连的数据库是mysql,这里的javax.persistence.jdbc.driver值被设为com.mysql.jdbc.Driver。 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<!--具体要连接的数据库名字在javax.persistence.jdbc.url对应的值里面定义了,为shop -->
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/shop" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="root" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
</persistence>
PersonInformation.java
package model;
/**
* 定义一个可以具体实例化到数据库里的对象
*/
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
//@Entity表示一个可以序列化映射的的对象 ,如果我们希望这个对象被映射到数据库中的某个表,则必须要加上这个annotation
@Entity
//这里通过table来设定对应的数据库表名字是什么
@Table(name="PersonInformation")
public class PersonInformation {
//而@Id则表示对应表的主键。我们建一个表要求有对应的主键。
//这里指定id为主键。如果我们不指定主键的话则运行的时候会出错
@Id
//它表示这个主键的值可以自动来生成,而后面的GenerationType.IDENTITY表明它的生成方式是自动增长
@GeneratedValue(strategy = GenerationType.IDENTITY)
//@Column这个用来设定对应的数据库字段名
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="age")
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Main.java
package main;
/**
* 有了model定义之后,这里是通过他们访问数据库的代码
*/
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import model.PersonInformation;
public class Main {
/*private static final String PERSISTENCE_UNIT_NAME = ;
private static EntityManagerFactory factory; */
public static void main(String[] args) {
//第一个需要创建的对象是EntityManagerFactory
//这个employeeservice是根据配置文件里的persistence-unit name一致。
//如果我们需要访问多个库的话,在配置文件里也可以定义多个persistence-unit。有了这个factory之后我们再创建一个EntityManager对象。
EntityManagerFactory factory = Persistence.createEntityManagerFactory("EmployeeService");
EntityManager em = factory.createEntityManager();
// 为了使得对象的创建成为一个事务来提交,我们通过em.getTransaction().begin(); em.getTransaction().commit();这两个方法来完成整个数据插入的过程。
em.getTransaction().begin();
PersonInformation person = new PersonInformation();
person.setId(10);
person.setAge(61);
person.setName("fred");
em.persist(person);
em.getTransaction().commit();
em.close();
}
}
效果:
实现了JPA!
Eclipselink多租户的实现,请见下篇博客!