文章目录

  • JPA的使用
  • 一、JPA介绍
  • 二、JPA实体类的创建
  • 三、简单方法的使用
  • 预先生成方法


JPA的使用

一、JPA介绍

Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作

二、JPA实体类的创建

1. 实体类注解

@Data
@Entity 
@Table(name = "表名", schema = "用户名") 
@NoArgsConstructor  // 生成一个无参数的构造方法
@AllArgsConstructor // 会生成一个包含所有变量
@GenericGenerator(name = "uuid", strategy = "uuid")

2. 主键

@Id 
 @GeneratedValue(generator = "uuid")
 @Column(name="ID")
 private String id;

3. 其他参数

@Column(name="NAME")
 private String name;
 @Column(name="TIME")
 private Date time;

4. 一对多

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,mappedBy = "多方属性名") 
@OrderBy("排序字段 ASC")

5. 多对一

@ManyToOne(cascade={CascadeType.REFRESH},fetch = FetchType.LAZY) 
@JoinColumn(name="外键名称")

6. 其他注解

@JsonIgnore // 一般标记在属性或者方法上,返回的json数据即不包含该属性。
 @Transient  //不维护字段

7. 级联操作注解
@OneToMany或者@ManyToOne

  1. CascadeType.REMOVECascade remove operation,级联删除操作。
    删除当前实体时,与它有映射关系的实体也会跟着被删除。
  2. CascadeType.MERGECascade merge operation,级联更新(合并)操作。
    当Student中的数据改变,会相应地更新Course中的数据。
  3. CascadeType.DETACHCascade detach operation,级联脱管/游离操作。
    如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
  4. CascadeType.REFRESHCascade refresh operation,级联刷新操作。
  5. CascadeType.ALLCascade all operations,清晰明确,拥有以上所有级联操作权限
  6. FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
  7. FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载

三、简单方法的使用

预先生成方法

Spring Boot Jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等

  1. 继承 JpaRepository
public interface UserRepository extends JpaRepository<User, Long> {
    }
  1. 使用默认方法
@Test
public void testBaseQuery() throws Exception {
	User user=new User();
	userRepository.findAll();
	userRepository.findOne(1l);
	userRepository.save(user);
	userRepository.delete(user);
	userRepository.count();
	userRepository.exists(1l);
	// ...
}
  1. 自定义简单查询

自定义的简单查询就是根据方法名来自动生成 SQL,主要的语法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟属性名称:

User findByUserName(String userName);

也使用一些加一些关键字And 、 Or

User findByUserNameOrEmail(String username, String email);

修改、删除、统计也是类似语法

Long deleteById(Long id);
Long countByUserName(String userName)