SpringDataJPA介紹
Spring Data JPA是更大的Spring Data系列的一部分,可以輕鬆實現基於JPA的存儲庫。此模塊處理對基於JPA的數據訪問層的增強支持。它使構建使用數據訪問技術的Spring驅動應用程序變得更加容易。
在相當長的一段時間內,實現應用程序的數據訪問層一直很麻煩。必須編寫太多樣板代碼來執行簡單查詢以及執行分頁和審計。Spring Data JPA旨在通過減少實際需要的工作量來顯着改善數據訪問層的實現。作爲開發人員,您編寫存儲庫接口,包括自定義查找器方法,Spring將自動提供實現。
特徵
-
基於Spring和JPA構建存儲庫的複雜支持
-
支持Querydsl謂詞,從而支持類型安全的JPA查詢
-
透明審覈域類
-
分頁支持,動態查詢執行,集成自定義數據訪問代碼的能力
-
@Query在引導時驗證帶註釋的查詢
-
支持基於XML的實體映射
-
基於JavaConfig的存儲庫配置介紹@EnableJpaRepositories。
yml配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/jpademo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
jpa:
# 使用什麼類型數據庫
database: mysql
show-sql: true
hibernate:
ddl-auto: update #執行DDL語句時,是創建create,創建刪除create-drop,更新update
naming:
#這個是默認寫法,以屬性名命名數據庫列名
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Entity(實體類)
package com.zhaolei.springdatajpa.pojo;
import lombok.Data;
import javax.persistence.*;
/**
* @author 15579
* 2019/6/3 14:09
* 文件說明:Student實體類
*/
@Data
@Table
@Entity //數據庫沒有此實體類對應的表就會自動生成
public class Student {
@Id
//自動增長
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String name;
@Column
private String sex;
}
Dao層
package com.zhaolei.springdatajpa.dao;
import com.zhaolei.springdatajpa.pojo.Student;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author 15579
* 2019/6/3 14:21
* 文件說明:StudentDao層
*/
@Repository
public interface StudentDao extends JpaRepository<Student,Integer>, JpaSpecificationExecutor<Student>{
//nativeQuery =true 表示這是原生SQL
@Query(value = "SELECT * from student where `name` like concat('%',?,'%')",nativeQuery = true)
Page<Student> findLikeNameByPage(String name, Pageable pageable);
}
Service層
package com.zhaolei.springdatajpa.Service;
import com.zhaolei.springdatajpa.pojo.Student;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* @author 15579
* 2019/6/3 14:23
* 文件說明:StudentService層
*/
public interface StudentService {
/**
* 查詢所有學生信息
* @return
*/
List<Student> findAll();
/**
* 新增學生信息
* @param student
* @return
*/
Student save(Student student);
/**
* 修改
* @param student
* @return
*/
Student update(Student student);
/**
* 刪除學生
* @param id
*/
void deleteStu(Integer id);
/**
* 分頁查詢
* @param pageNum
* @param pageSize
* @return
*/
Page<Student> findByPage(Integer pageNum,Integer pageSize,Student student);
/**
* 根據編號查詢
* @param id
* @return
*/
Student findStudentById(Integer id);
}
impl (實現類)
package com.zhaolei.springdatajpa.Service.impl;
import com.sun.deploy.util.StringUtils;
import com.zhaolei.springdatajpa.Service.StudentService;
import com.zhaolei.springdatajpa.dao.StudentDao;
import com.zhaolei.springdatajpa.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author 15579
* 2019/6/3 14:26
* 文件說明:
*/
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
/**
* 查詢所有學生信息
*
* @return
*/
@Override
public List<Student> findAll() {
return studentDao.findAll();
}
/**
* 新增學生信息
*
* @param student
* @return
*/
@Override
public Student save(Student student) {
return studentDao.save(student);
}
/**
* 修改
*
* @param student
* @return
*/
@Override
public Student update(Student student) {
return studentDao.save(student);
}
/**
* 刪除學生
*
* @param id
*/
@Override
public void deleteStu(Integer id) {
studentDao.deleteById(id);
}
/**
* 分頁查詢
*
* @param pageNum
* @param pageSize
* @return
*/
@Override
public Page<Student> findByPage(Integer pageNum, Integer pageSize,Student student) {
if(pageNum==null||pageNum==0){
pageNum=1;
}
if(pageSize==null||pageSize==0){
pageSize=2;
}
// 第一種方式模糊查詢並且分頁
// ExampleMatcher matcher = ExampleMatcher.matching()
// .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.startsWith())//模糊查詢匹配開頭,即{username}%
// .withIgnorePaths("sex")
// .withIgnorePaths("id");
// Example<Student> example = Example.of(student, matcher);
PageRequest of=PageRequest.of(pageNum-1,pageSize);
//第一種方式
// Page<Student> page=studentDao.findAll(example,of);
//第二種方式模糊查詢並且分頁
Page<Student> page=studentDao.findLikeNameByPage(student.getName()==null?"":student.getName(),of);
return page;
}
/**
* 根據編號查詢
*
* @param id
* @return
*/
@Override
public Student findStudentById(Integer id) {
return studentDao.findById(id).get();
}
}
Controller (控制層)
package com.zhaolei.springdatajpa.Controller;
import com.zhaolei.springdatajpa.Service.StudentService;
import com.zhaolei.springdatajpa.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
/**
* @author 15579
* 2019/6/3 14:28
* 文件說明:Student控制層
*/
@Controller
public class StuController {
@Autowired
private StudentService studentService;
//根據條件分頁查詢
@GetMapping("/findByPage")
public String findByPage(Integer pageNum,Integer pageSize,Student student,Model model){
if(pageNum==null||pageNum<=0){
pageNum=1;
}
Page<Student> page = studentService.findByPage(pageNum, pageSize,student);
model.addAttribute("likeName",student.getName());
model.addAttribute("page",page);
return "index";
}
//根據ID刪除學生
@RequestMapping("/deleteStu/{id}")
public String delteStu(@PathVariable("id") Integer id){
studentService.deleteStu(id);
return "redirect:/findByPage";
}
//修改學生信息
@PutMapping("/updateStu")
public String updateStu(Student student){
studentService.update(student);
return "redirect:/findByPage";
}
//新增學生信息
@PostMapping("/addStu")
public String addStu(Student student){
studentService.save(student);
return "redirect:/findByPage";
}
//跳轉至編輯頁面
@GetMapping("/gotoEdit")
public String gotoEdit(Integer id,Model model){
if(id!=null){
//根據ID查詢學生信息並顯示在頁面
Student student = studentService.findStudentById(id);
model.addAttribute("stu",student);
}
return "edit";
}
}
頁面(index.html首頁)
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="javascript:void (0)" th:href="@{/gotoEdit}">新增學生</a>
<form id="pageFrm" th:action="@{/findByPage}" method="get">
<table>
<tr>
<td>姓名:
<input type="text" name="name" th:value="${likeName==null}?'':${likeName}">
</td>
<td>
<input type="hidden" id="pageNum" name="pageNum" >
</td>
</tr>
<tr>
<td>
<input type="submit" value="搜索">
</td>
</tr>
</table>
</form>
<table border="1">
<tr>
<td>編號</td>
<td>姓名</td>
<td>性別</td>
<td>操作</td>
</tr>
<tr th:each="stu:${page?.content}">
<td th:text="${stu.id}"></td>
<td th:text="${stu.name}">姓名</td>
<td th:text="${stu.sex}">性別</td>
<td>
<a href="javascript:void (0)" th:href="@{/deleteStu/}+${stu.id}">刪除</a>
<a href="javascript:void (0)" th:href="@{/gotoEdit(id=${stu.id})}">修改</a>
</td>
</tr>
</table>
<a href="javascript:void (0)" onclick="clickFrm('1')">首頁</a>
<a href="javascript:void (0)" th:onclick="'javascript:clickFrm('+(${page?.number})+');'">上一頁</a>
<a href="javascript:void (0)" th:onclick="'javascript:clickFrm('+(${page?.number}+1+1)+');'">下一頁</a>
<a href="javascript:void (0)" th:onclick="'javascript:clickFrm('+(${page?.totalPages})+');'">尾頁</a>
當前第[[${page?.number+1}]]頁/共[[${page?.totalPages}]]頁
</body>
<script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.js"></script>
<script>
function clickFrm(pageNum) {
//末頁判斷
if(pageNum>[[${page?.totalPages}]]){
pageNum=[[${page?.totalPages}]];
}
$("#pageNum").val(pageNum);
$("#pageFrm").submit();
}
</script>
</html>
編輯頁edit.html(新增/修改)
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>編輯頁</title>
</head>
<body>
<form th:action="${stu==null}?@{/addStu}:@{/updateStu}" th:method="${stu==null}?post:put">
<table>
<td>
<input type="hidden" name="id" th:value="${stu?.id}">
</td>
<td>
姓名<input type="text" name="name" th:value="${stu?.name}">
</td>
<td>
性別<input type="text" name="sex" th:value="${stu?.sex}">
</td>
<td>
<input type="submit" value="提交">
</td>
</table>
</form>
</body>
</html>