spring-boot-route(九)整合JPA操作資料庫

單調的增刪改查讓越來越多的程式設計師感到乏味,這時候就出現了很多優秀的框架,完成了對增刪改查操作的封裝,只需要簡單配置,無需書寫任何sql,就可以完成增刪改查。這裡比較推薦的是Spring Data Jpa。

Spring Data JPA是Spring Data家族的一部分,可以輕鬆實現基於JPA的存儲庫。 此模組處理對基於JPA的數據訪問層的增強支援。 它使構建使用數據訪問技術的Spring驅動應用程式變得更加容易。

我們繼續使用前兩章用的資料庫結構來進行演示。

一 引入mysql和spring-data-jpa依賴

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

二 創建實體類

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Student implements Serializable {

    private static final long serialVersionUID = 6712540741269055064L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer studentId;
    private Integer age;
    private String name;
    private Integer sex;
    private Date createTime;
    private Integer status;
}

@GeneratedValue是主鍵生成策略,Jpa自帶的幾種主鍵生成策略如下:

  • TABLE: 使用一個特定的資料庫表格來保存主鍵

  • SEQUENCE: 根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)

  • IDENTITY: 主鍵由資料庫自動生成(主要是支援自動增長的資料庫,如mysql)

  • AUTO: 主鍵由程式控制,也是GenerationType的默認值

主鍵生成策略擴展

自定義主鍵生成器:

public class MyGenerator implements IdentifierGenerator {
    
    @Override
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
        return getId();
    }
    
    public static long getId(){
        return System.currentTimeMillis();
    }
}

然後在實體類做一下配置:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Student implements Serializable {

    private static final long serialVersionUID = 6712540741269055064L;

    @Id
    @GenericGenerator(name="idGenerator",strategy = "com.javatrip.springdatajpa.entity.MyGenerator")
    @GeneratedValue(generator = "idGenerator")
    private Integer studentId;
    private Integer age;
    private String name;
    private Integer sex;
    private Date createTime;
    private Integer status;
}

三 創建dao介面

dao層介面實現JpaRepository,泛型選擇pojo和其主鍵類型,就會自動實現簡單的CRUD等介面,無需手動開發,就能快速進行調用。

public interface StudentRepository extends JpaRepository<Student,Integer> {

    /**
     * 根據年齡,名字模糊查詢
     * @return
     */
    Student findByNameLikeAndAge(String name,int age);
}

Jpa除了實現CRUD方法,還支援欄位名模糊查詢等各種不用手寫sql的操作。

四 測試類測試CRUD

@SpringBootTest
class SpringDataJpaApplicationTests {

    @Autowired
    StudentRepository repository;
    @Test
    void contextLoads() {
        // 查詢所有實體
        List<Student> all = repository.findAll();
        // 根據id查詢實體類
        Optional<Student> byId = repository.findById(100);
        // 根據id刪除數據
        repository.deleteById(100);
        // 插入一條數據
        // 如果資料庫存在該實體的主鍵,則更新,否則插入
        Student student = new Student();
        student.setAge(18);
        student.setName("Java旅途");
        repository.save(student);

        repository.findByNameLikeAndAge("Java",18);
    }
}

spring-data-jpa在外國程式設計師界非常普遍。相比其他兩種方式,它不需要寫sql就可以完成非常完善的數據操作,我也是比較推薦使用它作為orm框架。

此是spring-boot-route系列的第九篇文章,這個系列的文章都比較簡單,主要目的就是為了幫助初次接觸Spring Boot 的同學有一個系統的認識。本文已收錄至我的github,歡迎各位小夥伴star

github//github.com/binzh303/spring-boot-route

點關注、不迷路

如果覺得文章不錯,歡迎關注點贊收藏,你們的支援是我創作的動力,感謝大家。

如果文章寫的有問題,請不要吝嗇,歡迎留言指出,我會及時核查修改。

如果你還想更加深入的了解我,可以微信搜索「Java旅途」進行關注。回復「1024」即可獲得學習影片及精美電子書。每天7:30準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實力!