Eclipselink对JPA的实现

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多租户的实现,请见下篇博客!


你可能感兴趣的:(orm,jpa,eclipselink,数据持久化)