JPA
Java 持久化 API,是官方定义的基于注解形式的技术规范,
进行对象关系映射(ORM),对象与表的映射,对象之间的关系与表之间关系的映射
封装了 JDBC 操作(在其基础之上)
存在多种技术实现,如 hibernate、toplink,
API 架构基于 抽象工厂设计模式
JPA vs JDBC
JPA 中有哪些注解,他们的意义?
// 实体类,状态需要持久化的类
@Entity
// 映射当前类到特定的数据库(schema)、表(table)
@Table
// 映射主键(PK)
@Id
// 映射到表的列(字段)
@Column
// 一对一
@OneToOne
// 一对多
@OneToMany
// 瞬时,该字段不持久化(不往表里存,表中无对应的列)
@Transient
// 不在 JPA 中,是 Spring/Spring Data 中最核心的注解
@Repository
// 相关接口 `Repository`
自定义的 Repository
接口通常继承哪些接口?
Repository
- 定义持久化定义的根,空接口CrudRepository
- 定义基础增删改查操作PagingAndSortingRepository
- 定义分页和排序操作JpaRepository
- 额外增加了基于 JPA 的查询操作
JPA 与 MyBatis 的关系 / 使用场景 / 优缺点?
JPA 是官方的 ORM 技术规范,有多种实现(hibernate, toplink),
不需要写 SQL,定义了一组标准的 Java API 高度底层封装了 JDBC 操作
自动化
入门容易,性能优化及高阶特定学习曲线高
数据模型相对简单,使用起来很方便;数据模型复杂,难度较大
也可以嵌套 SQL 语句,但是有独立的查询语言
MyBatis 是一个第三方框架,实现了 Java 的 SQL 映射,
需要写 SQL,封装了 JDBC 操作
半自动化
相对容易掌握和使用
适用与各种场景和需求(可优化 SQL 语句)
MyBatis 进行 SQL 映射
- 基于 XML(接口和对应的 XML 映射文件)
- 基于注解(接口和注解)- Java 5 / 2004
MyBatis 中有哪些常用的注解?
@Mapper
// 基础 CRUD 操作
@Insert
@Select
@Delete
@Update
// 动态 SQL
@InsertProvider
@SelectProvider
@DeleteProvider
@UpdateProvider
// 参数别名,非 POJO 的多个参数
@Param
// 字段映射
@Results
@Result
@ResultMap
// 连接表
@One
@Many
Spring MVC 中的注解
// TODO 你去继续完成
Spring Data 很重要
Spring Data 包含以下子项目:
- Spring Data JDBC - Spring 提供的 SQL 映射技术,进行了 JDBC 封装
- Spring Data JPA / MyBatis
- Spring Data MongoDB
- Spring Data Redis
- Spring Data …
Spring Data 中的 Repository
接口及注解是通用的公共的根
文档
Spring Data JPA/MongoDB 基于方法名的查询
interface PersonRepository extends CrudRepository<Person, Long> {
// 约定优于配置
// 方法名就是查询的过滤条件或排序规则
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
属性表达式
// 方案一
List<Person> findByAddressZipCode(ZipCode zipCode);
// 方案二
List<Person> findByAddress_ZipCode(ZipCode zipCode);
Spring Boot 数据持久化到关系数据库的几种方案
- MyBatis - SQL 映射
- Spring Data JPA - ORM 映射
- Spring Data JDBC - 底层 / SQL 映射