JPA是什么?怎样开发JPA应用?

为什么使用JPA?

ORM框架不止一种,包括JDO,iBatis,TopLink,KODO,OpenJPA等等多种开源的和商业的产品。那么这有什么问题呢?假设现在我们的项目是用Hibernate开发的,运行于
Oracle数据库之上,然而上线运行一段时间后,发现有一些性能上的问题,而这时候我们想找人来做技术支持,希望它来帮我们解决这些问题,因为开发人员并不是个个都能读懂
Hibernate的源码然后找到问题所在的。这是第一种可能:客户(通常是有钱的大客户)希望能在遇到问题时有人提供商业的技术支持和顾问服务。第二种可能:Oracle公司推出了
专用于对Oracle数据库特别优化过的ORM产品,名为TopLink,然而很不幸,虽然它能解决我们的问题,但是,因为Hibernate的类库的包结构和TopLink的相差太远,一个是以
org.hibernate开头的,另一个却是以com.oracle开头的,更要命的是,两者之间的类库根本就没有相似之处!那我们的项目并不能通过简单的将代码的包换一下,就能迁移成功,下载岂不是要所有涉及Hibernate的地方都得重写!换句话说,当我们使用Hibernate或者其
它ORM框架开发时,我们的代码已经被绑死了!虽然代码是和数据库无关的,然而数据库访问的Java代码却是死死的和某种框架绑定在一起了。


1创建JPAHello项目

1.1创建表格

CREATE TABLE Student(
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(200) NOT NULL,
    PASSWORD VARCHAR(20) NOT NULL,
    age INT,
    PRIMARY KEY(id)
)ENGINE=MYISAM DEFAULT CHARSET=GBK;




1.2创建 HelloJPA Java Project

在MyEclipse 中我们可以将 JPA 开发功能添加到很多种项目上,一般最常见的恐怕就
是添加到Java项目或者Web项目上了。在本节我们打算用简单的Java Project ,便于展
示JPA如何工作。
首先确保已经打开了MyEclipse Java Enterprise透视图,然后进行下列操作:
1.  从MyEclipse 菜单栏选择  File > New > Java Project,接着会打开  New Java
Project 向导;
2.  输入 HelloJPA到 Project name ;
3.  在Project Layout 下选中 Create separate source and output folders 单选钮;
4.  点击Finish按钮关闭对话框。
这样Java项目就建立完毕了。稍等片刻会弹出一个切换透视图的对话框,为了避免造成更
多的麻烦,我们一般选择No按钮就可以了。


1.3添加 JPA Capabilities 到现有项目

按图执行以下操作:

JPA是什么?怎样开发JPA应用?_第1张图片


JPA是什么?怎样开发JPA应用?_第2张图片

JPA是什么?怎样开发JPA应用?_第3张图片

JPA是什么?怎样开发JPA应用?_第4张图片




1.4 使用JPA配置文件编辑器修改文件

打开/src/META-INF/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_1_0.xsd" version="1.0">
    
    <persistence-unit name="JavaEE_JPAPU"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>dao.Student</class>
        <properties>
            <property name="hibernate.connection.driver_class"
                value="com.mysql.jdbc.Driver" />
            <property name="hibernate.connection.url"
                value="jdbc:mysql://127.0.0.1:3310/jpa" />
            <property name="hibernate.connection.username" value="root" />
            <property name="hibernate.connection.password"
                value="123456" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.dialect"
                value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.cache.provider_class"
                value="org.hibernate.cache.NoCacheProvider" />
        </properties>
    </persistence-unit>

</persistence>





1.5 使用反向工程快速生成JPA实体类和DAO

首先打开MyEclipse Database Explorer透视图。切换透视图有两种办法,如何切换请参考3.1.3透视图(Perspective)切换器。一种比较快办法是如那一节介绍的,点击工具栏上的点击 按钮可以显示多个透视图供切换,如图3.3所示,然后单击其中的MyEclipse Database Explorer 即可切换到此透视图;另一种办法是选择菜单  Window > Open Perspective > Other > MyEclipse Database Explorer来显示打开透视图对话框,然后点击OK按钮。


按图步骤操作:

JPA是什么?怎样开发JPA应用?_第5张图片
JPA是什么?怎样开发JPA应用?_第6张图片

1.6 调整生成的实体类标注

调整后的实体类如下:

package dao;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Student entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "student", catalog = "jpa")
public class Student implements java.io.Serializable {

    // Fields

    private Integer id;
    private String username;
    private String password;
    private Integer age;

    // Constructors

    /** default constructor */
    public Student() {
    }

    /** minimal constructor */
    public Student(String username, String password) {
        this.username = username;
        this.password = password;
    }

    /** full constructor */
    public Student(String username, String password, Integer age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    // Property accessors
    @Id
    @Column(name = "id", unique = true, nullable = false, insertable = true, updatable=true)
    @javax.persistence.GeneratedValue(strategy=javax.persistence.GenerationType.IDENTITY)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "username", nullable = false, length = 200)
    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name = "password", nullable = false, length = 20)
    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Column(name = "age")
    public Integer getAge() {
        return this.age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}




1.7 编写测试代码


package test;
import java.util.List;
import dao.*;

public class JPATest {
    public static void main(String args[]){
        //创建dao
        StudentDAO dao = new StudentDAO();
        //创建实体类
        Student user = new Student();
        user.setUsername("hellojpa test");
        user.setPassword("jpa password");
        user.setAge(20);
        EntityManagerHelper.beginTransaction();
        //保存
        dao.save(user);
        //提交事务真正保存实体到数据库
        EntityManagerHelper.commit();
        
        //列出数据库中所有对象
        List<Student> result  = dao.findAll();
        for(Student o: result){
            System.out.println(o.getId());
            System.out.println(o.getUsername());
        }
        //更改用户名
        user.setUsername("测试JPA");
        
        //开始事务
        EntityManagerHelper.beginTransaction();
        dao.update(user);
        
        //提交事务真正保存实体到数据库
        EntityManagerHelper.commit();
        
        //查找所有年龄为20的用户,从第1个开始获取(0为第一个用户)
        result  = dao.findByAge(20, 0);
        
        for(Student o:result){
            System.out.println(o.getId());
            System.out.println(o.getUsername());
        }
        
        //根据用户ID查找
        user = dao.findById(2);
        
        System.out.println(user.getUsername());
        
        //删除
        //开始事务
        EntityManagerHelper.beginTransaction();
        //保存(JPA会自动更新变动过的字段)
        dao.delete(user);
        
        //提交事务真正保存实体到数据库
        EntityManagerHelper.commit();    
        
    }
}


测试结果:

JPA是什么?怎样开发JPA应用?_第7张图片

JPA其他部分:

JPA生成一对多等复杂映射代码

Spring整合JPA开发

参见文档:http://download.csdn.net/detail/xueyedie1234/4746521

你可能感兴趣的:(JPA是什么?怎样开发JPA应用?)