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