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语句紧密耦合。
JPA特点:
1、JPA允许开发人员直接使用对象而不是SQL语句,JPA实现通常称为持久性提供程序。JPA可用于Java-EE、Java-SE应用程序。
2、通过JPA,开发人员可以将关系数据库中的数据映射,存储,更新和检索到Java对象,反之亦然。
3、通过持久性元数据定义JAVA对象和数据库表之间的映射。JPA提供程序将使用持久性元数据信息来执行正确的数据库操作。
下面通过注解的方式来做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多租户的实现,请见下篇博客!