溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot+MySQL+Jpa如何實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁

發(fā)布時間:2021-05-27 11:50:43 來源:億速云 閱讀:274 作者:小新 欄目:編程語言

小編給大家分享一下SpringBoot+MySQL+Jpa如何實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、 使用Springboot+Jpa實現(xiàn)對mysql數(shù)據(jù)庫的增刪改查和分頁功能

JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運行期的實體對象持久化到數(shù)據(jù)庫中。

使用Springboot和jpa對數(shù)據(jù)庫進(jìn)行操作時,能夠大大減少我們的工作量,在jpa中,已經(jīng)在底層封裝好了增刪查的功能和sql語句,可以使我們進(jìn)行快速開發(fā)

二、項目過程和配置文件

1、applaction.properties文件配置

#數(shù)據(jù)源配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
#注意  test是你要連接的數(shù)據(jù)庫的名字 見下圖
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.initialSize=20
spring.datasource.minIdle=50
spring.datasource.maxActive=500

#上下文配置
server.port=8888
server.servlet.context-path=/kude

#配置jpa
#幫我們自動生成表結(jié)構(gòu)
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

SpringBoot+MySQL+Jpa如何實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁

2、pom.xml文件配置

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.4.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>kudesoft</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>kudesoft</name>
<description>Demo project for Spring Boot</description>

<properties>
  <java.version>1.8</java.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>

  <!-- druid數(shù)據(jù)庫連接池-->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
  </dependency>
	<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter  實現(xiàn)分頁功能的插件-->
  <dependency>
    <groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>1.2.10</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

3、項目結(jié)構(gòu)

SpringBoot+MySQL+Jpa如何實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁

4、實體類Student

package com.example.kudesoft.entity;

import javax.persistence.*;

/**
 * Student實體類
 * @Entity  表示該類是一個實體類
 * @Table(name = "student") 表示該類對應(yīng)數(shù)據(jù)庫中的student表
 * @Id  表明該屬性是一個主鍵
 * @GeneratedValue(strategy = GenerationType.IDENTITY) 表示該主鍵自增
 */
@Entity
@Table(name = "student")
public class Student {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
  private String sname;
  private String spassword;

  public Student() {
  }

  @Override
  public String toString() {
    return "Student{" +
        "id=" + id +
        ", sname='" + sname + '\'' +
        ", spassword='" + spassword + '\'' +
        '}';
  }

  public Integer getId() {
    return id;
  }

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

  public String getSname() {
    return sname;
  }

  public void setSname(String sname) {
    this.sname = sname;
  }

  public String getSpassword() {
    return spassword;
  }

  public void setSpassword(String spassword) {
    this.spassword = spassword;
  }
}

5、DAO層

package com.example.kudesoft.dao;

import com.example.kudesoft.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface StudentDAO extends JpaRepository<Student,Integer> {

  //根據(jù)id查
  Student findStudentById(Integer id);
  //根據(jù)名字查詢
  @Query(name = "findStudentBySname",nativeQuery = true,
      value = "select * from student where sname=:sname")
  List<Student> findStudentBySname(@Param("sname") String sname);

  //登錄功能
  Student findStudentBySnameAndSpassword(@Param("sname") String sname,@Param("spassword") String spassword);
}

在jpa中封裝有查詢功能、添加功能、刪除功能,但是沒有修改功能以及一些特定的查詢功能,所以在編程過程中,我們需要根據(jù)需求來增加一些功能函數(shù)。如果要是根據(jù)id來進(jìn)行查詢或其他操作時,數(shù)據(jù)庫中的主鍵id 一定要設(shè)為id,不要設(shè)置為sid、uid等其他的主鍵名。

6、Service層

package com.example.kudesoft.service;

import com.example.kudesoft.entity.Student;
import org.springframework.data.domain.Page;

import java.util.List;

public interface StudentService {

  //查詢所有
  List<Student> findAll();

  //根據(jù)id查詢單個
  Student findStudentById(Integer id);

  //根據(jù)name查詢
  List<Student> findStudentByName(String sname);

  //登錄
  Student findStudentByNameAndPassword(String sname,String spassword);

  //添加一個
  Student save(Student student);

  //刪除一個
  void deleteStudentById(Integer id);

  //修改
  Student update(Student student);

  //分頁
  Page<Student> findAll(int page, int pageSize);
}

在編寫分頁功能時,一定要注意Page所在的包是import org.springframework.data.domain.Page,不是其他的包,如果包導(dǎo)錯了,就會出現(xiàn)錯誤。

7、ServiceImpl

package com.example.kudesoft.service;

import com.example.kudesoft.dao.StudentDAO;
import com.example.kudesoft.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
/**
*Service 實現(xiàn)
*/

@Service
public class StudentServiceImpl implements StudentService {

  @Autowired
  private StudentDAO studentDAO;

  /**
   * 查詢所有
   * @return
   */
  @Override
  public List<Student> findAll() {
    return studentDAO.findAll();
  }

  /**
   * 根據(jù)id查詢
   * @param id
   * @return
   */
  @Override
  public Student findStudentById(Integer id) {
    return studentDAO.findStudentById(id);
  }

  /**
   * 根據(jù)名字查詢
   * @param sname
   * @return
   */
  @Override
  public List<Student> findStudentByName(String sname) {
    return studentDAO.findStudentBySname(sname);
  }

  /**
   *
   * 查詢name和password進(jìn)行登錄
   * @param sname
   * @param spassword
   * @return
   */
  @Override
  public Student findStudentByNameAndPassword(String sname, String spassword) {
    return studentDAO.findStudentBySnameAndSpassword(sname,spassword);
  }

  /**
   * 添加信息
   * @param student
   * @return
   */
  @Override
  public Student save(Student student) {
    return studentDAO.save(student);
  }

  /**
   * 根據(jù)id來刪除
   * @param id
   */
  @Override
  public void deleteStudentById(Integer id) {

    studentDAO.deleteById(id);
  }

  /**
   * 修改
   * @param student
   * @return
   */
  @Override
  public Student update(Student student) {
    return studentDAO.save(student);
  }

  /**
   * 分頁操作
   * @param page
   * @param pageSize
   * @return
   */
  @Override
  public Page<Student> findAll(int page, int pageSize) {
    Pageable pageable = PageRequest.of(page,pageSize);
    return (Page<Student>) studentDAO.findAll(pageable);
  }
}

在進(jìn)行分頁操作的時候,由于Jpa中封裝有很多的findAll()函數(shù),所以一定要看清楚要用哪一個findAll()函數(shù),如上代碼片:查詢所有的studentDAO.findAll()和分頁的studentDAO.findAll()函數(shù)一樣,但是內(nèi)部參數(shù)不一樣,所以就會產(chǎn)生不一樣的結(jié)果。

8、Controller層

package com.example.kudesoft.controller;

import com.example.kudesoft.entity.Student;
import com.example.kudesoft.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 *控制層
 * @Autowired 用于類中的屬性注入
 * @RestController注解底層包括了@ResponseBody和@Controller兩個注解
 * @ResponseBody 將數(shù)據(jù)以json格式返回
 * @RequestMapping("/XXXX") 請求路徑
 * @GetMapping("/xxxx") Get請求
 * @PostMapping("/XXX") Post請求
 */
@RestController
@RequestMapping("/student")
public class StudentController {


  @Autowired
  private StudentService studentService;

  /**
   * 查詢所有
   * @return
   */
  @GetMapping("/findAll")
  public List<Student> findAll(){

    return studentService.findAll();
  }

  /**
   * 根據(jù)id查詢
   * @param id
   * @return
   */
  @GetMapping("/findById")
  public Student fingById(Integer id){
    return studentService.findStudentById(id);
  }


  /**
   * 根據(jù)名字查詢
   * @param name
   * @return
   */
  @GetMapping("/findByName")
  public List<Student> findByName(String name){
    return studentService.findStudentByName(name);
  }


  /**
   * 登錄功能
   * @param sname
   * @param spassword
   * @return
   */
  @PostMapping("/login")
  public Student login(String sname,String spassword){
    return studentService.findStudentByNameAndPassword(sname,spassword);
  }

  /**
   * 添加信息
   * @param student
   * @return
   */
  @PostMapping("/add")
  public Student save(Student student){
    return studentService.save(student);
  }

  /**
   * 刪除信息
   * @param id
   * 使用 RESTful規(guī)范
   */

  @GetMapping("/delete/{id}")
  public String deleteById(@PathVariable Integer id){

    studentService.deleteStudentById(id);
    return "<h3>刪除成功</h3>";
  }

  /**
   * 更新信息
   * @param student
   * @return
   */
  @PostMapping("/update")
  public Student update(Student student){

    return studentService.update(student);
  }

/**
*分頁操作
*
*/
  @GetMapping("/query")
  public Page<Student> findByPage(Integer page, HttpServletResponse httpServletResponse){
    httpServletResponse.setHeader("Access-Control-Allow-Origin","*");

    if (page==null || page<=0){
      page = 0;
    }else {
      page = page-1;
    }
    return studentService.findAll(page,5);
  }
}

在controller層中,我們對于各個功能的實現(xiàn)一定要明白使用Get方式還是Post方式進(jìn)行操作,否則就會出現(xiàn)服務(wù)器內(nèi)部錯誤等等。

三、注意

在項目的各個功能實現(xiàn)過程中,由于其中含有很多的同名方法和jar包,所以我們在編程過程中一定要注意用對jar包,不要因為導(dǎo)錯jar包而給我們增加工作量

看完了這篇文章,相信你對“SpringBoot+MySQL+Jpa如何實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI