SpringBoot數據庫操作

本篇概述

上一篇中我們已經介紹了在SpringBoot項目中怎麼修改默認配置參數,並且我們還掌握了怎麼獲取配置文件中自定義參數。在這一篇中我們將介紹SpringBoot對數據庫的操作。既然是對數據庫的操作,那難免有一些配置的參數。例如數據庫的連接、數據庫賬號及數據庫密碼等。所以掌握上篇中的內容很重要。除此之外,我們還要介紹一下用什麼樣的技術來操作數據庫。操作數據庫的技術有很多例如比較常見的JDBC、Mybatis、Hibernate等。在SpringBoot的項目中爲我們提供了另外一種操作數據庫的技術,也就是JPA。我們可以通過JAP中提供的方式來非常方便的操作數據庫。下面我們首先添加SpringBoot對數據庫的配置參數。具體參數如下:

數據庫配置

spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:mysql://localhost:3306/springboot?useSSL=false&characterEncoding=utf8
    username: root
    password: jilinwula
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

spring.jpa.hibernate.ddl-auto參數詳解

  上面的配置參數比較簡單,我們就不詳細介紹了,我們只介紹spring.jpa.hibernate.ddl-auto參數。該參數的作用是自動操作表結構。且該參數有4種選項,下面我們詳細介紹一下這4種的區別。

  • create: 當我們啓動SpringBoot項目時,會自動爲我們創建與實體類對應的表,不管表中是否有數據。也就是如果指定參數爲create時,當項目啓動後,該表的數據一定爲空。因爲該參數的處理方式,是先將表刪除後,然後在創建新的表。
  • create-drop: 當我們啓動項目時也會我們自動創建表,但當我們的項目運行停止後,它會自動爲我們刪除表,並且該參數爲create一樣在啓動時也會先把表刪除後,然後在創建。
  • update: 每當我們啓動項目時,如果表不存在,則會根據實體類自動幫我們創建一張表。如果表存在,則會根據實體類的變化來決定是不是需要更新表,並且不管更不更新表都不會清空原數據。
  • validate: 當我們啓動項目時會驗證實體類中的屬性與數據庫中的字段是否匹配,如不匹配則報錯。

添加相關依賴

  如果我們按照上面的方式配置完後,則會發現上面的driver-class-name參數會報紅顯示,原因是沒有找到相關的依賴。並且在SpringBoot的項目中如果想用JPA功能的除了要引入Mysql的依賴外,還要引入Jpa的依賴。具體依賴如下:

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

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

  當我們添加完上面的依賴後發現配置文件中的driver-class-name參數已經不報紅顯示了,這就表示我們的依賴引入成功了。

spring.jpa.hibernate.ddl-auto參數驗證

  下面我們創建一個實體類,來驗證一下,上面的spring.jpa.hibernate.ddl-auto參數是不是上面說的那樣。我們首選驗證當參數爲create時。下面爲實體類的代碼:

package com.jilinwula.springboot.helloworld.entity;

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "user_info")
public class UserInfoEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;
}

  上面實體類中我們指定了幾個註解,下面我們詳細介紹一下它們的作用:

實體類詳解

  • @Data: 自動生成GET和SET方法的註解,在上一篇中我們已經介紹過了,該註解可以在類上和屬性中添加。如果添加在類上,是表示自動爲該實體類的所有屬性創建GET和SET方法。如果添加到屬性中則表示只會爲該屬性添加GET和SET方法。這樣我們就沒必要爲代碼中生成大量的GET和SET煩惱了。這時可能有人會想到那如果我只想讓它幫我生成GET方法或者只想生成SET方法時應該怎麼辦呢?彆着急,既然你想到了,那麼開發這個註解的人也想到了,我們只需要將上面的@Data註解修改爲相應的@Getter或者@Setter註解即可。它們正好對應的生成GET和SET方法。
  • @Entity: 實體類註解。只有標識該註解的類,JPA才能自動將這個類中的屬性和數據庫進行映射。
  • @Table: 標識該實體類和數據庫中哪個表進行映射。
  • @Id: 標識該自動爲主鍵標識。
  • @GeneratedValue: 標識主鍵的生成規則。這個在後面的文章中在做詳細介紹。

  現在我們一切準備就緒了,我們只要啓動一下SpringBoot的項目就可以了,看看會不會自動爲我們創建一張userinfo的表。(備註:數據庫需要我們自己創建)。我們首先確認一下數據庫中確實沒有userinfo這張表。

  title

  下面我們啓動一下SpringBoot的項目,看一下數據庫中有沒有創建新的表。

  title

  title

  我們看JPA確實爲我們創建了一張和實體類中@Table註解指定的表,並且表中的字段和實體類中的屬性一致。下面我們手動向表中添加一條數據,然後重新啓動項目,看看項目啓動後,這條新增的數據還是否存在。

  title

  我們只新增了一條數據,然後重啓啓動項目後,在看一下數據中的userinfo表,看看該數據還有沒有。

  title

  我們發現剛剛添加的那條數據已經沒有了,這也就恰恰證明了,我們上面所有說當spring.jpa.hibernate.ddl-auto參數爲create時,每當項目啓動時,都會將原先的表刪除,然後在通過實體類重新生成新的表,既然已經是將原先的表都刪除了,那曾經添加的數據當然不存在了。如果我們仔細查看SpringBoot項目的啓動日誌,發現啓動日誌中已經輸出了相應的刪除及建表的語句,下面爲項目啓動的時操作表的日誌。

Hibernate: drop table if exists user_info
Hibernate: create table user_info (id bigint not null auto_increment, password varchar(255), username varchar(255), primary key (id))

  下面我們將spring.jpa.hibernate.ddl-auto參數修改爲create-drop來驗證一下create-drop參數的特性。我們首先先把表刪除掉,以免剛剛的create參數影響create-drop的驗證。

  title

  我們還是和剛剛一樣啓動項目後查看數據庫中是不是自動爲我們創建一張userinfo表。

  title

  我們看一樣還是自動爲我們創建了一個新的表。下面我們將服務執行後,在看一下該表還是不是存在。

  title

  我們發現,剛剛創建的表已經自動刪除了,這就是create-drop參數的特性。我們查看日誌,也可以發現當停止服務時,自動執行的刪表語句。下面的日誌。

Hibernate: drop table if exists user_info
Hibernate: create table user_info (id bigint not null auto_increment, password varchar(255), username varchar(255), primary key (id))
2019-01-18 16:56:27.033  INFO 6956 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000230: Schema export complete
2019-01-18 16:56:27.058  INFO 6956 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-01-18 16:56:27.400  INFO 6956 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@21de60b4: startup date [Fri Jan 18 16:56:23 CST 2019]; root of context hierarchy
2019-01-18 16:56:27.482  INFO 6956 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2019-01-18 16:56:27.483  INFO 6956 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2019-01-18 16:56:27.511  INFO 6956 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-01-18 16:56:27.512  INFO 6956 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-01-18 16:56:27.553  INFO 6956 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-01-18 16:56:27.888  INFO 6956 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-01-18 16:56:27.973  INFO 6956 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2019-01-18 16:56:27.978  INFO 6956 --- [           main] JilinwulaSpringbootHelloworldApplication : Started JilinwulaSpringbootHelloworldApplication in 5.928 seconds (JVM running for 7.512)
2019-01-18 17:00:50.630  INFO 6956 --- [      Thread-16] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@21de60b4: startup date [Fri Jan 18 16:56:23 CST 2019]; root of context hierarchy
2019-01-18 17:00:50.661  INFO 6956 --- [      Thread-16] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2019-01-18 17:00:50.664  INFO 6956 --- [      Thread-16] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-01-18 17:00:50.666  INFO 6956 --- [      Thread-16] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000227: Running hbm2ddl schema export
Hibernate: drop table if exists user_info

  在日誌中我們發現一共執行了兩次刪除表的語句,第一次是在啓動前,第二次是在服務停止時。


  下面我們把spring.jpa.hibernate.ddl-auto參數修改爲update來驗證update參數的特性。同樣我們還是事先要把剛剛生成的表刪除掉,因爲create-drop參數在停止服務時,已經把剛剛的表刪除掉了,所以我們就不用手動刪除了,我們直接把spring.jpa.hibernate.ddl-auto參數修改爲update,然後直接啓動項目。

  title

  我們看上圖當我們把spring.jpa.hibernate.ddl-auto參數設置爲update時,也會自動爲我們創建表。並且我們停止服務時,該表依然還存在,並且不會清除數據。下面我們向表中添加一條新數據。然後修改實體類中的結構,看看剛剛新增的數據還存在不存在。

  title

  實體類修改如下:

package com.jilinwula.springboot.helloworld.entity;

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "user_info")
public class UserInfoEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

    private String nickname;
}

  我們新增了一個nickname屬性,然後我們重新啓動服務看看這個新的字段會不會自動在表中創建,並且沒有更改原先表中的數據。

  title

  我們看新的字段已經自動創建成功了,並且沒有刪除原先表中的數據,這就是update參數的作用,在實際的開發中,把spring.jpa.hibernate.ddl-auto參數設置爲update,是比較常見的配置方式。


  下面我們驗證最後一個參數也就是validate參數。因爲之前的操作我們現在userinfo表中一其有3個字段,現在我們將實體類中的nickname字段註釋掉,然後我們在啓動服務,看一看項目啓動是否正常。下面爲實體類源碼:

import javax.persistence.*;

@Data
@Entity
@Table(name = "user_info")
public class UserInfoEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

//    private String nickname;
}

  當我們啓動項目時,發現項目是可以正常啓動。然後查看數據庫中表,我們發現表中的結構沒有任何變化。也就是說,我們註釋掉數據庫中已有的字段然後啓動項目時,項目是可以正常啓動的。這又是爲什麼呢?validate參數的作用不就是驗證實體類中的屬性與數據庫中的字段不匹配時拋出異常嗎?爲什麼當我們這麼設置時沒有拋出異常呢?這是因爲validate參數的特性是隻有實體類中的屬性比數據庫中的字段多時纔會報錯,如實體類中的屬性比數據庫中字段少,則不會報錯。剛剛我們將nickname屬性給註釋了,但validate是不會更改表結構的,所以數據庫中還是會有nickname字段的,這就導致數據中的字段比實體類中的屬性多,所以當我們啓動項目時是不會拋出異常。但反之,如果我們在實體類中新增一個字段,然後我們在啓動項目時,項目就會拋出異常。實體類源碼:

@Data
@Entity
@Table(name = "user_info")
public class UserInfoEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

    private String nickname;

    private Long roleId;
}

  我們新增了一個roleId字段,並且該字段在數據庫中是沒有的,然後我們啓動項目。查看日誌發現項目已經啓動失敗了。下面爲日誌:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [role_id] in table [user_info]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:85) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:50) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:91) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:475) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.21.RELEASE.jar:4.3.21.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360) ~[spring-orm-4.3.21.RELEASE.jar:4.3.21.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384) ~[spring-orm-4.3.21.RELEASE.jar:4.3.21.RELEASE]
    ... 20 common frames omitted

  下面我們在數據庫中將roleId字段手動添加上,然後我們在重新啓動項目,在看一下啓動時項目還是否報錯。

  title

  下面我們重新啓動項目,然後在看一下日誌,發現項目已經成功啓動了,這就是validate參數的作用。

2019-01-19 17:17:41.160  INFO 1034 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-01-19 17:17:41.201  INFO 1034 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2019-01-19 17:17:41.204  INFO 1034 --- [           main] JilinwulaSpringbootHelloworldApplication : Started JilinwulaSpringbootHelloworldApplication in 2.596 seconds (JVM running for 3.233)

實體類註解高級配置

  上述內容我們基本已經將spring.jpa.hibernate.ddl-auto參數的的使用介紹完了,下面我們介紹一下實體類中的高級註解。因爲我們在上面的測試中我們發現,當我們把spring.jpa.hibernate.ddl-auto參數設置爲create時,雖然成功的創建了實體類中指定的表,但是我們發現自動創建的表只是字段和實體類中的屬性一致,但例如表中的字段長度、字段的描述、表的索引,這些高級的配置,是需要我們在實體類中添加新的註解,才能設置的。下面我們將實體類中的代碼修改一下,添加上面說的註解,並且驗證上面註解是否可以正確設置表中的長度、描述及索引。(備註:別忘記將spring.jpa.hibernate.ddl-auto參數設置爲create)下面爲實體類源碼:

package com.jilinwula.springboot.helloworld.entity;

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "user_info", indexes = @Index(columnList = "username"))
public class UserInfoEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", columnDefinition = "bigint(10)  comment '主鍵'")
    private Long id;

    @Column(name = "username", columnDefinition = "varchar(10) not null default '' comment '賬號'")
    private String username;

    @Column(name = "password", columnDefinition = "varchar(10) not null default '' comment '密碼'")
    private String password;

    @Column(name = "nickname", columnDefinition = "varchar(10) not null default '' comment '妮稱'")
    private String nickname;

    @Column(name = "role_id", columnDefinition = "bigint(10) not null default 0 comment '角色'")
    private Long roleId;
}

  上面我們介紹過當在類中添加@Entity註解後,JPA會自動將實體類中的屬性映射爲數據庫中表裏的字段。但在實際的開發中我們可能會遇到實體類中的屬性與數據庫中的字段不一致的情況。這時我們就要使用@Column註解了,該註解的參數有很多,我們要掌握2個就可以了。一個參數爲name因爲JAP在映射屬性到數據庫時,如果沒有指定@Column參數,則默認使用和實體類中的屬性一樣的名字,如果指定了@Column則使用該註解中的name參數。第二個參數爲columnDefinition參數,該參數則是可以直接將我們創建表中的語句寫在該參數中,這樣我們可以很方便的控制字段的長度及類型。還有一個註解爲@indexes。該註解可指定我們指定屬性爲表中的索引,這裏要注意一下如果表中字段名字和實體類中的屬性名字不一致,@indexes註解需要指定的是實體類中的屬性名,則不是真正表中的字段名。下面我們啓動項目,看一下數據庫中的表結構是不是和我們實體類中映射的一樣。。

  title

  我們現在看數據庫中的映射,除了創建索引時自動生成的索引名不一樣,其它的字段映射類型長度及其描述都和我們實體類中的一致。


JpaRepository接口

  下面我們介紹一下怎麼使用JPA來操作數據庫。我們以增刪改查爲例,分別介紹它們的使用。在使用JAP操作數據庫時,我們需要創建一個和實體類相對應的接口,並且讓該接口繼承JAP中已經提供的JpaRepository(有很多個接口暫時只介紹這一個)接口。這樣我們就可以通過這個接口來操作數據庫了。下面我們看一下該接口的源碼。

package com.jilinwula.springboot.helloworld.Repository;

import com.jilinwula.springboot.helloworld.entity.UserInfoEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserInfoRepository extends JpaRepository<UserInfoEntity, Long> {
}

  在我們繼承JpaRepository接口時需要我們指定兩個參數,第一個參數表示我們要操作的實體類是哪一個,第二個參數表示我們實體類中的主鍵類型,其次我們還需要添加@Repository註解,這樣JPA才能操作數據庫。下面我們創建一個測試用例,分別介紹數據庫中的增刪改查。下面爲測試用例源碼:

package com.jilinwula.springboot.helloworld;

import com.jilinwula.springboot.helloworld.Repository.UserInfoRepository;
import com.jilinwula.springboot.helloworld.entity.UserInfoEntity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JilinwulaSpringbootHelloworldApplicationTests {

    @Autowired
    private UserInfoRepository userInfoRepository;

    @Test
    public void save() {
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setUsername("吉林烏拉");
        userInfoEntity.setPassword("jilinwula");
        userInfoEntity.setNickname("二十四分之七倍根號六");
        userInfoEntity.setRoleId(1L);

        userInfoRepository.save(userInfoEntity);
    }

    @Test
    public void contextLoads() {
    }

}

數據庫的增刪改查

  我們暫時只寫一個新增的方法,並且我們發現,雖然我們的UserInfoRepository接口中沒有寫任何方法,但我們居然可以直接調用save方法了。這是因爲當我們將UserInfoRepository接口繼承JpaRepository接口時,是默認繼承了該接口的一些方法,所以這些基本的增刪改查操作,是不需要我們寫任何代碼的。下面我們執行一下測試用例,看看該條數據能否正確的插入到數據庫中。

  title

  我們看數據已經成功的添加到了數據庫中。下面我們在添加一條,方便我們以後測試。

  title

  。下面我們編寫一下查詢語句,看看能否正確查出數據。

@Test
    public void select() {
        UserInfoEntity userInfoEntity = userInfoRepository.findOne(1L);
        System.out.println(userInfoEntity);
    }

  我們看同樣,我們還是沒有寫findOne方法,但是我們居然可以直接使用。findOne方法是JPA爲我們提供通過主鍵查詢數據的方法,所以該方法的返回值是實體類對象,因爲只能返回一條數據。下面我們執行一下該測試用例,看看能否正確查詢出數據。

UserInfoEntity(id=1, username=吉林烏拉, password=jilinwula, nickname=二十四分之七倍根號六, roleId=1)

  我們看已經成功的查詢出數據了。這時有人會說,如果我們想查所有的數據應該怎麼辦呢?彆着急,JPA中除了提供了findOne方法,還提供了findAll方法,顧名思義,該方法就是查詢所有數據的。既然是所有數據,所以該方法的返回值爲List。下面爲測試用例源碼,及其執行日誌。

@Test
public void selectAll() {
  List<UserInfoEntity> userInfoEntitys = userInfoRepository.findAll();
  System.out.println(userInfoEntitys);
}
[UserInfoEntity(id=1, username=吉林烏拉, password=jilinwula, nickname=二十四分之七倍根號六, roleId=1), UserInfoEntity(id=2, username=阿里巴巴, password=alibaba, nickname=淘寶, roleId=2)]

  下面我們介紹一下更新方法,在JPA中更新方法和save方法一樣,唯一的區別就是如果我們在實體類中設置了主鍵,則調用sava方法時,JPA執行的就是更新。如果不設置主鍵,則JPA執行的就是新增。下面爲測試用例源碼:

@Test
public void update() {
  UserInfoEntity userInfoEntity = new UserInfoEntity();
  userInfoEntity.setId(1L);
  userInfoEntity.setUsername("阿里巴巴");
  userInfoEntity.setPassword("alibaba");
  userInfoEntity.setNickname("淘寶");
  userInfoEntity.setRoleId(2L);

  userInfoRepository.save(userInfoEntity);
}

  現在我們在查詢一下數據庫,如果更新語句成功,那麼此時數據庫中則會有兩條一樣的數據。

  title

  我們看,數據庫中的確有兩條一模一樣的數據了,這就證明了我們剛剛的更新語句成功了。下面我們介紹一下最後一個刪除語句,該語句也同樣比較簡單,因爲JPA也同樣爲我們提供了該方法,下面爲測試用例。

    @Test
    public void delete() {
        userInfoRepository.delete(1L);
    }

  我們在查詢一下數據庫,看看id爲1的數據是否還在數據庫中存在。

  title

  我們看該數據成功的刪除了。這就是JPA對數據庫的增刪改查的基本操作。當然JPA中還提供了很多複雜的語法,例如級聯查詢、分頁查詢等等。這些高級的功能我們在後續的文章中在做詳細介紹。這就是本篇的全部內容,如有疑問,歡迎留言,謝謝。


項目源碼

  下面爲項目源碼:https://github.com/jilinwula/jilinwula-springboot-helloworld3


原文鏈接

  下面爲項目源碼:http://jilinwula.com/article/24338

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