JPA入门案例之完成CRUD操作

JPA入门案例之完成CRUD操作

Scroll Down

JPA的API介绍

Persistence

Persistence对象主要作用是用于获取EntityManagerFactory对象的 。通过调用该类的createEntityManagerFactory静态方法,根据配置文件中持久化单元名称创建EntityManagerFactory。

EntityManagerFactory

EntityManagerFactory 接口主要用来创建 EntityManager 实例。由于EntityManagerFactory 是一个线程安全的对象(即多个线程访问同一个EntityManagerFactory 对象不会有线程安全问题),并且EntityManagerFactory 的创建极其浪费资源,所以在使用JPA编程时,我们可以对EntityManagerFactory 的创建进行优化,只需要做到一个工程只存在一个EntityManagerFactory 即可。

EntityManager

在 JPA 规范中, EntityManager是完成持久化操作的核心对象。实体类作为普通 java对象,只有在调用 EntityManager将其持久化后才会变成持久化对象。EntityManager对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。

我们可以通过调用EntityManager的方法完成获取事务,以及持久化数据库的操作

方法说明:

  • getTransaction : 获取事务对象
  • persist : 保存操作
  • merge : 更新操作
  • remove : 删除操作
  • find(立即加载)/getReference(延迟加载) : 根据id查询

EntityTransaction

在 JPA 规范中, EntityTransaction是完成事务操作的核心对象。

方法说明:

  • begin:开启事务
  • commit:提交事务
  • rollback:回滚事务

实现简单的CRUD操作

添加用户

public class JpaTest {
    private EntityManagerFactory factory;

    @Before
    public void init() {
        // 1.加载配置文件,创建实体管理器工厂
        factory = Persistence.createEntityManagerFactory("myJpa");
    }

    /*
     * 保存用户
     * */
    @Test
    public void testSave() {
        // 2.通过实体管理器工厂获取实体管理器
        EntityManager em = factory.createEntityManager();
        // 3.获取事务对象
        EntityTransaction tx = em.getTransaction();
        // 4.开启事务
        tx.begin();

        User user = new User();
        user.setUsername("张三");
        user.setPassword("123456");
        // 5.保存操作
        em.persist(user);
        // 6.提交事务
        tx.commit();
        // 7.关闭实体管理器对象
        em.close();
    }
}

根据id查询用户

@Test
public void testFindById() {
        EntityManager entityManager = factory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        User user = entityManager.find(User.class, 3L);// 立即加载
//        User user = entityManager.getReference(User.class, 3L);// 延迟加载
        System.out.println(user);
        transaction.commit();
        entityManager.close();
}

find/getReference 参数:

  • class : 查询结果需要包装的实体类的字节码
  • id:查询的主键

修改用户

重点必须在一个事务中才可以修改实体类自动更新,否则需要手动执行更新操作

@Test
public void testUpdate() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        // 先根据id查找到用户
        User user = em.find(User.class, 3L);
        // 修改用户信息
        user.setUsername("哇哈哈1");
        // 更新操作,在一个事务中可自动更新,此处merge方法可以省略
        // em.merge(user);
        tx.commit();
        em.close();
}

删除用户

@Test
public void delete() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // 先查找到用户
        User user = em.find(User.class, 1L);
        // 把该用户删除
        em.remove(user);
        tx.commit();
        em.close();
}

JPA中的jpql查询

JPQL全称Java Persistence Query Language

  • sql:查询的是表和表中的字段
  • jpql:查询的是实体类和类中的属性

查询全部用户

@Test
public void testFindAll() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // 创建jpql查询语句
        String s = "from User";
        // 创建query对象
        Query query = em.createQuery(s);
        // 得到返回的集合
        List resultList = query.getResultList();
        resultList.forEach(v -> System.out.println(v));
        tx.commit();
        em.close();
}

根据id倒序查询全部用户

@Test
public void testOrder() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // 创建jpql查询语句
        String s = "from User order by id desc";
        // 创建query对象
        Query query = em.createQuery(s);
        // 得到返回的集合
        List resultList = query.getResultList();
        resultList.forEach(v -> System.out.println(v));
        tx.commit();
        em.close();
}

统计用户个数

@Test
public void testCount() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // 创建jpql查询语句
        String s = "select count(id) from User";
        // 创建query对象
        Query query = em.createQuery(s);
        // 得到返回的集合
        Object o = query.getSingleResult();
        System.out.println("用户个数:"+o);
        tx.commit();
        em.close();
}

分页查询

@Test
public void testPage() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // 创建jpql查询语句
        String s = "from User";
        // 创建query对象
        Query query = em.createQuery(s);
        // 设置起始索引  
        query.setFirstResult(0);
        // 每页查询的条数
        query.setMaxResults(5);
        for (Object o : query.getResultList()) {
            System.out.println(o);
        }
        tx.commit();
        em.close();
}

条件查询

@Test
public void testCondition() {
        EntityManager em = factory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        // 创建jpql查询语句
        String s = "from User where username like :username ";
        // 创建query对象
        Query query = em.createQuery(s);
        // 设置参数
        query.setParameter("username", "%张三%");
        for (Object o : query.getResultList()) {
            System.out.println(o);
        }
        tx.commit();
        em.close();
}