Spring Data Jpa和JPA的使用

一、JPA

JPA全稱爲Java Persistence API ,Java持久化API是Sun公司在Java EE5規範中提出的Java持久化接口。
JPA吸取了目前Java持久化技術的優點,旨在規範、
簡化Java對象的持久化工作。使用JPA持久化對象,並不是依賴於某一個ORM框架。


1 標準化
2 對容器級特性的支持
3 簡單易用,集成方便
4 可媲美JDBC的查詢能力

在這裏插入圖片描述

二、Springboot持久化配置

2.1 pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2.2 application.properties


spring.datasource.url = jdbc:mysql://localhost:3306/test8?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driver-class-name = com.mysql.jdbc.Driver


spring.jpa.datasource=MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

3.XXXDAO

@Repository("teacherDAO")
public interface TeacherDAO extends JpaRepository<Teacher, Integer> {

	
}

在這裏插入圖片描述

三、使用Spring Data

3.1 基本的增刪改查

3.1.1 添加

bookDAO.save(book);

3.1.2 刪除

bookDAO.deleteById(id);

3.1.3 修改

book需要帶id
bookDAO.saveAndFlush(book);

3.1.4 查詢全部

bookDAO.findAll();

3.1.5 根據id查詢

bookDAO.findById(id).get();

3.2 使用Query Creation

Spring Data Jpa通過解析方法名創建查詢,框架在進行方法名解析時,會先把方法名多餘的前綴find…By, read…By, query…By, count…By以及get…By截取掉,然後對剩下部分進行解析,第一個By會被用作分隔符來指示實際查詢條件的開始。 我們可以在實體屬性上定義條件,並將它們與And和Or連接起來,從而創建大量查詢:

3.2.1 例如

User findByUsername(String username);

List<User> findByUsernameIgnoreCase(String username);

List<User> findByUsernameLike(String username);

User findByUsernameAndPassword(String username, String password);

User findByEmail(String email);

List<User> findByEmailLike(String email);

List<User> findByIdIn(List<String> ids);

List<User> findByIdInOrderByUsername(List<String> ids);

void deleteByIdIn(List<String> ids);

Long countByUsernameLike(String username);

3.2.2 語法

在這裏插入圖片描述

3.3 自定義SQL語句

3.3.1 @Query

@Query( value ="select * from teacher where name like concat('%',?1,'%') limit ?2 ,?3", nativeQuery = true)
public List<Teacher> queryByName(String name, int page, int size);
	
nativeQuery :true爲sql,false爲hql,默認false

3.3.2 @Param

@Query("select u from User u where u.username = :username or u.email = :email")
User getByUsernameOrEmail(@Param("username") String username, @Param("email") String email);

3.4 分頁查詢及排序

3.4.1 Pageable和Sort

Spring Data Jpa可以在方法參數中直接傳入Pageable或Sort來完成動態分頁或排序,通常Pageable或Sort會是方法的最後一個參數,如:

@Query("select u from User u where u.username like %?1%")
Page<User> findByUsernameLike(String username, Pageable pageable);

@Query("select u from User u where u.username like %?1%")
List<User> findByUsernameAndSort(String username, Sort sort);

3.4.2 創建

new PageRequest(0, 5);
new PageRequest(0, 5, Sort.Direction.ASC, "username");
new PageRequest(0, 5, new Sort(Sort.Direction.ASC, "username"));
        
PageRequest.of(0, 5);
PageRequest.of(0, 5, Sort.Direction.ASC, "username");
PageRequest.of(0, 5, Sort.by(Sort.Direction.ASC, "username"));

3.5 自定義修改、刪除 Modifying Queries

單獨使用@Query註解只是查詢,如涉及到修改、刪除則需要再加上@Modifying註解,如:

@Transactional()
@Modifying
@Query("update User u set u.password = ?2 where u.username = ?1")
int updatePasswordByUsername(String username, String password);

@Transactional()
@Modifying
@Query("delete from User where username = ?1")
void deleteByUsername(String username);

注意:Modifying queries can only use void or int/Integer as return type!


四、多表關聯

4.1 一對一(多對一)

4.2 一對多

4.3 多對多

@Entity
@Table(name="user")
public class User {
	@Id
	@Column
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	@Column
	private String username;
	@Column
	private String password;
	@ManyToMany(targetEntity=Role.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
	@JoinTable(name="user_role",joinColumns={@JoinColumn(name = "user_id", referencedColumnName = "id")},
	inverseJoinColumns={@JoinColumn(name="role_id",referencedColumnName="id")})
	private List<Role> roles;
	

@Entity
@Table(name="role")
public class Role {
	@Id
	@Column
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	@Column
	private String name;

五、審計Auditing

5.1 實體類

一般數據庫表在設計時都會添加4個審計字段,Spring Data Jpa同樣支持審計功能。Spring Data提供了@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate4個註解來記錄表中記錄的創建及修改信息。

package com.example.springbootjpa.entity;

import lombok.Data;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;
import java.util.Set;

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "tb_user")
@Data
public class User {

    @Id
    @GenericGenerator(name = "idGenerator", strategy = "uuid")
    @GeneratedValue(generator = "idGenerator")
    private String id;

    @Column(name = "username", unique = true, nullable = false, length = 64)
    private String username;

    @Column(name = "password", nullable = false, length = 64)
    private String password;

    @Column(name = "email", unique = true, length = 64)
    private String email;

    @ManyToMany(targetEntity = Role.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "tb_user_role", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
    private Set<Role> roles;

    @CreatedDate
    @Column(name = "created_date", updatable = false)
    private Date createdDate;

    @CreatedBy
    @Column(name = "created_by", updatable = false, length = 64)
    private String createdBy;

    @LastModifiedDate
    @Column(name = "updated_date")
    private Date updatedDate;

    @LastModifiedBy
    @Column(name = "updated_by", length = 64)
    private String updatedBy;

}

實體類上還添加了@EntityListeners(AuditingEntityListener.class),而AuditingEntityListener是由Spring Data Jpa提供的

5.2 實現AuditorAware接口

光添加了4個審計註解還不夠,得告訴程序到底是誰在創建和修改表記錄

package com.example.springbootjpa.auditing;

import org.springframework.data.domain.AuditorAware;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of("admin");
    }

}
這裏簡單的返回了一個"admin"字符串來代表當前用戶名


5.3 啓用Jpa審計功能

在Spring Boot啓動類上添加@EnableJpaAuditing註解用於啓用Jpa的審計功能

package com.example.springbootjpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class SpringBootJpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootJpaApplication.class, args);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章