SpringData JPA个人笔记

230 阅读3分钟

概述

JPA是一种规范,保证了基于JPA开发的应用能够经过少量修改就可以在不同的JPA框架下进行。

搭建环境

创建maven工程 导入坐标

配置JPA的核心配置文件

  1. 配置到类路径下的META-INF,创建persistence.xml

image.png

  1. 导入约束 IDEA可以通过new->edit File Templates->JPA->persistence_2.0.xml 找到约束

image.png

image.png

  1. 配置persistence-unit节点 即持久化单元包含name:持久化单元名称、transaction-type:事务管理方式
  • name可以随便取名
  • transaction-type分为JTA 分布式管理 和 RESOURCE_LOCAL 本地事务管理
  1. 配置JPA的实现方式

  2. 配置数据库信息

  3. 配置可选配置 为了配置JPA实现方的配置信息

image.png

编写学生的实体类

image.png

配置实体类和表

类上:

  1. 对实体类设置@Entity注解
  2. @Table(name = "Student") 对应数据库的表

属性上:

  1. @Id 声明主键配置
  2. @GeneratedValue主键的生成策略
  3. @Colomun(name = "id") 属性映射字段

保存到数据库中

测试JPA的保存

  1. 加载配置文件创建工厂(实体管理器工厂)对象
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
  1. 通过实体管理器工厂获取实体管理器
EntityManager entityManager = factory.createEntityManager();
  1. 获取事务对象 开启事务
// 根据实体管理器获取事务
EntityTransaction transaction = entityManager.getTransaction();

// 开启事务
transaction.begin();
  1. 完成增删改查操作
// 实例化对象
Student student = new Student();
student.setName("zzzf");
student.setAge(18);
student.setSex("男");

// 保存对象
entityManager.persist(student);
  1. 提交事务
// 提交事务
transaction.commit();
  1. 释放资源
// 关闭
entityManager.close();
factory.close();

image.png

细节问题

主键策略

  • @GeneratedValue(strategy = GenerationType.INDETITY) 语法

  • GenerationType.INDETITY 代表自增

要求底层数据库支持自增

  • GenerationType.SEQUENCE 代表序列

要求底层数据库支持序列

  • GenerationType.TABLE jpa提供的一种机制 通过一张数据库的形式帮助我们完成主键自增
  • GenerationType.AUTO 由程序自动帮我们选择主键生成策略

增删改测试

抽取JPAUtil工具类

package com.my.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {
    // JPA的实体管理器工厂
    private static EntityManagerFactory factory;

    // 使用静态代码块赋值
    static {

        // 该方法参数必须和persistence.xml中persistence-unit标签name属性取值一致
        factory = Persistence.createEntityManagerFactory("myJpa");
    }


    /**
     * 使用工厂管理器创建一个对象
     * @return
     */
    public static EntityManager getEntityManager(){
        return factory.createEntityManager();
    }
}
  • 新增
    Customer student = em.find(Student.class,1L);

使用find方法查询查询的就是当前客户对象本身,在调用的时候就会发送sql语句查询
Customer customer = em.getReference(Customer.class,1L); 使用getReference方法查询查询的是一个动态代理对象,当调用查询结果对象的时候,才会发送sql查询,即延迟加载(懒加载)

  • 删除
    em.remove(student)
EntityManager entityManager = JPAUtil.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();

transaction.begin();
Student student = entityManager.find(Student.class, 1);
entityManager.remove(student);

transaction.commit();
entityManager.close();
  • 修改
    em.merge(student)

JPQL查询

概述

SQL:查询的是表和表中的字段
JPQL:查询的是实体类和类中的属性
两者语法非常相似

查询全部

@Test
public void testFindAll(){
    EntityManager entityManager = JPAUtil.getEntityManager();


    String jpql = "from Student";
    Query query = entityManager.createQuery(jpql);
    List resultList = query.getResultList();
    for(Object obj : resultList){
        System.out.println(obj);
    }

    entityManager.close();
}

分页查询

@Test
public void testFindByPage(){

    EntityManager entityManager = JPAUtil.getEntityManager();


    String jpql = "from Student";
    Query query = entityManager.createQuery(jpql);


    // 设置第二页
    query.setFirstResult(1);
    // 每页1条数据 则第二页第一条
    query.setMaxResults(1);
    List resultList = query.getResultList();

    for(Object obj : resultList){
        System.out.println(obj);
    }

    entityManager.close();

}

统计查询

@Test
public void findCount(){
    EntityManager entityManager = JPAUtil.getEntityManager();

    String jpql = "select count(id) from Student";
    Query query = entityManager.createQuery(jpql);
    Object count = query.getSingleResult();
    System.out.println(count);

}

条件查询

@Test
public void testFindByCondition(){
    EntityManager entityManager = null;
    try {
        entityManager = JPAUtil.getEntityManager();

        String jpql = " from Student where name like ?1 ";
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1,"%w%");
        Object singleResult = query.getSingleResult();
        System.out.println(singleResult);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        entityManager.close();
    }
}

排序

@Test
public void testOrder(){
    EntityManager entityManager = JPAUtil.getEntityManager();

    String jpql = "from Student order by id desc";
    Query query = entityManager.createQuery(jpql);
    List resultList = query.getResultList();

    for(Object o : resultList){
        System.out.println(o);
    }

}