zoukankan      html  css  js  c++  java
  • JPA学习(1)基础认知

    JPA 是什么
      Java Persistence API:用于对象持久化的API。
      Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层:

    JPA和Hibernate的关系:

    JPA 是 hibernate 的一个抽象(就像JDBC和JDBC驱动的关系): JPA 是规范:JPA 本质上就是一种 ORM 规范,不是ORM 框架 —— 因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现 Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现 从功能上来说, JPA 是 Hibernate 功能的一个子集

    JPA 的供应商

      JPA 的目标之一是制定一个可以由很多供应商实现的 API,目前Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的实现HibernateJPA 的始作俑者就是 Hibernate 的作者 Hibernate 从 3.2 开始兼容 JPA OpenJPA OpenJPA 是 Apache 组织提供的开源项目 TopLink TopLink 以前需要收费,如今开源了.

    JPA的优势

      标准化: 提供相同的 API,这保证了基于JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。

      简单易用,集成方便: JPA 的主要目标之一就是提供更加简单的编程模型,在 JPA 框架下创建实体和创建 Java 类一样简单,只需要使用 javax.persistence.Entity 进行注释;JPA 的框架和接口也都非常简单,

      可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。

      支持面向对象的高级特性: JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面向对象的模型
    JP需要掌握的技术:
      ORM 映射元数据:JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。JPA 的 API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的 JDBC和 SQL代码中解脱出来。 查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的 SQL 紧密耦合。
      
      上面的都是一些认知,对编写代码没有什么帮助,下面就正式开始学习JPA,使用的IDE是Eclipse

      1,导入需要的架包,前面说了JPA知识一种规范,而不是具体的ORM框架,所以我使用的供应商是Hibernate,毕竟大部分人对hibernate还是很熟悉的,导入hibernate
      所需要的架包,

    ,还有hbernate jpa架包,另外就是数据库驱动,因为mysql使用起来比较方便,所以使用的是mysql数据库,所以我们还需要添加mysql驱动
    2,架包都准备好了以后,接下来就创建工程,我们直接可以在Eclipse中直接闯将jpa工程,直接创建的好处就是能够帮我们把基本的环境搭好,其实就是在META-INF下面创建了一个persistence.xml,这是配置文件十分重要,就像hibernate的hbm.xml文件一样,所有的配置都将在这里设置

    3创建完工程以后,我们现在来设置设置配置文件:
      

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" 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_2_0.xsd">
        <persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL">
            <!-- 配置使用什么ORM产品 -->
            <!--
            需要注意的是:
            1.实现的ORM策略是继承 javax.persistence.spi.PersistenceProvide接口,
            2如果项目中只有一个JPA实现产品,那么不指定也是可以的
            
             -->
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <!-- 添加持久化类 -->
            
            <class>com.hotusm.commom.entity.User</class>
            <properties>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
                <property name="javax.persistence.jdbc.user" value="root"/>
                <property name="javax.persistence.jdbc.password" value="1234"/>
                
                <!-- 配置jpa实现产品 -->
                <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.hbm2ddl.auto" value="update"/>
                <property name="hibernate.format_sql" value="true"/>
                
            </properties>
        </persistence-unit>
        
    </persistence>

       直接看其中的注释就明白意思了,其实发现这个配置文件和hibernate的配置文件真的很像,

    4配置了这些以后,我们就可以创建实体类了

    package com.hotusm.commom.entity;
    
    import java.io.Serializable;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    
    @Table(name="USER")
    @Entity
    public class User implements Serializable{
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private Integer id;
        private String name;
        
        private String userDesc;
    
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Id
        public Integer getId() {
            return id;
        }
        
        public void setId(Integer id) {
            this.id = id;
        }
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        @Column(name="user_desc")
        public String getDesc() {
            return userDesc;
        }
    
        public void setDesc(String desc) {
            this.userDesc = desc;
        }
        
    
    }
    这些注解都是我们一眼就能看出来什么什么意思。
    @Entity指的是将这个实体映射程数据库中的表,需要注意的是,如果我们不想在数据库中使用和VO名称一样的表名,我们可以使用@Table(name="USER")来声明表名,其实我这里写不写都是一样的,②对于数据表,我们必须要有一个主键,个@Id就是注解主键的,@GeneratedValue()代表的是主键的生成策略,在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略: IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式; AUTO: JPA自动选择合适的策略,是默认选项; SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式 TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
    ③对于其他的字段,只要是属性,就能够生成对应数据表的字段,对于我们想取别的名字,我们可以使用@Column()来指明字段名称,忘记说的是我们既可以在getter方法上注解,也可以在属性上注解,嗾使同样的效果

    5,我们就可以进行数据的操作了,下面是代码:
    package com.hotusm.common.test;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    import com.hotusm.commom.entity.User;
    
    public class Main {
        
        public static void main(String[] args) {
            //1.创建EntityManagerFactory
            EntityManagerFactory factory=Persistence.createEntityManagerFactory("jpa-1");
            //2.创建EntityManager
            EntityManager em=factory.createEntityManager();
            //3.开启事务
             EntityTransaction et=em.getTransaction();
             et.begin();
            //4.进行持久化操作
             User user=new User();
             user.setDesc("123");
             user.setName("lqb");
             //user.setId("1");
             em.persist(user);
            //5提交事务
             et.commit();
            //6关闭EntitiyManager
             em.close();
            //7关闭EntityManagerFactory
             factory.close();
        }
    }

    这些就是jpa的helloworld,其他的慢慢在博客中更新吧




      

  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/zr520/p/5006941.html
Copyright © 2011-2022 走看看