javascript
springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA
今日份主題
Spring Boot 整合 Spring Data JPA
JPA(Java Persistence API)是用于對象持久化的 API,是Java EE 5.0 平臺標準的 ORM 規范,它使得應用程序以統一的方式訪問持久層。
大家一定聽過大名鼎鼎的Hibernate,在國內早期很多JavaEE項目使用該框架,現在在國外依然非?;鸨?。其實JPA和Hibernate之間是有一定的關系的。這里給大家介紹一下。
JPA 是 Hibernate 的一個抽象(就像JDBC和JDBC驅動的關系)。JPA 本質上就是一種 ORM 規范,不是ORM 框架,這是因為 JPA 并未提供 ORM 實現,它只是制訂了一些規范,提供了一些編程的 API 接口,但具體實現則由 ORM 廠商提供實現。Hibernate 除了作為 ORM 框架之外,它也是一種 JPA 實現。從功能上來說, JPA 是 Hibernate 功能的一個子集。
JPA 的目標之一是制定一個可以由很多供應商實現的 API,Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的實現。
Spring Data 是 Spring 的一個子項目。用于簡化數據庫訪問,支持NoSQL 和 關系數據存儲。其主要目標是使數據庫的訪問變得方便快捷。Spring Data Jpa 致力于減少數據訪問層 (DAO) 的開發量. 開發者唯一要做的,就是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成。
Spring boot整合Spring Data JPA,我們可以通過一個案例來帶著大家入門學習一下。有整合MyBatis的基礎,應該不是難事。
案例:通過Spring Data JPA操作兩張關聯表,完成表的增、刪、查、改操作。
步驟
01在MySql中創建數據庫empdb。特別說明不需要創建表。只要做好能自動完成表結構的創建。
02創建Spring boot工程chapter05-jpa.并添加mysql、durid、jpa、web依賴。工程的創建省略。
依賴如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
03在application.properties進行相關的配置。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/empdb?serverTimezone=UTC
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
說明
在spring data jpa中,它的配置spring.jpa.hibernate.ddl-auto的取值如下:
a)create:每次運行程序時,都會重新創建表,故而數據會丟失
b)create-drop:每次運行程序時會先創建表結構,然后待程序結束時清空表
c)upadte:每次運行程序,沒有表時會創建表,如果對象發生改變會更新表結構,原有數據不會清空,只會更新(推薦使用)
d)validate:運行程序會校驗數據與數據庫的字段類型是否相同,字段不同會報錯
e)none: 禁用DDL處理
spring.jpa.hibernate.show-sql:表示在運行的時候是否在控制臺顯示執行的sql語句。一般在調試和開發階段會打開該配置。
spring.jpa.hibernate.database=mysql,表示使用的是mysql數據庫。
spring,jpa.database-platform=mysql,是設置默認的數據庫存儲引擎。這里默認的是mysql的引擎。
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect,:表示數據庫使用的方言。因為不同的數據庫生成的sql語句有一定的差異性。
04編寫實體類Emp。
@Entity(name = "t_emp")
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class Emp{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name",length = 50,nullable = false)
private String name;
@Column(name = "sex",length = 10)
private String sex;
@Column(name = "did")
private Integer deptId;
//getter和setter省略...
}
說明
@JsonIgnoreProperties:hibernate對象懶加載,json序列化失敗,因為懶加載這個對象屬性只是一個代理對象,如果json直接當作一個存在的屬性去序列化就會出現錯誤。
@Entity 是一個必選的注解,聲明這個類對應了一個數據庫表。
@Id 注解聲明了實體唯一標識對應的屬性。
@GeneratedValue:這個是設置主鍵的自動增長策略。
@Column(name = "name",length = 50,nullable = false) 用來聲明實體屬性的表字段的定義。默認的實體每個屬性都對應了表的一個字段。字段的名稱默認和屬性名稱保持一致(并不一定相等)。這里表示字段名name,長度50,字段非空。
05編寫接口EmpDao。
public interface EmpDao extends JpaRepository<Emp,Integer> {
}
代碼解釋:EmpDao接口繼承JpaRepository接口。該接口提供了很多的關于數據庫操作的方法基本方法。有基本的增刪查過、分頁查詢、排序查詢。這也正是jpa的強大之處。有興趣的同學可以進去看看接口中聲明的方法。這里不做過多的解讀。
06創建包service,創建EmpService。
@Service
@Transactional
public class EmpService {
@Autowired
private EmpDao empDao;
public Emp saveEmp(Emp emp){
Emp emp1 = empDao.save(emp);
return emp1;
}
public boolean deleteById(Integer id){
try{
empDao.deleteById(id);
return true;
}catch (Exception e){
return false;
}
}
public Emp updateEmp(Emp emp){
Emp emp1 = empDao.saveAndFlush(emp);
return emp1;
}
public Emp findEmpById(Integer id){
Emp emp = empDao.getOne(id);
return emp;
}
public List<Emp> getEmps(){
return empDao.findAll();
}
public Page<Emp> getEmpByPage(Integer pageNum,Integer pageSize){
PageRequest pageable=PageRequest.of(pageNum-1,pageSize);
Page<Emp> page = empDao.findAll(pageable);
return page;
}
}
07創建包controller,創建EmpController處理器。
@RestController
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
@PostMapping("/save")
public Emp saveEmp(Emp emp){
Emp emp1 = empService.saveEmp(emp);
return emp1;
}
@DeleteMapping("/delete/{id}")
public boolean deleteEmp(@PathVariable("id") Integer id){
return empService.deleteById(id);
}
@PutMapping("/update")
public Emp updateEmp(Emp emp){
Emp emp1 = empService.updateEmp(emp);
return emp1;
}
@GetMapping("/{id}")
public Emp getEmpById(@PathVariable("id") Integer id){
return empService.findEmpById(id);
}
@GetMapping("/list")
public List<Emp> getEmpList(){
return empService.getEmps();
}
@GetMapping("/page")
public Map<String,Object> getEmpByPage(@RequestParam("pageNum") Integer pageNum, @RequestParam(value = "pageSize",defaultValue = "2") Integer pageSize){
Page<Emp> page= empService.getEmpByPage(pageNum,pageSize);
Map<String,Object> map=new HashMap<>();
map.put("總頁數",page.getTotalPages());
map.put("查詢本頁記錄",page.getContent());
map.put("當前頁號",page.getNumber()+1);
map.put("頁面大小",page.getSize());
map.put("總記錄數",page.getTotalElements());
map.put("當前頁記錄數",page.getNumberOfElements());
return map;
}
}
代碼解釋:這里所有的測試,都返回json到前臺。對于分頁查詢,一般返回page就可以了。這里為了解釋清楚,專門把數據取出來封裝到map中。
08在postman中進行測試,結果如下:
A)添加操作
B)修改操作,將關羽的名字改成關云長
C)刪除操作,刪除id=11的記錄。
D)查詢操作,查找id為1的記錄
E)分頁查詢
以上就是spring data jpa的基本用法,但是對于查詢我們不僅僅是編號、分頁查詢。有時候需要根據多個條件進行查詢,請繼續關注峰哥后續文章,我會繼續講解這些問題。
總結
以上是生活随笔為你收集整理的springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .so 依赖目录 cmake_cmake
- 下一篇: ieee期刊_IEEE期刊的双栏排版中的