四:springboot 使用 SpringDataJpa

1. JPA相關簡介

jpa 是 Java Persistence API 的簡稱,中文名 Java持久層API,在JDK5.0後提出的Java持久化規範。其目的是爲了簡化現有 JAVA EEJAVA SE 應用開發工作,以及整合現有的ORM技術,然後實現規範統一化的偉大目標。jpa 只是一種規範,從功能上來說,jpa 就是 Hibernate 功能的一個子集。

常見的ORM框架中 Hibernate 的 jpa 最爲完整,因此 Spring Data JPA 是採用基於 jpa 規範的 Hibernate 框架基礎下提供了Repository 層的實現。Spring Data Repository極大地簡化了實現各種持久層的數據庫訪問而寫的樣板代碼量,同時CrudRepository提供了豐富的CRUD功能。

當然了,它也有自身的缺點,學習這玩意兒,我們需要學習hql語句,然後配置上來說相對複雜一些(特別是在多表查詢上啊...),還有就是它的性能不如mybatis 和jdbc啦

 2. 添加相關依賴

pom.xml中添加spring-boot-starter-data-jpa的依賴,添加 mysql 的依賴

<!-- spring-boot-starter-data-jpa 將會自動獲得HikariCP依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

3. 配置數據源,連接數據庫

application.properties 中添加如下配置。值得注意的是,SpringBoot默認會自動配置 DataSource,它將優先採用 HikariCP 連接池,如果沒有該依賴的情況則選取 tomcat-jdbc,如果前兩者都不可用最後選取 Commons DBCP2我們可以通過spring.datasource.type 屬性來指定其它種類的連接池,這個就看個人喜好啦..

# JPA配置
spring.jpa.hibernate.ddl-auto=update
# 輸出日誌
spring.jpa.show-sql=true
# 數據庫類型
spring.jpa.database=mysql

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
# spring.datasource.type  該屬性可指定其它種類的連接池

ddl-auto 幾種屬性

  1. create:每次運行程序時,都會重新創建表,所以數據會丟失
  2. create-drop:每次運行程序時會先創建表結構,然後待程序結束時清空表
  3. upadte:每次運行程序,沒有表時會創建表,如果對象發生改變會更新表結構,原有數據不會清空,只會更新(我們一般都用這個的...)
  4. validate:運行程序會校驗數據與數據庫的字段類型是否相同,所以當字段不同的時候會報錯的...

 4. 實體類

JPA規範註解在javax.persistence包下,注意 @Id 註解不要引用錯了。@GeneratedValue(strategy = GenerationType.IDENTITY) 是自增策略,還有就是不需要映射的字段可以通過 @Transient 註解排除掉

常見的幾種自增策略

  1. TABLE:使用一個特定的數據庫表格來保存主鍵
  2. AUTO:主鍵由程序控制,也是GenerationType的默認值。
  3. IDENTITY:主鍵由數據庫自動生成(主要是支持自動增長的數據庫)
  4. SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器。
@Setter //setter 和 getter 註解加上後可以不寫get和set方法了
@Getter
@Entity // 指明這個是實體類,然後也可以寫成這種 @Entity(name = "tb_user") tb_user 就是指的某張具體的表

public class TbUser implements Serializable {

    private static final long serialVersionUID = 8655851615465363473L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private boolean sex;

    @Transient // 返回的數據中忽略該字段
    private String  email;

}

5. Repository

創建UserRepository數據訪問層接口,需要繼承JpaRepository<T,K>第一個泛型參數是實體對象的名稱,第二個是主鍵類型JpaRepository本身就包含了常用的crud功能,JPA支持@Query註解寫HQL,也支持findAllByUsername這種根據字段名命名的方式

@Repository
public interface TbUserRepository extends JpaRepository<TbUser, Long> {

    /**
     * 根據用戶名查詢用戶信息
     *
     * @param username 用戶名
     * @return 查詢結果
     */
    List<TbUser> findByUsername(String username);
}

6. 測試

我們在springboot自帶的測試類中進行測試,下面的 findByUsername 試類是我們自己寫的,當然JpaRepository 自帶的CRUD我這裏就沒寫了,你們可以自己試一下...

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    private TbUserRepository tbUserRepository;

    @Test
    public void contextLoads() {
    }

    private static final Logger log = LoggerFactory.getLogger(SpringBootDataJpaApplicationTests.class);

    @Test
    public void test1() {

        final List<TbUser> user = tbUserRepository.findByUsername("1111");
        log.info("[根據用戶名查詢] - [{}]", user);

    }
}

7. controller層

當然,也可寫在controller層裏,我們使用postman等測試工具模擬接口訪問進行測試

@RestController
@RequestMapping("/TbUser")
public class AccountController {
    @Autowired
    TbUserRepository tbUserRepository;

    @GetMapping(value = "/findAll")
    public List<TbUser> getAccounts() {
        return tbUserRepository.findByUsername("1111);
    }
}

8. 結語

按照慣例寫個結語,嗯...看了很多大佬的教程,結合我自己的總結了一波,當然了,不足之處請多包涵,也請多指教...如有雷同,也請多包涵...嘻嘻...

最近一週都在改需求... 嗯...超級想打死產品經理...

注:如有需要,可自行轉載,但是要加上原創作者及原文章鏈接哦...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章