Jpa 笔记

对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出SQL语句

Jpa规范

Jpa(Java Persistence Api) java持久层的api,是SUN公司提出的一套规范,也就是说,是由接口和抽象类组册,jpa本身不干活,真正干活的是hibernate,toplink等等对规范具体实现的框架, 有了这套规范之后,我们是面向这套规范编程的,也就是说,当我们想把项目中的Hibernate替换成toplink,我们的java代码是不需要修改的,而仅仅修改配置文件,切换jar包

上手: jpa规范 常见的注解

我们通过注解完成两件事:

实体类和数据表之间的关系的映射

实例类属性和数据表字段之前的映射

添加在类头上的注解

// 声明此类是实体类 @Entity // 声明此类是实体类 @Table(name = "表名")

标记主键

主键策略 作用
IDENTITY   自增(要求底层的数据库支持自增如mysql, Oracle就不支持)  
SEQUENCE   序列(要求底层的数据库支持序列, 如Oracle)  
TABLE   JPA的支援, JPA会帮我们唯一另一张表, 里面记载了本表的记录数  
AUTO   自适应,让程序根据运行的环境自动选择策略, 其实就是 TABLE策略  
@Id @GeneratedValue(strategy = GenerationType.AUTO)

实体类属性和表中的字段的映射

@Column(name = "表中的字段名") 进行CRUD的开发步骤:

加载配置文件, 得到实体管理类工厂

myJpa = Persistence.createEntityManagerFactory("myJpa")

通过实体管理类工厂获取实体管理器

myJpa.createEntityManager()

获取事务对象, 开启事务

EntityTransaction transaction = entityManager.getTransaction(); transaction.begin();

CRUD

提交事务

transaction.commit();

释放资源

entityManager.close();

注意点: 1. 如果不添加事务, 是不会持久化的 2. 获取实体管理类工厂的方法时耗时的,而且实体管理类工厂可重复使用,因此把他抽取出去, 类一加载就执行

常用方法

添加public void persist(Object entity);

根据主键Id查找public <T> T getReference(Class<T> entityClass, Object primaryKey);

根据主键Id查找public <T> T find(Class<T> entityClass, Object primaryKey);

删除public void remove(Object entity);

find()和getReference()的区别:
find立即执行,返回实体类对象,而和getReference返回的是实体类的代理对象, 懒加载,当我使用对象的属性时才执行查询语句

#### jpql

jpql: Java Persistence Query Language 根据实体类和属性进行查询

其中jpql没有select * 这种写法,而是直接省去了, 因为是面向对象的查询语言, 所以它的查询语句向下面这样写
java from 带包名的类的全路径/直接写类名

排序

from 类名 order by id desc/asc

统计数量

select count(id) from 类名

带条件的查询

EntityManager entityManager = JpaUtils.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); // 查询全部 String jpql = "from 类名 where name like ?"; // String jpql = "from 类名"; 可省略包名 Query query = entityManager.createQuery(jpql); // 参数1: 占位符的位置 // 参数2: 参数的值 query.setParameter(1,"张%"); query.getResultList().forEach(System.out::println); transaction.commit(); entityManager.close();

分页查询

EntityManager entityManager = JpaUtils.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); // 查询全部 String jpql = "from 类名"; Query query = entityManager.createQuery(jpql); // 对分页的参数赋值 // 起始索引 query.setFirstResult(0); // 分页参数, 每次查询两条 query.setMaxResults(2); // 查询,斌封装结果集 List resultList = query.getResultList(); resultList.forEach(System.out::println); transaction.commit(); entityManager.close(); Spring Data Jpa

SpringDataJpa是Spring对jpa的整合,封装,基于SpringDataJpa的规范我们可以更方便的进行持久层的操作, SpringDataJpa底层干活的是Hibernate框架

开发步骤

被spring整合后,相关的配置可通过spring.jpa....设置

做好实体类和数据表之间的关系的映射

面向接口编程,我们只要自己新建一个接口,并且继承JpaRepository和JpaSpecificationExecutor这两个接口就可以使用它的方法,而不需要关心实现类如何,就像下面:

public interface CustomerRepository extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {}

其中:

JpaRepository(继承自CRUDRepository) 封装了基本的CRUD

JpaSpecificationExecutor 封装了复杂查询

简单的CRUD
当我们使用自定义的Repository点一下的时,基本的CRUD基本上打眼一看就知道怎么使用了, 下面说一下,比较相似的方法

方法名 作用
getOne()   根据Id获取单个实体类,底层使用的是Jpa的getReference() 懒加载  
findOne()   同样是根据Id获取单个实体,立即加载  
save()   更新 若id存在 / 新增 若id为空  
支持自定义sql/jpql/方法命名规则,查询

使用注解@Query

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjsfz.html