在 Spring Boot 中使用 JPA 和 MySQL

肖老闆發表於2017-03-21

在Spring Boot中使用JPA和MySQL

最近專案中需要使用到MySQL資料庫,在此記錄一下Spring Boot中使用JPA進行資料訪問的基本過程。
本文的基本開發環境如下:spring-boot-1.4.2 & jdk-1.8 & spring-data-jpa-1.10.5 & mysql-connector-java-5.1.40
1. pom.xml中加入JPAMySQL依賴

<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>

2.配置MySQL連線及JPA引數
我的配置項是通過application.yml檔案進行設定的,如下:

# yml裡面支援的配置項引數還有很多,可以在yml檔案中輸入關鍵詞後檢視相關用法,這裡就不解釋了
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo
    username: root
    password: 123456
    dbcp:
      validation-query: SELECT 1
      test-while-idle: true
  jpa:
    hibernate:
      ddl-auto: create-drop
      naming:
        strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect
    show-sql: true

Spring Boot應用在啟動時會自動去解析此配置檔案裡面的內容,不需要我們再手動顯式的在Java或者XML中進行配置了。
3. 建立實體類
建立一個簡單的實體類用於演示:

@Entity
@Table(name = "label")
public class Label {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    /**
     * 標籤的內容
     */
    private String label;

    public String getLabel() {
        return label;
    }

    public void setLabel(String id, String label) {
        this.labelId = id;
        this.label = label;
    }

}

4.建立實體類的CrudRepository

@Transactional
public interface LabelRepository extends MongoRepository<Label, String>{

    /**
     * 根據標籤文字查詢標籤是否已存在
     * @param label 標籤文字
     * @return
     */
    Label findByLabel(String label);

}

5.使用Repository進行基本的CRUD

@RestController
public class LabelController {

    @Autowired
    private LabelRepository labelRepository;

    /**
    * 根據id獲取指定標籤
    * @param id 標籤id
    * @return Label
    */
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public RestResponse<Label> getById(@PathVariable("id") String id){
        Label label = labelRepository.findOne(id);
        if(label == null){
            return RestResponse.bad(-10001, "label is not exsist ");
        }
        return RestResponse.good(label);    
    }

    /**
    * 根據標籤內容label獲取指定標籤
    * @param label 標籤內容label
    * @return Label
    */
    @RequestMapping(method = RequestMethod.GET, params = {"label"})
    public RestResponse<Label> getByLabel(@RequestPrama("label") String label){
        Label label = labelRepository.findByLabel(label);
        if(label == null){
            return RestResponse.bad(-10001, "label is not exsist ");
        }
        return RestResponse.good(label);
    }

}

基本使用流程就是這樣的!當然,這裡面還有很多很多細節,隨便拿一個出來都可以研究半天的,比如說Repository介面裡面使用@Query支援自定義查詢語句,使用@AttributeOverride註解關聯內部類屬性等等。

相關文章