主要依赖:
spring:
jpa:
#配置数据库类型
database: MySQL
# 指定生成表名的存储引擎为InnoDBD
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update //正向工程
#ddl-auto:create ----每次运行该程序,没有表格会新建表格,表内有数据会清空;
#ddl-auto:create-drop ----每次程序结束的时候会清空表
#ddl-auto:update ---- 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
#ddl-auto: validate ---- 运行程序会校验数据与数据库的字段类型是否相同,不同会报错。
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid") //定义主键生成策略
@GeneratedValue(generator = "idGenerator") //设置主键生成策略
简单主键设置策略:@GeneratedValue(strategy = GenerationType.IDENTITY)
JPA自带的几种主键生成策略
TABLE: 使用一个特定的数据库表格来保存主键
SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)
IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
AUTO: 主键由程序控制,也是GenerationType的默认值
持久层:继承 JpaRepository: 基本查询
JpaSpecificationExecutor:多条件查询
CrudRepository:增删查改
PagingAndSortingRepository:在CrudRepository基础上增加了排序分页
Repository接口
命名规范:
①、不是随便声明的,而需要符合一定的规范
②、查询方法以 find | read | get 开头
③、涉及条件查询时,条件的属性用条件关键字连接
④、要注意的是:条件属性以首字母大写
⑤、支持属性的级联查询。若当前类有符合条件的属性,则优先使用,而不使用级联属性。若需要使用级联属性,则属性之间使用_连接
Query:
第一个By会被用作分隔符来指示实际查询条件:
支持一些基本的关键字查询 in,orderby(findByAgeOrderByLastnameDesc),
like(findByFirstnameLike) 等相关关键字查询功能
也支持限制查询:first ,top,distinct
查询正序排序排名第一的username
User findFirstByUsernameOrderByUsernameAsc(String username);
排名前10
List
排名前10的分页查询
List
@Query: jpql查询
应当注意参数顺序
@Query("select u from User u where u.email = ?1")
User getByEmail(String eamil);
此方法不需要注意参数顺序
@Query("select u from User u where u.id = :id")
User getById(@Param("id") String userId);
SPEL表达式>>>>从Spring Data JPA release 1.4开始,Spring Data JPA支持名为entityName的变量。 它的用法是select x from #{#entityName} x。entityName的解析方式如下:如果实体类在@Entity注解上设置了name属性,则使用它。 否则,使用实体类的简单类名。为避免在@Query注解使用实际的实体类名,就可以使用#{#entityName}进行代替。
@Query("select u from #{#entityName} u where u.email = ?1")
User getByEmail(String eamil);
原生sql查询,关键在于value=””,nativeQuery =true
@Query(value = "select * from tb_user u where u.email = ?1", nativeQuery = true)
User queryByEmail(String email);
分页查询,可以在方法参数中直接传入Pageable或Sort来完成动态分页或排序,通常Pageable或Sort会是方法的最后一个参数
@Query("select u from User u where u.username like %?1%")
Page
@Query("select u from User u where u.username like %?1%")
List
如涉及到修改、删除则需要再加上@Modifying注解
多表联合查询:
多对多:
@ManyToMany(targetEntity = Role.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinTable(name="tb_user_role",joinColumns={@JoinColumn(name = "user_id", referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
private Set
异常:Spring Boot整合JPA后Hibernate的Session就交付给Spring去管理。每次数据库操作后,会关闭Session,当我们想要用懒加载方式去获得数据的时候,原来的Session已经关闭,不能获取数据,所以会抛出这样的异常
spring:
jpa:
open-in-view: true
properties:
hibernate:
enable_lazy_load_no_trans: true
一对多,多对一:
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@ManyToOne(targetEntity = Department.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "dept_id")
慎用@Data注解,使用@Getter、@Setter注解,需要时自己重写toString()、equals()以及hashCode()方法
Spring Data提供了@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate4个注解来记录表中记录的创建及修改信息。实体类上还添加了@EntityListeners(AuditingEntityListener.class),而AuditingEntityListener是由Spring Data Jpa提供的
实现AuditorAware接口
@Component
public class AuditorAwareImpl implements AuditorAware
@Override
public Optional
return Optional.of("admin");
}
}
这里简单的返回了一个"admin"字符串来代表当前用户名
在Spring Boot启动类上添加@EnableJpaAuditing注解用于启用Jpa的审计功能