使用SpringDataJPA+Thymeleaf完成基本的CRUD+模糊查詢加分頁

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>
發佈了26 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章