对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出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 JpaSpringDataJpa是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