Eclipselink对JPA的实现

来源:互联网 发布:巴黎圣母院副主教知乎 编辑:程序博客网 时间:2024/06/05 13:33

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


0 0