1. 程式人生 > >springboot 和JPA

springboot 和JPA

選擇了,web,MySQL,JPA元件作為我們開發必備元件

JPA(Java Persistence API)是Sun官方提出的Java持久化規範,用來方便大家操作資料庫。
真正幹活的可能是Hibernate,TopLink等等實現了JPA規範的不同廠商,預設是Hibernate。

配置資料來源以及JPA

配置DataSource以及JPA

用application.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?useUniCode=true&characterEncoding=utf8&useSSL=false
    driverClassName: com.mysql.jdbc.Driver
    username: admin
    password: admin
  jpa:
      database: MySQL
      show-sql: true
      hibernate:
        naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy

show-sql用來在控制檯輸出JPA自語句。

建立實體

我們根據資料庫中的欄位對應建立一個UserEntity來作為對應操作  實體類註解   主鍵生成策略

package com.cxy.entity;


import javax.persistence.*;
import java.io.Serializable;

@Entity //這是一個實體Bean
@Table(name = "t_user")  //指定了Entity所要對映帶資料庫表,缺少採用類名
public class UseEntity implements Serializable {    //實現序列化

    @Id   //將屬性定為主鍵列
    @GeneratedValue   
//主鍵生成策略,JPA自動選,Mysql為@GenerationType(strategy = GenerationType.IDENTITY)//主鍵自增生成策略,Mysql
    @Column(name = "t_id")
    private Long id;

    @Column(name = "t_name")
    private String name;

    @Column(name = "t_age")
    private int age;

    @Column(name = "t_address")
    private String address;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}



建立JPA

實體類已經建立完成了,接著需要使用SpringDataJPA來完成資料庫操作,新建名字叫做jpa的package,然後建立UserJPA介面並且繼承SpringDataJPA內的介面作為父類,當然還有序列化介面

package com.cxy.jpa;


import com.cxy.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;//簡單資料操作
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;//複雜查詢

import java.io.Serializable;//序列化介面

public interface UserJPA extends JpaRepository<UserEntity,Long>,JpaSpecificationExecutor<UserEntity>,Serializable{

}

繼承了JpaRepository介面(SpringDataJPA提供的簡單資料操作介面)、JpaSpecificationExecutor(SpringDataJPA提供的複雜查詢介面)、Serializable(序列化介面)。

不需要做其他的任何操作了,因為SpringBoot以及SpringDataJPA會為我們全部搞定,SpringDataJPA內部使用了類代理的方式讓繼承了它介面的子介面都以spring管理的Bean的形式存在,也就是說我們可以直接使用@Autowired註解在spring管理bean使用,現在資料庫層幾乎已經編寫完成。

控制層編寫查詢方法

UserController中,然後建立一個查詢,新增,更新,刪除方法

package com.cxy.controller;

import com.cxy.jpa.UserJPA;
import com.cxy.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserJPA userJPA;

    /**
     * 查詢使用者列表方法
     *
     * @return
     */
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public List<UserEntity> list() throws Exception{
        return userJPA.findAll();   //SpringDataJPA為我們提供的內建方法,它可以查詢表內所有的資料
    }

    /**
     *增加,更新使用者方法
     * @Param entity
     * @return
     */
    @RequestMapping(value = "/save",method = RequestMethod.GET)
    public UserEntity save(UserEntity entity) throws Exception{
        return userJPA.save(entity);  //userJPA.save方法可以執行新增也可以執行更新,
        // 如果需要執行持久化的實體存在主鍵值則更新資料,如果為0則新增資料。
    }
    /**
     * 刪除使用者方法
     *
     * @return
     */
    @RequestMapping(value = "/delete",method = RequestMethod.GET)
    public List<UserEntity> delete(Long id) throws Exception
    {
        userJPA.delete(id);
        return userJPA.findAll();
    }

}



常見bug

1.啟動失敗的問題('hibernate.dialect' not set)

Hibernate SQL方言沒有設定導致的,在properties檔案中增加下面這行:

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

2.The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one時區錯誤

application.properties 的adtasource.url加上

&serverTimezone=GMT%2B8