### JPA 简介
JPA (``Java Persistence API``) ,Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中的持久化模型。
JPA 为对象关系映射提供了一种基于 POJO 的持久化模型 :
**JPA 包括以下3方面的内容**:
- 一套 API 标准。在 javax.persistence 的包下面,用来操作实体对象,执行 CRUD 操作,框架在后台替代我们完成所有的事情,开发者从烦琐的 JDBC 和 SQL 代码中解脱出来。
- 面向对象的查询语言:Java Persistence QueryLanguage(JPQL)。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合
- ORM(object/relational metadata)元数据的映射。JPA 支持 XML 和 JDK5.0注 解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
### Spring Data
Spring Data 提供一个大家熟悉的、一致的、基于Spring的数据访问编程模型,同时仍然保留底层数据存储的特殊特性。它可以轻松地让开发者使用数据访问技术,包括关系数据库、非关系数据库(NoSQL)和基于云的数据服务。
Spring Data JPA 是 Spring Data 项目中的一个模块,可以理解为 JPA 规范的再次封装抽象。
## 2.2.JPA 中常用注解
### java 对象与数据库字段转化
- @Entity:标识实体类是 JPA 实体,告诉 JPA 在程序运行时生成实体类对应表
- @Table:设置实体类在数据库所对应的表名
- @Id:标识类里所在变量为主键
- @GeneratedValue:设置主键生成策略(依赖于具体的数据库)
- @Column:表示属性所对应字段名进行个性化设置
- @Transient:表示属性并非数据库表字段的映射,ORM框架将忽略该属性
- @Temporal:将日期字段转化成 java.util 包中的时间日期类型。注入数据库的类型有三种:
- TemporalType.DATE(2008-08-08)
- TemporalType.TIME(20:00:00)
- TemporalType.TIMESTAMP(2008-08-08 20:00:00.000000001)
- @Enumerated:使用此注解映射枚举字段,以String类型存入数据库。注入数据库的类型有两种:EnumType.ORDINAL(Interger)、EnumType.STRING(String)
- @Embeddable、@Embedded: 当一个实体类要在多个不同的实体类中进行使用,而其不需要生成数据库表。
- @Embeddable:注解在类上,表示此类是可以被其他类嵌套
- @Embedded:注解在属性上,表示嵌套被@Embeddable注解的同类型类
- @ElementCollection:集合映射
- @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy:表示字段为创建时间字段(insert自动设置)、创建用户字段(insert自动设置)、最后修改时间字段(update自定设置)、最后修改用户字段(update自定设置)
- @MappedSuperclass:注解的类继承另一个实体类 或 标注@MappedSuperclass类,他可使用@AttributeOverride 或 @AttributeOverrides注解重定义其父类属性映射到数据库表中字段。
### java对象与json转化
- @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8"):将Date属性转换为String类型, timezone解决(相差8小时)
- @JsonSerialize:作用在类或字段上,转化java对象到json格式(需自定义转化类继承JsonSerializer<T>)
- @JsonDeserialize:作用在类或字段上,转化json格式到java对象(需自定义转化类继承JsonDeserializer<T>)
- @JsonProperty:作用在属性上,把属性名称序列化为另一个名称(trueName属性序列化为name)
- @JsonIgnoreProperties(ignoreUnknown = true):作用在类上,忽略掉json数据里包含了实体类没有的字段
- @JsonIgnore:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响
## 2.2.Spring Data JPA 中常用注解
通过简单注解来实现精简代码来达到消除冗长代码的目的。
### 常用注解
- ``val``:用在局部变量前面,相当于将变量声明为 final
- ``@NonNull``:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NPE(NullPointerException)
- ``@Cleanup``:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成 try-finally 这样的代码来关闭流
- ``@Getter/@Setter``:用在属性上,再也不用自己手写 setter 和 getter 方法了,还可以指定访问范围
- ``@ToString``:用在类上,可以自动覆写 toString 方法,当然还可以加其他参数,例如 @ToString(exclude=”id”) 排除 id 属性,或者 @ToString(callSuper=true, includeFieldNames=true) 调用父类的 toString 方法,包含所有属性
- ``@EqualsAndHashCode``:用在类上,自动生成 equals 方法和 hashCode 方法
- ``@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor``:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有 @NonNull 属性作为参数的构造函数,如果指定 staticName = “of” 参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多
- ``@Data``:注解在类上,相当于同时使用了 @ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor 这些注解,对于 POJO 类十分有用
- ``@Value``:用在类上,是 @Data 的不可变形式,相当于为属性添加 final 声明,只提供 getter 方法,而不提供 setter 方法
- ``@Builder``:用在类、构造器、方法上,为你提供复杂的 builder APIs,让你可以像如下方式一样调用 Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build(); 更多说明参考 Builder