转载

Spring中的基础知识

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 映射

  1. 基于 XML(接口和对应的 XML 映射文件)
  2. 基于注解(接口和注解)- 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 数据持久化到关系数据库的几种方案

  1. MyBatis - SQL 映射
  2. Spring Data JPA - ORM 映射
  3. Spring Data JDBC - 底层 / SQL 映射
正文到此结束
本文目录