美文网首页JPA 菜鸟教程
JPA 菜鸟教程 2 单表操作

JPA 菜鸟教程 2 单表操作

作者: JeGe | 来源:发表于2017-02-11 12:04 被阅读576次

    JPA

    Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点

    • 简化现有Java EE和Java SE应用的对象持久化的开发工作
    • Sun希望整合ORM技术,实现一统江湖。

    JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,他不能取代现有的Hibernate、TopLink等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。

    User

    package com.jege.jpa.single.table;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    /**
     * @author JE哥
     * @email 1272434821@qq.com
     * @description:单表
     */
    @Entity
    @Table(name = "t_user")
    public class User {
      @Id
      @GeneratedValue
      private Long id;
      private String name;
      private Integer age;
    
      public User() {
    
      }
    
      public User(String name, Integer age) {
        this.name = name;
        this.age = age;
      }
    
      public Long getId() {
        return id;
      }
    
      public void setId(Long id) {
        this.id = id;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public Integer getAge() {
        return age;
      }
    
      public void setAge(Integer age) {
        this.age = age;
      }
    
      @Override
      public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
      }
    
    }
    
    

    SingleTableTest

    package com.jege.jpa.single.table;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    /**
     * @author JE哥
     * @email 1272434821@qq.com
     * @description:单表CRUD Test
     */
    public class SingleTableTest {
      private static EntityManagerFactory entityManagerFactory = null;
      private EntityManager entityManager = null;
    
      @BeforeClass
      public static void setUpBeforeClass() throws Exception {
        entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
      }
    
      @Before
      public void persist() throws Exception {
        entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();
    
        User user = new User("je-ge", 22);
    
        System.out.println("保存之前:" + user);
        entityManager.persist(user);// JPA会自动把保存后的主键放到当前对象的id里面
        System.out.println("保存之后:" + user);
        System.out.println("+++++++++++++++");
      }
    
      @Test
      public void modify() throws Exception {
        User user = entityManager.find(User.class, 1L);
        System.out.println("修改前:" + user);
        user.setName("JE-GE");
        user.setAge(18);
        entityManager.merge(user);
        user = entityManager.find(User.class, 1L);
        System.out.println("修改后:" + user);
      }
    
      @Test
      public void find() throws Exception {
        User user = entityManager.find(User.class, 1L);
        System.out.println(user);
      }
    
      @Test
      public void remove() throws Exception {
        User user = entityManager.find(User.class, 1L);
        System.out.println("删除前:" + user);
        entityManager.remove(user);
        user = entityManager.find(User.class, 1L);
        System.out.println("删除后:" + user);
      }
    
      @After
      public void tearDown() throws Exception {
        entityManager.getTransaction().commit();
        if (entityManager != null && entityManager.isOpen())
          entityManager.close();
      }
    
      @AfterClass
      public static void tearDownAfterClass() throws Exception {
        if (entityManagerFactory != null && entityManagerFactory.isOpen())
          entityManagerFactory.close();
      }
    
    }
    
    

    核心API

    Persistence

    • 主要用于创建EntityManagerFactory,根据传入的Persistence Unit名称来创建对应的EntityManagerFactory。

    EntityManagerFactory

    • EntityManagerFactory中应保存了对应的persistence unit中的数据库配置信息和所有实体及关系以及预定义的JPQL语句。同时,EntityManagerFactory还负责维护二级缓存。
    • EntityManagerFactory对象的创建会有较大的开销,而且EntityManagerFactory对象采取了线程安全的设计方式,因此在实际中EntityManagerFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个EntityManagerFactory实例。

    EntityManager

    • 使用最广泛,类似于Hibernate的Session对象。
    • 它提供和持久化相关的操作。增、删、改、查等。并不是线程安全的,故一个EntityManager对象只可以由一个线程使用,并且避免多个线程共享。
    • 不过是轻量级的,创建和销毁不需要消耗太多资源。EntityManager中也有类似Hibernate Session的一级缓存。

    JPA中的注解

    • @Entity:将领域对象标注为一个实体,默认情况下类名为表名,通过@Table(name = "t_user")可以重新指定。
    • @Id:属性对应的表的主键。
    • @GeneratedValue:主键产生策略,通过startage属性指定。
    • @Column:属性对应的表字段。

    其他关联项目

    源码地址

    https://github.com/je-ge/jpa

    如果觉得我的文章或者代码对您有帮助,可以请我喝杯咖啡。
    **您的支持将鼓励我继续创作!谢谢! **

    微信打赏微信打赏
    支付宝打赏支付宝打赏

    相关文章

      网友评论

        本文标题:JPA 菜鸟教程 2 单表操作

        本文链接:https://www.haomeiwen.com/subject/krxoittx.html